مشروع · ماء · مراقبة
خزّان ماء يتوقّع نفاده بنفسه
أن تعرف أنّ الخزّان عند 62٪ شيء لطيف. أمّا أن تعرف أنّه سيفرغ خلال 14 ساعة — وأنّ الاستهلاك الزائد المفاجئ يشبه أنبوبًا انفجر — فهذا ما ينقذك فعلًا. حسّاس فوق صوتيّ مقاوم للماء مع ESP32 يعطيك المستوى والحجم وتوقّع النفاد وتنبيه التسرّب وتحكّمًا تلقائيًّا بالمضخّة، على لوحة يقدّمها الشريحة بنفسها.
القياس — نبضة واحدة من الغطاء
يُركَّب JSN-SR04T (نسخة HC-SR04 المقاومة للماء) داخل غطاء الخزّان ويرسل نبضة نحو
سطح الماء. الصدى يعطي الفجوة الهوائيّة؛ والمستوى يُحسب من ارتفاع الخزّان:
levelPct = 100 · (1 − gapCm / TANK_CM)، واللترات من السعة. التوصيل هو توصيل فوق الصوتيّ
القياسيّ — تغذية 5 فولت ومقسّم على ECHO لطرف 3.3 فولت:
التوقّع — متوسّط متحرّك، لا تعلّم آلة
توقّع النفاد لا يحتاج نموذجًا في السحابة. نعِّم معدّل الاستهلاك بمتوسّط متحرّك أسّيّ (كي لا يُفزع سيفونٌ واحد التوقّع)، ثمّ اقسم المستوى المتبقّي عليه. كشف التسرّب هو الرقم نفسه مع عتبة: إن اختفى الماء أسرع بكثير من معدّل بيتك والمضخّة مطفأة — فشيءٌ ما يسرّب.
// --- 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; اللوحة
شريط المستوى، الحجم، إحصاءة «Empty in»، رسم الاتجاه، صفحة الحسّاس الخام، ليد التسرّب ومفتاح المضخّة — تُعلَن في عشرات الأسطر؛ و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() الحقيقيّ — أسلوب الحسّاسات الوهميّة.
قائمة المكوّنات
| القطعة | الدور | ~التكلفة |
|---|---|---|
| ESP32 / ESP8266 | الدماغ + Wi-Fi + اللوحة | $3–5 |
| JSN-SR04T | قياس مستوى مقاوم للماء | $3–4 |
| وحدة مرحّل | تحكّم المضخّة | $1–2 |
| مزوّد 5 V | الطاقة | $2–3 |
اضبط العتبات الليلة — الخزّان ينتظر حتّى نهاية الأسبوع.