ESPlan/SW/ESPlan_ZTS3000_WindSensor/snr.cpp

86 lines
3.2 KiB
C++
Executable File
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

/*
* 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] +--------------------------+"));
}