コンテンツにスキップ

センサーを追加する

使用する場合

デバイスが物理センサー(温度、湿度、重さなど)を定期的に読み取り、クラウドまたはLANクライアントに読み値を発行する必要がある場合は、このレシピを使用します。

すぐに使えるコード

プロジェクトにコピーして、MyClimateを自分のクラス名に置き換えます:

// MyClimate.h — product sensor driver
#pragma once
#include <stdint.h>

class MyClimate {
public:
    bool  begin();
    void  tick(uint32_t nowMs);  // non-blocking, no delay()
    float temperature() const;
    float humidity()    const;
    bool  ok()          const;
};
// main.cpp
#include <iDryer.h>
#include "MyClimate.h"

static const iDryer::Config CFG = {
    .deviceType        = iDryer::DeviceType::StorageLink,
    .unitsCount        = 1,
    .hasAirTemp        = true,
    .hasAirHumidity    = true,
    .telemetryPeriodMs = 10000,
    .hardwareVersion   = "1.0",
    .firmwareVersion   = "1.0.0",
};

static iDryer::Link  s_link(CFG);
static MyClimate     s_climate;
static bool          s_sensorOk = false;

void setup() {
    s_sensorOk = s_climate.begin();
    s_link.begin();
}

void loop() {
    s_link.loop();

    if (s_sensorOk) {
        s_climate.tick(millis());
        if (s_climate.ok()) {
            s_link.telemetry.airTempC[0]       = s_climate.temperature();
            s_link.telemetry.airHumidityPct[0] = s_climate.humidity();
        }
    }
    // Publishing is automatic, on the telemetryPeriodMs timer from Config.
}

説明

プロダクトは loop() 内で s_link.telemetry.* フィールドのみを埋めます。ファサードは Config.telemetryPeriodMs ミリ秒ごとに自動的にMQTTとLocal WSに発行します。手動MQTT発行と異なり、publishTelemetryNow() を手動で呼ぶ必要はありません。これが手動MQTTとの重要な違いです:StaticJsonDocumentpublishTelemetry も個別のパブリッシャークラスも不要です。

タイマー外で読み値を即座に発行する必要がある場合は、s_link.publishTelemetryNow() を呼びます。

ConfighasAirTemp / hasAirHumidity フラグは、JSONにどのフィールドが表示されるかを制御します。フラグが false のフィールドは発行されません。

テレメトリフィールドの完全なリスト:テレメトリフィールド

リポジトリ内の完全な例

リファレンス実装:Sht31ClimateSensor + iDryer-Storage/src/main.cpps_link.telemetry.airTempC[0] / s_link.telemetry.airHumidityPct[0] の埋め込み。