RisalDash RisalDash

مشروع · جودة الماء · أتمتة

جودة ماء تتصرّف بناءً على القراءة

حوض السمك وخزّان الزراعة المائيّة والبئر تسأل السؤال نفسه: هل ما زال هذا الماء جيّدًا؟ تجيب أربعة مجسّات — pH وTDS والعكارة والحرارة — لكنّ الأرقام الخام تكذب دون تعويض الحرارة، ومراقبٌ يعرض المشكلة فقط نصفُ بناء. هذا المشروع يمنح الماء حكم Good / Fair / Poor ويشغّل مضخّة الماء العذب تلقائيًّا عند التجاوز.

مشروعجودة الماءpHTDSESP32
مشروع جودة الماء بـ ESP32: pH وTDS والعكارة وDS18B20 والمضخّة التلقائيّة

المجسّات

المجسّيقيسالواجهةانتبه
مجسّ pH + لوحةالحموضة 0–14تناظريّعايِر بمحاليل 4.0 / 6.86
مقياس TDSالأملاح الذائبة (ppm)تناظريّينحرف ~2٪/°م — عوِّض!
العكارةالتعكّر (NTU)تناظريّأبقِ العدسات نظيفة
DS18B20حرارة الماء1-Wireالنسخة الفولاذيّة المقاومة للماء

يُوصَّل DS18B20 عبر 1-Wire مع مقاومة رفع 4.7k؛ والمجسّات التناظريّة الثلاثة على أطراف ADC (على ESP32 استخدم ADC1، أي GPIO32–39 — إذ يتعطّل ADC2 مع Wi-Fi):

DS18B20 موصّل بـ ESP32 مع مقاومة رفع 4.7k على خطّ البيانات
DS18B20 على 1-Wire — البيانات تحتاج رفع 4.7k. مبنيّ في BoardLab.

الجزء الذي يتخطّاه الجميع: تعويض الحرارة

الموصليّة ترتفع مع الحرارة، فمجسّ TDS في ماء 30 °م يقرأ ~10٪ أعلى من الماء نفسه عند 25 °م. هذا هو الفرق بين «كلّ شيء جيّد» وإنذار كاذب. سطر واحد يصلحه — واللوحة تعرض الخام والمعوَّض جنبًا إلى جنب لتراه يعمل:

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

اضبط العتبات على الوهميّات اليوم — وعايِر المجسّات الحقيقيّة يوم وصولها.