نظام ري النباتات تلقائي باستخدام حساس رطوبة التربة و ESP32


هل يمكن للنبتة أن تحصل على الماء تلقائيًا عندما تصبح التربة جافة؟ في هذا المشروع سنستخدم لوحة ESP32 وحساس رطوبة التربة لمراقبة مستوى الرطوبة، وعندما تصبح التربة جافة سيتم تشغيل مضخة الماء تلقائيًا، ثم تتوقف المضخة عند الوصول إلى مستوى الرطوبة المطلوب.

يجمع هذا المشروع بين عدة مفاهيم مهمة تعلمناها في سلسلة ESP32 من الصفر: قراءة إشارة تناظرية، اتخاذ قرار داخل البرنامج، ثم التحكم في حمل خارجي بواسطة وحدة Relay.

فيديو المشروع

فكرة المشروع

يقيس حساس رطوبة التربة حالة التربة ويرسل قيمة تناظرية إلى ESP32. تقرأ اللوحة هذه القيمة وتقارنها بمستويين محددين داخل البرنامج.

  • عندما تصبح التربة جافة وتصل القراءة إلى 3200 أو أكثر، يتم تشغيل المضخة.
  • تستمر المضخة في العمل بينما يراقب ESP32 رطوبة التربة.
  • عندما تنخفض القراءة إلى 1600 أو أقل، يتم إيقاف المضخة.

حساس الرطوبة → ESP32 → Relay → مضخة الماء

المكونات المطلوبة

المكونالعدد
لوحة ESP321
حساس رطوبة التربة1
وحدة Relay1
مضخة ماء صغيرة 5V1
مصدر تغذية 5V للمضخة1
أنبوب ماء1
Breadboardحسب الحاجة
Jumper Wiresحسب الحاجة
نبتة وخزان صغير للماء1

توصيل حساس رطوبة التربة

يتكون حساس رطوبة التربة المستخدم هنا من مجس يوضع داخل التربة ووحدة إلكترونية لمعالجة الإشارة. تحتوي الوحدة على خرج رقمي وخرج تناظري. في هذا المشروع سنستخدم الخرج التناظري AO لأننا نريد قياس تغير مستوى الرطوبة وليس الحصول على حالتين فقط.

حساس الرطوبةESP32
VCC3.3V
GNDGND
AOGPIO34

يقرأ ESP32 الإشارة التناظرية القادمة من الحساس عبر GPIO34. ومن المهم تغذية الحساس من 3.3V في هذا التركيب.

معايرة حساس رطوبة التربة

قبل تحديد متى يجب تشغيل المضخة، من الأفضل قياس القيم الفعلية التي يعطيها الحساس في التربة المستخدمة. يمكن قراءة الحساس بواسطة analogRead() وعرض النتيجة في Serial Monitor.

سجل أولًا القراءة عندما تكون التربة جافة، ثم أضف قليلًا من الماء وسجل القراءة عندما تصبح التربة رطبة. في التجربة المستخدمة لهذا المشروع كانت القراءة تقريبًا في اتجاه 800 للتربة الرطبة وتصل إلى حوالي 4000 عندما تكون التربة جافة.

مهم: هذه القيم ليست ثابتة لجميع الحساسات أو أنواع التربة، لذلك يجب معايرة الحساس بالتجربة قبل اعتماد قيم التحكم في مشروعك.

توصيل الريليه ومضخة الماء

المضخة تحتاج إلى تيار أكبر من الذي يستطيع منفذ GPIO توفيره، لذلك لا نقوم بتغذيتها مباشرة من ESP32. تستخدم لوحة ESP32 إشارة تحكم فقط لتفعيل الريليه، بينما يحصل محرك المضخة على الطاقة من مصدر 5V منفصل.

Relayالتوصيل
VCCVIN في ESP32
GNDGND في ESP32
INGPIO23

من جهة نقاط قدرة الريليه يتم توصيل مصدر 5V ودائرة المضخة عبر COM و NO. في الحالة العادية تبقى الدائرة مفتوحة والمضخة متوقفة، وعند تفعيل الريليه تغلق الدائرة وتصل التغذية إلى المضخة.

مستويات تشغيل وإيقاف المضخة

الحالةقيمة الحساسالنتيجة
التربة جافة≥ 3200تشغيل المضخة
المنطقة الوسطى1600 – 3199الاحتفاظ بالحالة الحالية
التربة رطبة≤ 1600إيقاف المضخة

استخدام مستويين مختلفين بدل عتبة واحدة مهم جدًا. القيم الواقعة بين 1600 و3200 لا تغير حالة المضخة: إذا كانت تعمل تستمر في العمل، وإذا كانت متوقفة تبقى متوقفة. هذه الطريقة تمنع التشغيل والإيقاف المتكرر بسبب تغيرات صغيرة في قراءة الحساس، وهي فكرة تعرف باسم Hysteresis.

الكود الكامل للمشروع

// Pins
const int sensorPin = 34;
const int relayPin = 23;

// Seuils d'humidité
const int dryThreshold = 3200;  // Démarrage de l'arrosage
const int wetThreshold = 1600;  // Arrêt de l'arrosage

