Telemetrie: senzor na kartě¶
Po této stránce zařízení čte teplotu a vlhkost ze SHT31 a karta ukáže jejich buňky i vlastní veličinu, rosný bod.
Co budete potřebovat¶
- modul SHT31 (I2C, adresa 0x44 nebo 0x45);
- vodiče: SDA, SCL, 3,3 V, GND;
- v
platformio.ini:
Warning
Senzor připojujte při vypnutém napájení desky.
Kód¶
#include <Arduino.h>
#include <Wire.h>
#include <SHT31.h>
#include <iDryer.h>
static const iDryer::Config CFG = {
.deviceType = iDryer::DeviceType::Unknown,
.unitsCount = 1,
.hasAirTemp = true, // buňka teploty
.hasAirHumidity = true, // buňka vlhkosti
.hardwareVersion = "1.0",
.firmwareVersion = "0.1.0",
.model = "Climate Sensor",
};
static iDryer::Link s_link(CFG);
static SHT31 s_sht(0x44, &Wire); // adresa 0x44 nebo 0x45 podle propojky modulu
// Rosný bod podle Magnusova vzorce: příklad vlastní veličiny.
static float dewPointC(float t, float rh) {
const float g = logf(rh / 100.0f) + 17.62f * t / (243.12f + t);
return 243.12f * g / (17.62f - g);
}
static void readSensor() {
if (s_sht.read()) {
s_link.telemetry.airTempC[0] = s_sht.getTemperature();
s_link.telemetry.airHumidityPct[0] = s_sht.getHumidity();
} else {
// Žádná data = NAN: pole se neodešle, karta ukáže „—“.
s_link.telemetry.airTempC[0] = NAN;
s_link.telemetry.airHumidityPct[0] = NAN;
}
}
void setup() {
Wire.begin(8, 9); // SDA, SCL: piny vaší desky
s_sht.begin();
s_link.begin();
s_link.onCommand("revoke", [](JsonObjectConst) { s_link.handleRevoke(); });
s_link.onTelemetryPublish([](JsonObject root) {
const float t = s_link.telemetry.airTempC[0];
const float rh = s_link.telemetry.airHumidityPct[0];
if (!isnan(t) && !isnan(rh)) root["units"][0]["dewPointC"] = dewPointC(t, rh);
});
s_link.card().sensor("dew_point", "Dew point", "°C", "units[0].dewPointC", "temperature");
s_link.every(2000, readSensor); // čtení každé 2 s
}
void loop() {
s_link.loop();
}
Jak to funguje¶
hasAirTempahasAirHumidityvConfigdávají na kartě buňky teploty a vlhkosti. Kód na portálu není potřeba.- Pole
s_link.telemetry.*jádro publikuje samo: každých 30 s, dokud pracuje aspoň jedna jednotka, jinak každých 60 s. Periody mění poleConfig.telemetryPeriodMsatelemetryPeriodIdleMs; nula znamená hodnotu z kontraktu. NANznamená žádná data: pole se nepublikuje. Nedosazujte nulu, jinak graf ukáže falešný propad.- Vlastní veličina:
onTelemetryPublishpřidá pole do telemetrie před publikací,card().sensor(id, label, unit, path, deviceClass)ho deklaruje na kartě.pathje cesta v telemetrii;deviceClassje nepovinný a určuje ikonu a formát. s_link.every(ms, fn)volá funkci zloop()se zadanou periodou a neblokuje spojení.
Kontrola¶
Do minuty po nahrání ukáže karta teplotu, vlhkost a rosný bod. Bez senzoru zůstanou buňky prázdné a zařízení pracuje dál.