Плата поднимает страницу + JSON API (/api/state, /api/command) на порту 80
для наблюдения и управления актуаторами независимо от MQTT/Laravel.
Команда с веб-UI публикует тот же ack в devices/{id}/ack, что и MQTT-команда,
поэтому device shadow платформы не расходится с реальным состоянием.
Включается/выключается флагом ENABLE_WEB_UI в config.h.
В README добавлены ASCII-схема подключения DHT22/реле и раздел про сборку
через arduino-cli (включая обходной путь для проблемы с правами на
~/Documents/Arduino на macOS).
60 lines
1.5 KiB
C++
60 lines
1.5 KiB
C++
#include "telemetry.h"
|
|
|
|
#include <DHT.h>
|
|
|
|
#include "config.h"
|
|
#include "mqtt_link.h"
|
|
#include "time_sync.h"
|
|
|
|
static DHT dht(PIN_DHT22, DHT22);
|
|
static unsigned long lastPublish = 0;
|
|
|
|
static bool hasReading = false;
|
|
static float lastTemperature = 0;
|
|
static float lastHumidity = 0;
|
|
|
|
void telemetryBegin() {
|
|
dht.begin();
|
|
}
|
|
|
|
void telemetryTick() {
|
|
unsigned long now = millis();
|
|
if (now - lastPublish < TELEMETRY_INTERVAL_MS && lastPublish != 0) {
|
|
return;
|
|
}
|
|
// Без синхронизированного времени ingest-service отклонит timestamp
|
|
// (или он будет ложным), поэтому просто пропускаем цикл и ждём.
|
|
if (!timeSyncIsReady()) {
|
|
return;
|
|
}
|
|
lastPublish = now;
|
|
|
|
float humidity = dht.readHumidity();
|
|
float temperature = dht.readTemperature();
|
|
if (isnan(humidity) || isnan(temperature)) {
|
|
Serial.println("[telemetry] DHT22 read failed, skipping this cycle");
|
|
return;
|
|
}
|
|
|
|
lastTemperature = temperature;
|
|
lastHumidity = humidity;
|
|
hasReading = true;
|
|
|
|
mqttPublishTelemetry(DEVICE_ID_SENSOR, "temperature", temperature);
|
|
mqttPublishTelemetry(DEVICE_ID_SENSOR, "humidity", humidity);
|
|
|
|
Serial.print("[telemetry] temperature=");
|
|
Serial.print(temperature);
|
|
Serial.print(" humidity=");
|
|
Serial.println(humidity);
|
|
}
|
|
|
|
bool telemetryGetLast(float& temperature, float& humidity) {
|
|
if (!hasReading) {
|
|
return false;
|
|
}
|
|
temperature = lastTemperature;
|
|
humidity = lastHumidity;
|
|
return true;
|
|
}
|