// État de la pompe
bool pumpOn = false;

void setup() {
    Serial.begin(115200);

  pinMode(relayPin, OUTPUT);

  // Pompe arrêtée au démarrage
  digitalWrite(relayPin, HIGH);
}

void loop() {

  // Lecture du capteur d'humidité
  int moistureValue = analogRead(sensorPin);

  // Si le sol est sec et que la pompe est arrêtée
  if (moistureValue >= dryThreshold && !pumpOn) {
    digitalWrite(relayPin, LOW);
    pumpOn = true;
  }

  // Si le sol est suffisamment humide et que la pompe fonctionne
  if (moistureValue <= wetThreshold && pumpOn) {
    digitalWrite(relayPin, HIGH);
    pumpOn = false;
  }
  Serial.println(moistureValue);
   Serial.println(pumpOn);

  delay(500);
}

شرح الكود

تحديد المنافذ

حساس رطوبة التربة متصل بالمنفذ GPIO34، بينما إشارة التحكم في وحدة الريليه متصلة بالمنفذ GPIO23.

تحديد مستويي الرطوبة

نحدد قيمتين للتحكم في عملية الري: 3200 تمثل مستوى الجفاف الذي نريد عنده تشغيل المضخة، و 1600 تمثل مستوى الرطوبة الذي نريد عنده إيقافها.

معرفة حالة المضخة

نستخدم المتغير pumpOn للاحتفاظ بالحالة الحالية للمضخة. في البداية تكون قيمته false لأن المضخة متوقفة.

تهيئة الريليه داخل setup()

نحدد منفذ الريليه كمخرج. في النسخة المشروحة في الفيديو، وحدة الريليه تعمل بنظام Active Low: القيمة LOW تفعّل الريليه، بينما HIGH توقفه. لذلك نرسل HIGH عند بداية تشغيل ESP32 حتى تبقى المضخة متوقفة.

قراءة حساس الرطوبة

داخل loop() نستخدم analogRead() لقراءة القيمة التناظرية القادمة من الحساس عبر GPIO34، ثم نخزنها في متغير لاستخدامها في اتخاذ القرار.

تشغيل المضخة عندما تجف التربة

إذا كانت قراءة الحساس أكبر من أو تساوي 3200 وكانت المضخة متوقفة، يعتبر البرنامج أن التربة وصلت إلى مستوى الجفاف المحدد. عندها يتم تفعيل الريليه وتشغيل المضخة، ثم تتغير قيمة pumpOn إلى true.

إيقاف المضخة عند الوصول إلى الرطوبة المطلوبة

تستمر ESP32 في مراقبة الحساس أثناء عملية الري. عندما تصبح القراءة أقل من أو تساوي 1600 وكانت المضخة تعمل، يتم إيقاف الريليه والمضخة، ثم تعود قيمة pumpOn إلى false.

لماذا نستخدم مستويين مختلفين؟

إذا استخدمنا قيمة واحدة فقط، فقد تؤدي التغيرات الصغيرة حول تلك القيمة إلى تشغيل الريليه وإيقافه بسرعة وبشكل متكرر. استخدام حد للجفاف وحد آخر للرطوبة يضيف منطقة مستقرة بينهما ويحافظ على حالة المضخة حتى يتم الوصول إلى الحد المقابل.

مدة الانتظار بين القراءات

في نهاية كل دورة ينتظر البرنامج 500 ms قبل قراءة الحساس من جديد، ثم تتكرر عملية المراقبة تلقائيًا.

تجربة نظام الري التلقائي

  1. ضع حساس الرطوبة داخل تربة جافة.
  2. تأكد من توصيل ESP32 والريليه والحساس بشكل صحيح.
  3. ضع المضخة داخل خزان الماء ووصل الأنبوب باتجاه النبتة.
  4. شغّل ESP32.
  5. صل مصدر 5V الخاص بالمضخة.
  6. عند اكتشاف جفاف التربة يتم تفعيل الريليه وتشغيل المضخة.
  7. تستمر ESP32 في مراقبة الرطوبة أثناء الري.
  8. عندما تصل القراءة إلى مستوى الرطوبة المحدد تتوقف المضخة تلقائيًا.

مشاكل شائعة وحلولها

المضخة لا تعمل رغم جفاف التربة

تحقق أولًا من قراءة الحساس ومن قيمة حد الجفاف. تأكد أيضًا من وصول 5V إلى المضخة ومن توصيل GPIO23 بمدخل IN في الريليه.

الريليه يعمل بطريقة معكوسة

توجد وحدات Relay تعمل بنظام Active Low وأخرى قد تختلف في طريقة التفعيل. إذا كان سلوك وحدتك معاكسًا لما هو متوقع، تحقق من نوعها ومن حالة الإشارة المطلوبة لتفعيل مدخل IN، ثم عدّل HIGH وLOW في البرنامج وفقًا لذلك.

المضخة تعمل وتتوقف باستمرار

تحقق من أن البرنامج يستخدم مستويين منفصلين للتشغيل والإيقاف. كما يجب معايرة الحساس لأن القيم المناسبة قد تختلف من حساس إلى آخر ومن تربة إلى أخرى.

