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.

التوقّع — متوسّط متحرّك، لا تعلّم آلة

توقّع النفاد لا يحتاج نموذجًا في السحابة. نعِّم معدّل الاستهلاك بمتوسّط متحرّك أسّيّ (كي لا يُفزع سيفونٌ واحد التوقّع)، ثمّ اقسم المستوى المتبقّي عليه. كشف التسرّب هو الرقم نفسه مع عتبة: إن اختفى الماء أسرع بكثير من معدّل بيتك والمضخّة مطفأة — فشيءٌ ما يسرّب.

// --- 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

اضبط العتبات الليلة — الخزّان ينتظر حتّى نهاية الأسبوع.