Проект · Вода · Мониторинг
Бак воды, который сам предсказывает, когда опустеет
Знать, что в баке 62 % — приятно. Знать, что он будет пуст через 14 часов, а внезапный лишний расход похож на лопнувшую трубу — вот что реально спасает. Один влагозащищённый ультразвуковой датчик плюс ESP32 дают уровень, объём, прогноз опустошения, алерт протечки и автоматический насос — на дашборде, который чип отдаёт сам.
Измерение — один пинг с крышки
JSN-SR04T (влагозащищённый HC-SR04) ставится под крышку бака и пингует поверхность
воды. Эхо даёт воздушный зазор; уровень считается от высоты бака:
levelPct = 100 · (1 − gapCm / TANK_CM), литры — от ёмкости. Подключение — стандартный
ультразвук: питание 5 В, делитель на ECHO для 3.3 В пина:
Прогноз — 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 |
Настройте пороги сегодня — бак подождёт до выходных.