RisalDash RisalDash

Проект · Качество воды · Автоматизация

Качество воды, которое действует по показаниям

Аквариум, гидропонная ёмкость и колодец задают один вопрос: вода ещё в порядке? Отвечают четыре зонда — pH, TDS, мутность и температура — но сырые числа врут без температурной компенсации, а монитор, который проблему только показывает — половина сборки. Этот ставит воде вердикт Good / Fair / Poor и сам включает насос свежей воды при нарушении.

ПроектКачество водыpHTDSESP32
Проект качества воды на ESP32: pH, TDS, мутность, DS18B20 и авто-насос

Зонды

ЗондМеряетИнтерфейсНюанс
pH-зонд + платакислотность 0–14аналогкалибровка буферами 4.0 / 6.86
TDS-метрраств. вещества (ppm)аналогврёт ~2 %/°C — компенсируйте!
Мутностьвзвесь (NTU)аналогдержите оптику чистой
DS18B20температура воды1-Wireстальная влагозащищённая версия

DS18B20 подключается по 1-Wire с подтяжкой 4.7 кОм; три аналоговых зонда — на ADC-пины (на ESP32 берите ADC1, GPIO32–39 — ADC2 умирает при включённом Wi-Fi):

DS18B20 подключён к ESP32 с подтяжкой 4.7 кОм на линии данных
DS18B20 на 1-Wire — данным нужна подтяжка 4.7 к. Собрано в BoardLab.

Часть, которую все пропускают: температурная компенсация

Проводимость растёт с температурой, поэтому TDS-зонд в воде 30 °C показывает на ~10 % больше, чем в той же воде при 25 °C. Это разница между «всё нормально» и ложной тревогой. Чинится одной строкой — а дашборд показывает raw и компенсированное рядом, чтобы это было видно:

// Temperature compensation: a TDS/EC probe drifts ~2 %/°C — normalise to 25 °C.
tds = tdsRaw / (1.0f + 0.02f * (waterT - 25.0f));
ec  = tds * 2.0f;

// Quality score from all three probes (drinking-ish thresholds; tune per use).
int score = 0;
if (tds > 500 || ph < 6.5f || ph > 8.5f || turb > 50) score = 2;        // poor
else if (tds > 300 || ph < 6.8f || ph > 8.0f || turb > 25) score = 1;   // fair
if (score == 2 && quality != 2 && evlog) evlog->print("POOR water - pump + check filter");
quality = score;

// Auto-actuation: poor quality kicks the fresh-water pump in until it recovers.
if (score == 2) pump = true;
else if (score == 0) pump = false;

Дашборд

Тяжёлую работу делают пресеты — dash.sensor("tds"|"ph"|"turbidity"|"ds18b20", …) разворачиваются в нужный виджет, единицы и диапазон; бейдж выносит вердикт, тумблер управляет реле насоса:

dash.layout("Water", RICON_WATER);
dash.sensor("tds", &tds, &ec);           // TDS ppm gauge + EC metric (compensated)
dash.sensor("ph", &ph);                  // pH gauge 0..14
dash.sensor("turbidity", &turb);         // NTU gauge
dash.sensor("ds18b20", &waterT);         // water temperature
dash.badge("Quality", &quality).labels("Good", "Fair", "POOR");

dash.layout("Control", RICON_GAUGE);
dash.metric("TDS raw", &tdsRaw, "ppm");  // before compensation — see the difference
dash.led("Alert", &alarmOut);
dash.toggle("Fresh-water pump", &pump);
dash.beginAP("RisalDash-Water", "12345678");

Пример из библиотеки (examples/04_Templates/WaterQuality) работает на дрейфующих фейк-зондах — переходы Good→Fair→POOR, строка в журнале и авто-насос срабатывают без капли воды. Реальные зонды откалибруете по приезде; скетч не меняется.

Куда эта сборка встаёт

Аквариум — добавьте реле обогревателя и получится готовый AquariumController. Гидропоника — EC, важный для растворов, уже на дашборде. Колодец / цистерна — в паре с монитором бака: уровень + качество на одном чипе. Алерты уходят в MQTT / Home Assistant, а каждый зонд читается ИИ-агентом через MCP.

Настройте пороги на фейках сегодня — реальные зонды откалибруете в день доставки.