في هذا المشروع سنتعلم كيف يمكننا قياس رطوبة التربة باستخدام حساس Soil Moisture مع الاردوينو. لمعرفة ما اذا كانت التربة جافة تحتاج الى ماء ام رطبة بشكل كافي.
المكونات المطلوبة
حساس الرطوبة Moisture Sensor :
هو حساس إلكتروني يقوم بتحويل نسبة الرطوبة الموجودة في التربة إلى اشارة كهربائية يمكن قياسها. مخرجات هذا الحساس عبارة عن اشارة جهد من 0 إلى 5 فولت تعبر عن نسبة الرطوبة في التربة. فإذا كانت التربة جافة يكون المخرج 0 فولت وإذا كانت التربة رطبة جدا يعطي 5 فولت.
يمكننا قياس هذا الجهد الناتج عن طريق الاردوينو ،ومن خلال الأوامر البرمجية يمكننا التحكم بإظهار نسبة الرطوبة على مجموعة الـ LEDs .
توصيل الدارة
قم بتوصيل الدارة كما هو موضح بالصورة التالية :
يتم توصيل حساس الرطوبة إلى الأردوينو كما هو موضح بالجدول :
الطرف (بداية من اليسار) | التوصيل |
VCC | VCC |
GND | GND |
SIG | Output to Arduino |
سنقوم بكتابه برنامج يقوم بقياس نسبة الرطوبة في التربة وعرضها على الشاشة التسلسلية Serial Monitor وتشغيل الـ LEDs للدلاله على نسبة الرطوبة في التربة.
فإذا كانت التربة جافة، لايتم تشغيل اي LED. وكلما زادت نسبة الرطوبة تبدأ الـ LEDs في الإضاءة تدريجيا. وعند وصول التربة إلى درجة التشبع تكون جميع الـ LEDs مضاءة.
الكود البرمجي
#define LED1 2 #define LED2 3 #define LED3 4 #define LED4 5 #define LED5 6 #define SENSOR A0 void setup() { Serial.begin(9600); pinMode(LED1, OUTPUT); pinMode(LED2, OUTPUT); pinMode(LED3, OUTPUT); pinMode(LED4, OUTPUT); pinMode(LED5, OUTPUT); } void loop() { int sensorValue = analogRead(SENSOR); Serial.println(sensorValue); if (sensorValue >= 760) { digitalWrite(LED1, HIGH); digitalWrite(LED2, HIGH); digitalWrite(LED3, HIGH); digitalWrite(LED4, HIGH); digitalWrite(LED5, HIGH); } else if (sensorValue >= 720 && sensorValue < 760) { digitalWrite(LED1, HIGH); digitalWrite(LED2, HIGH); digitalWrite(LED3, HIGH); digitalWrite(LED4, HIGH); digitalWrite(LED5, LOW); } else if (sensorValue >= 615 && sensorValue < 720) { digitalWrite(LED1, HIGH); digitalWrite(LED2, HIGH); digitalWrite(LED3, HIGH); digitalWrite(LED4, HIGH); digitalWrite(LED5, LOW); } else if (sensorValue >= 410 && sensorValue < 615) { digitalWrite(LED1, HIGH); digitalWrite(LED2, HIGH); digitalWrite(LED3, LOW); digitalWrite(LED4, LOW); digitalWrite(LED5, LOW); } else if (sensorValue >= 250 && sensorValue < 410) { digitalWrite(LED1, HIGH); digitalWrite(LED2, LOW); digitalWrite(LED3, LOW); digitalWrite(LED4, LOW); digitalWrite(LED5, LOW); } else if (sensorValue >= 0 && sensorValue < 250) { digitalWrite(LED1, LOW); digitalWrite(LED2, LOW); digitalWrite(LED3, LOW); digitalWrite(LED4, LOW); digitalWrite(LED5, LOW); } delay(1000); }
شرح الكود :
في البداية، نقوم بتسمية منافذ الأردوينو المستخدمة في المشروع، من أجل تسهيل عملية التعامل معها.
#define LED1 2 #define LED2 3 #define LED3 4 #define LED4 5 #define LED5 6 #define SENSOR A0
ثم فى دالة ()setup نقوم بضبط الاعدادات اللازمة للمشروع مثل تشغيل الاتصال التسلسلى و ضبط الـ LEDs المستخدمة كمخرجات
void setup() { Serial.begin(9600); pinMode(LED1, OUTPUT); pinMode(LED2, OUTPUT); pinMode(LED3, OUTPUT); pinMode(LED4, OUTPUT); pinMode(LED5, OUTPUT); }
في الدلة ()loop، نقوم بقراءة الحساس وعرض هذه القراءة على الشاشة التسلسلية Serial Monitor. بعد ذلك نبدأ بتشغيل الـ LEDs على حسب القيمة التي تمت قراءتها.
int sensorValue = analogRead(SENSOR); Serial.println(sensorValue);
مثلا إذا كان قيمة الحساس أعلى من 760، يدل ذلك على أن التربطة رطبة جدا، لذلك يتم إضاءة جميع الـ LEDs.
if (sensorValue >= 760) { digitalWrite(LED1, HIGH); digitalWrite(LED2, HIGH); digitalWrite(LED3, HIGH); digitalWrite(LED4, HIGH); digitalWrite(LED5, HIGH); }
على عكس إذا كان قيمة الحساس اقل من 250، دل ذلك على أن التربة جافة وتحتاج إلى ماء ونعبر عن ذلك بإطفاء جميع الـ LEDs .
else if (sensorValue >= 0 && sensorValue < 250) { digitalWrite(LED1, LOW); digitalWrite(LED2, LOW); digitalWrite(LED3, LOW); digitalWrite(LED4, LOW); digitalWrite(LED5, LOW); }
ويتم إضاءة الـ LEDs تدريجيا اعتمادا على القيمة التي تم قراءتها من الحساس .
else if (sensorValue >= 720 && sensorValue < 760) { digitalWrite(LED1, HIGH); digitalWrite(LED2, HIGH); digitalWrite(LED3, HIGH); digitalWrite(LED4, HIGH); digitalWrite(LED5, LOW); } else if (sensorValue >= 615 && sensorValue < 720) { digitalWrite(LED1, HIGH); digitalWrite(LED2, HIGH); digitalWrite(LED3, HIGH); digitalWrite(LED4, HIGH); digitalWrite(LED5, LOW); } else if (sensorValue >= 410 && sensorValue < 615) { digitalWrite(LED1, HIGH); digitalWrite(LED2, HIGH); digitalWrite(LED3, LOW); digitalWrite(LED4, LOW); digitalWrite(LED5, LOW); } else if (sensorValue >= 250 && sensorValue < 410) { digitalWrite(LED1, HIGH); digitalWrite(LED2, LOW); digitalWrite(LED3, LOW); digitalWrite(LED4, LOW); digitalWrite(LED5, LOW); }