mirror of https://github.com/LaskaKit/ESPlan.git
86 lines
3.2 KiB
C++
Executable File
86 lines
3.2 KiB
C++
Executable File
/*
|
||
* snr.cpp – Detekce a cteni snimace ZTS-3000-FSJT-N01
|
||
*
|
||
* Snimac ma 2 registry pristupne pres FC03:
|
||
* reg 0x0000 = rychlost vetru x10 (m/s)
|
||
* reg 0x0001 = sila vetru (Beaufort 0-17)
|
||
*
|
||
* Detekce: pokud cteni 2 registru projde (CRC OK, zadna exception),
|
||
* snimac povazujeme za pritomny. Bezvetri (0,0) je validni stav.
|
||
*/
|
||
|
||
#include "snr.h"
|
||
|
||
// ─── Detekce ──────────────────────────────────────────────────────────────────
|
||
void detectSensors(ModbusClient& mb, SensorData& data, const SensorConfig& cfg) {
|
||
SensorPresence& p = data.present;
|
||
uint8_t addr = cfg.modbusAddr;
|
||
|
||
p = SensorPresence(); // reset
|
||
|
||
Serial.println(F("[SNS] === Detekce ZTS-3000-FSJT-N01 ==="));
|
||
|
||
uint16_t r[REG_BLOCK_COUNT] = {0};
|
||
ModbusStatus st = mb.readRegisters(addr, REG_WIND_SPEED, REG_BLOCK_COUNT, r);
|
||
|
||
if (st != ModbusStatus::OK) {
|
||
Serial.printf("[SNS] Chyba cteni: %s\n", mb.statusStr(st));
|
||
data.commError = true;
|
||
data.errorMsg = mb.statusStr(st);
|
||
return;
|
||
}
|
||
|
||
Serial.printf("[SNS] Cteni: speed_raw=%u (=%.1f m/s) level=%u\n",
|
||
r[0], r[0] / 10.0f, r[1]);
|
||
|
||
data.commError = false;
|
||
data.errorMsg = "";
|
||
p.wind = true;
|
||
|
||
// rovnou ulozime hodnoty
|
||
data.windSpeed = r[0] / 10.0f;
|
||
data.windLevel = r[1];
|
||
data.lastUpdateMs = millis();
|
||
|
||
Serial.println(F("[SNS] === Detekce dokoncena: snimac pritomny ==="));
|
||
}
|
||
|
||
// ─── Cteni snimace ────────────────────────────────────────────────────────────
|
||
void readAllSensors(ModbusClient& mb, SensorData& data, const SensorConfig& cfg) {
|
||
uint16_t r[REG_BLOCK_COUNT] = {0};
|
||
ModbusStatus st = mb.readRegisters(cfg.modbusAddr, REG_WIND_SPEED,
|
||
REG_BLOCK_COUNT, r);
|
||
|
||
if (st != ModbusStatus::OK) {
|
||
data.commError = true;
|
||
data.errorMsg = mb.statusStr(st);
|
||
Serial.printf("[SNS] Chyba cteni: %s\n", mb.statusStr(st));
|
||
return;
|
||
}
|
||
|
||
data.commError = false;
|
||
data.errorMsg = "";
|
||
data.lastUpdateMs = millis();
|
||
|
||
// Pokud predtim selhala detekce, oznacime snimac jako pritomny
|
||
if (!data.present.wind) data.present.wind = true;
|
||
|
||
data.windSpeed = r[0] / 10.0f;
|
||
data.windLevel = r[1];
|
||
}
|
||
|
||
// ─── Vypis stavu ─────────────────────────────────────────────────────────────
|
||
void printSensorStatus(const SensorData& data) {
|
||
const SensorPresence& p = data.present;
|
||
Serial.println(F("[SNS] +--------------------------+"));
|
||
Serial.println(F("[SNS] | ZTS-3000-FSJT-N01 |"));
|
||
Serial.println(F("[SNS] +--------------------------+"));
|
||
Serial.printf ("[SNS] | Snimac pritomny: %-3s |\n", p.wind ? "ANO" : "NE");
|
||
if (p.wind) {
|
||
const BeaufortInfo& bi = beaufortInfo(data.windLevel);
|
||
Serial.printf("[SNS] | Rychlost: %5.1f m/s |\n", data.windSpeed);
|
||
Serial.printf("[SNS] | Sila: %u (%s) |\n", data.windLevel, bi.nameCz);
|
||
}
|
||
Serial.println(F("[SNS] +--------------------------+"));
|
||
}
|