RisalDash RisalDash

Проект · Вода · Мониторинг

Бак воды, который сам предсказывает, когда опустеет

Знать, что в баке 62 % — приятно. Знать, что он будет пуст через 14 часов, а внезапный лишний расход похож на лопнувшую трубу — вот что реально спасает. Один влагозащищённый ультразвуковой датчик плюс ESP32 дают уровень, объём, прогноз опустошения, алерт протечки и автоматический насос — на дашборде, который чип отдаёт сам.

ПроектВодаJSN-SR04TПрогнозESP32
Проект бака воды на ESP32: уровень, прогноз опустошения, детекция протечки и авто-насос

Измерение — один пинг с крышки

JSN-SR04T (влагозащищённый HC-SR04) ставится под крышку бака и пингует поверхность воды. Эхо даёт воздушный зазор; уровень считается от высоты бака: levelPct = 100 · (1 − gapCm / TANK_CM), литры — от ёмкости. Подключение — стандартный ультразвук: питание 5 В, делитель на ECHO для 3.3 В пина:

Ультразвуковой датчик подключён к ESP32 с делителем напряжения на ECHO
Одинаковое подключение для HC-SR04 и JSN-SR04T. Собрано в BoardLab.

Прогноз — EMA, а не машинное обучение

Прогнозу опустошения не нужна модель в облаке. Сгладьте скорость расхода экспоненциальным средним (чтобы один смытый бачок не пугал прогноз) и поделите остаток уровня на неё. Детекция протечки — то же число с порогом: если вода уходит сильно быстрее бытовой нормы при выключенном насосе — что-то течёт.

// --- the predictor: smooth the drain rate, project time-to-empty ---
float dPct = (prevPct - levelPct) * 240.0f;           // %/min at 250 ms per tick
prevPct = levelPct;
if (!pump) ratePctMin += 0.05f * (dPct - ratePctMin); // EMA — calm, not jumpy
hoursLeft = ratePctMin > 0.01f ? levelPct / ratePctMin / 60.0f : 99;

// --- leak detection: dropping much faster than the household norm, pump off ---
bool leakNow = !pump && ratePctMin > 0.9f;
if (leakNow && !leak && evlog) evlog->print("LEAK suspected - close the valve");
leak = leakNow;

// --- auto-fill: pump on below 25 %, off above 90 % ---
if (levelPct < 25) pump = true;
else if (levelPct > 90) pump = false;

Дашборд

Bar-шкала уровня, объём, стат «Empty in», график тренда, страница сырого сенсора, LED протечки и тумблер насоса — объявляются дюжиной строк; весь UI ESP отдаёт через собственную точку доступа:

dash.layout("Tank", RICON_WATER);
dash.gauge("Level", &levelPct, 0, 100, "%").variant("bar");
dash.stat("Volume", &liters, "L");
dash.stat("Empty in", &hoursLeft, "h");    // the prediction, live
dash.chart("Trend", &levelPct, "%");

dash.layout("Sensor", RICON_SIGNAL);
dash.metric("Air gap", &distCm, "cm");     // what the ultrasonic actually reads
dash.metric("Drain rate", &ratePctMin, "%/min");
dash.led("Leak suspected", &leak);
dash.toggle("Pump", &pump);
dash.beginAP("RisalDash-Tank", "12345678");

Пример из библиотеки (examples/04_Templates/TankLevel) работает без железа: бак сливается, доливается и изредка «пробивает трубу», чтобы вы увидели, как срабатывает алерт. Когда приедет датчик — замените одну строку на реальный pingCm(): это workflow фейк-сенсоров.

Список компонентов

ДетальРоль~Цена
ESP32 / ESP8266мозг + Wi-Fi + дашборд$3–5
JSN-SR04Tвлагозащищённый уровень$3–4
Релейный модульуправление насосом$1–2
БП 5 Впитание$2–3

Настройте пороги сегодня — бак подождёт до выходных.