センサー¶
このページでは、2つのセンサーを接続し、ポータルにデータを表示します。最初にSHT31(シャフトの気候)、次に温度計(加熱器の温度)。これは、管理ロジックを追加する前の「データを得た」ステップです。
コアで動作する原理は単純です:ループ内のコードはs_link.telemetry.*フィールドに新しい読み取り値を書き込み、ファサードはConfigのtelemetryPeriodMsごとにそれらを自動的にクラウドに発行します。発行を手動で呼び出す必要はありません。
テレメトリーフィールド¶
シャフト用に、3つのフィールドを使用します(インデックス[0] - 最初で唯一のカメラ):
| フィールド | 何を格納するか | Configのフラグ |
|---|---|---|
s_link.telemetry.airTempC[0] |
空気温度、°C | hasAirTemp |
s_link.telemetry.airHumidityPct[0] |
空気湿度、% | hasAirHumidity |
s_link.telemetry.heaterTempC[0] |
加熱器温度、°C | hasHeaterTemp |
これらの3つのフラグはすべて前のステップのConfigで既に含まれています。
ルール:センサーコードはloop()をブロックしてはいけません¶
ファサードidryer-coreは同じloop()でWi-FiとMQTTを提供しています。したがって、センサーを読むときはdelay()を呼び出せません。一時停止はネットワークセッションを破ります。センサーはタイマーで調査され、既成の値を読みます。エコシステムの既成ドライバーは既にそのように配置されています。
ステップ1。SHT31:シャフトの気候¶
SHT31ドライバーをゼロから書く必要はありません。既成のクラスSht31ClimateSensorは例iDryer-Storageにあります。それはrobtillaart/SHT31ライブラリを使用し、ブロッキングなしでセンサーを読みます。
-
platformio.iniのlib_depsにSHT31ライブラリを追加します: -
iDryer-Storage/src/storage/sensors/から、src/フォルダーに4つのファイルをコピーします:Sht31ClimateSensor.h、Sht31ClimateSensor.cpp、IClimateSensor.h、sensor_reading.h。 -
I2Cを通じてセンサーを接続し(接続図を参照)、
src/main.cppで読み込みます:
#include <Wire.h>
#include <iDryer.h>
#include "Sht31ClimateSensor.h"
static Sht31ClimateSensor s_climate(&Wire);
static bool s_climateOk = false;
void setup() {
Serial.begin(115200);
Wire.begin(8, 9); // SDA、SCL - ボードのピン
s_climateOk = s_climate.begin(); // 自動的にアドレス0x44または0x45を検出
s_link.begin();
}
void loop() {
s_link.loop();
if (s_climateOk) {
s_climate.tick(millis());
SensorReading r = s_climate.get();
if (r.ok) {
s_link.telemetry.airTempC[0] = r.temperature;
s_link.telemetry.airHumidityPct[0] = r.humidity;
}
}
}
構造体SensorReading(フィールドok、temperature、humidity)はsensor_reading.hで宣言されます。フラッシュ後、ポータルにシャフトの温度と湿度が表示されます。これはデバイスからの最初のフィードバックです。
ステップ2。温度計:加熱器の温度¶
ESP32用の既成の温度計クラスはないため、src/main.cppに直接書きます。温度計は分圧器を通じてADCピンに接続されています(接続図を参照):コントローラーは中点の電圧を測定し、それから温度計の抵抗を計算し、次に温度を計算します。
#include <math.h>
static const int THERM_PIN = 2; // ADCピン
static const float SERIES_R = 4700.0f; // 分圧器抵抗、オーム
static const float NOMINAL_R = 100000.0f; // 温度計の抵抗25°C、オーム
static const float NOMINAL_T = 25.0f; // °C
static const float BETA = 3950.0f; // 温度計データシートのBコエフィシェント
// 加熱器の温度(°C)を返します。
static float readHeaterTempC() {
int raw = analogRead(THERM_PIN); // ESP32上の0..4095
float v = (float)raw / 4095.0f; // フルスケールの一部
float r = SERIES_R * (1.0f - v) / v; // 温度計の抵抗、オーム
// スタインハート-ハート方程式(Bパラメーター):
float tK = 1.0f / (1.0f / (NOMINAL_T + 273.15f) + logf(r / NOMINAL_R) / BETA);
return tK - 273.15f;
}
loop()では、SHT31の読み込みの近くでテレメトリーに結果を書き込みます:
これは簡略化された読み取り - 温度計に合わせてパラメーターを調整します
定数NOMINAL_RとBETAは特定の温度計に依存します。データシートから取得してください(一般的な家庭用温度計 - Generic 3950、100 kΩ)。分圧器の式は接続図のスキームに対応しています:温度計を3.3Vへ、抵抗をGNDへ。別のルーティングの場合、式は変わります。ESP32のADCは非線形なので、正確な測定には読み取りを調整します。シリアルiDryerコントローラーでは、これは温度計テーブル(Thermistorライブラリ)を使用します。
マルチメーターでの温度計チェック - 温度計チェック。
この章の後の完全なsrc/main.cpp¶
以下は完全なファイルです。前の章に対する新しい行は// ← 章5でマークされています。残りは変わりませんでした。
#include <iDryer.h>
#include <Wire.h> // ← 章5
#include <math.h> // ← 章5
#include "Sht31ClimateSensor.h" // ← 章5
static const iDryer::Config CFG = {
.deviceType = iDryer::DeviceType::Dryer,
.unitsCount = 1,
.hasHeater = true,
.hasFan = true,
.hasAirTemp = true,
.hasAirHumidity = true,
.hasHeaterTemp = true,
.telemetryPeriodMs = 5000,
.statusPeriodMs = 10000,
.hardwareVersion = "1.0",
.firmwareVersion = "0.1.0",
.model = "DIY Storage Cabinet",
};
static iDryer::Link s_link(CFG);
// ← 章5:SHT31気候センサー
static Sht31ClimateSensor s_climate(&Wire);
static bool s_climateOk = false;
// ← 章5:加熱器温度計
static const int THERM_PIN = 2;
static const float SERIES_R = 4700.0f;
static const float NOMINAL_R = 100000.0f;
static const float NOMINAL_T = 25.0f;
static const float BETA = 3950.0f;
static float readHeaterTempC() {
int raw = analogRead(THERM_PIN);
float v = (float)raw / 4095.0f;
float r = SERIES_R * (1.0f - v) / v;
float tK = 1.0f / (1.0f / (NOMINAL_T + 273.15f) + logf(r / NOMINAL_R) / BETA);
return tK - 273.15f;
}
void setup() {
Serial.begin(115200);
Wire.begin(8, 9); // ← 章5(SDA、SCL - ボードのピン)
s_climateOk = s_climate.begin(); // ← 章5
s_link.begin();
}
void loop() {
s_link.loop();
if (s_climateOk) { // ← 章5
s_climate.tick(millis());
SensorReading r = s_climate.get();
if (r.ok) {
s_link.telemetry.airTempC[0] = r.temperature;
s_link.telemetry.airHumidityPct[0] = r.humidity;
}
}
s_link.telemetry.heaterTempC[0] = readHeaterTempC(); // ← 章5
}
結果の確認¶
このステップの後、ポータルに3つの値を表示する必要があります:
- シャフト内の空気温度;
- シャフト内の湿度;
- 加熱器の温度。
読み取り値が「浮遊」しているか明らかに間違っている場合:
- 共通グラウンドと配線を確認してください(電力線からのノイズ)。配線エラー;
- 分圧器抵抗の名目値と温度計タイプを確認してください;
- SHT31がI2Cで応答していることを確認してください(正しいアドレスと線)。
センサーが「ナンセンス」を示していることの診断 - 温度計チェックと典型的なエラー。
次のステップ¶
センサーからのデータがあります。次に、デバイス設定(目標温度、ヒステリシス)をYAMLからのメニューで説明して、ポータルと利用可能なメモリから変更できるようにします。