قراءة الحساس غير مستقرة

تأكد من التوصيلات ومن تثبيت المجس جيدًا داخل التربة. من الطبيعي وجود بعض التغير في القراءة، لذلك لا تعتمد على قيمة لحظية واحدة عند اختيار حدود الجفاف والرطوبة.

كيف يمكن تطوير المشروع؟

  • استخدام حساس رطوبة سعوي للحصول على حل أكثر ملاءمة للاستخدام الطويل.
  • إضافة خزان ماء أكبر.
  • إضافة مراقبة لمستوى الماء داخل الخزان.
  • عرض نسبة الرطوبة بدل القيمة الخام للحساس.
  • إضافة WiFi لمراقبة حالة النبتة والتحكم في النظام عن بعد.

ماذا تعلمنا؟

  • قراءة إشارة تناظرية باستخدام ESP32.
  • استخدام حساس رطوبة التربة.
  • معايرة الحساس وتحديد قيم الجفاف والرطوبة.
  • التحكم في Relay بواسطة GPIO23.
  • تشغيل مضخة 5V بواسطة مصدر تغذية منفصل.
  • إنشاء نظام ري تلقائي يعتمد على حالة التربة.
  • استخدام مستويين مختلفين لمنع التشغيل والإيقاف المتكرر للمضخة.

هذا المشروع نموذج تعليمي بسيط لنظام ري تلقائي، ويمكن تطوير الفكرة لاحقًا إلى نظام أكثر تقدمًا لمراقبة النباتات والتحكم فيها عن بعد.


⚠️ ملاحظة مهمة حول وحدة Relay

في شرح هذا المشروع تم استخدام وحدة Relay تعمل بجهد 5V ومن نوع Active LOW، ولذلك يعتمد الكود المعروض في الفيديو على المنطق التالي:

الإشارة عند مدخل Relayحالة Relayحالة المضخة
LOWONتعمل
HIGHOFFمتوقفة

لكن أثناء التجربة العملية واجهنا مشكلة مهمة: بعض وحدات Relay التي تعمل بجهد 5V قد لا تستجيب بشكل صحيح عند توصيل مدخل IN مباشرة بمنفذ ESP32.

السبب هو أن مستوى الإشارة المرتفعة HIGH في ESP32 يبلغ حوالي 3.3V، وقد لا يكون هذا المستوى مناسبًا لبعض مداخل Relay المصممة للعمل بمنطق 5V.

لذلك خصصنا الحلقة التالية من سلسلة ESP32 من الصفر لفهم المشكلة عمليًا وقياس الإشارات باستخدام الملتيميتر، ثم حلها باستخدام ترانزستور NPN 2N5551.

الحل باستخدام ترانزستور 2N5551

في الحل الذي استخدمناه، يتم وضع ترانزستور 2N5551 بين GPIO23 ومدخل Relay، مع مقاومة 1kΩ بين GPIO23 وقاعدة الترانزستور، ومقاومة Pull-up 10kΩ بين +5V و Collector.

عند قياس الإشارة عند Collector نحصل تقريبًا على:

GPIO23CollectorRelayالمضخة
LOW (0V)≈ 5VOFFمتوقفة
HIGH (3.3V)≈ 0VONتعمل

نلاحظ هنا نقطة مهمة جدًا: دائرة الترانزستور تعكس الإشارة.

وحدة Relay نفسها ما زالت من نوع Active LOW، أي أنها تتفعل عندما يصبح مدخل IN في الحالة LOW. لكن بسبب عكس الإشارة بواسطة الترانزستور يصبح التحكم من جهة ESP32 كما يلي:

إشارة ESP32إشارة Relay INحالة Relayحالة المضخة
GPIO23 HIGHLOWONتعمل
GPIO23 LOWHIGHOFFمتوقفة

هل توجد حلول أخرى؟

نعم. إذا كنت لا تريد استخدام دائرة الترانزستور، يمكن استخدام وحدة Relay متوافقة مباشرة مع منطق 3.3V الخاص بـ ESP32.

كما يمكن استخدام دائرة متكاملة مناسبة لتحويل المستوى المنطقي مثل 74HCT125 لتحويل الإشارة من 3.3V إلى 5V بدون عكسها.

⚠️ تنبيه: دائرة الترانزستور المستخدمة هنا مناسبة للتطبيقات التي تسمح باستخدام خرج من نوع السحب نحو الأرضي مع مقاومة Pull-up، وليست حلًا عامًا لتغذية أي جهاز يعمل بجهد 5V.

📺 شرح المشكلة والحل بالتفصيل

إذا واجهت مشكلة في تشغيل Relay 5V مباشرة بواسطة ESP32، يمكنك مشاهدة الحلقة التالية من السلسلة، حيث نقوم بقياس إشارة GPIO23 عمليًا وشرح سبب المشكلة ثم بناء دائرة باستخدام ترانزستور 2N5551 واختبارها خطوة بخطوة.

الحلقة 5 من ESP32 من الصفر: حل مشكلة Relay 5V مع ESP32 باستخدام ترانزستور 2N5551

موضوعات ذات صلة