في هذه التجربة سنقوم بعمل جهاز لتحديد لمستوى ( ارتفاع ) الماء في الخزان , يظهر لنا ارتفاع الماء داخل الخزان و اختيار نوع للتنبيه في حالة كان كان الخزان ممتلئ أو اذا كـان فـارغ !
مـاذا نحتـــاج ؟
- • متحكــم آردوينو (أي نوع ) .
- • حساس ألتـراسونــك ( HC-SR04 , أو اي نوع آخر ) .
- (هذا النوع لا يعمل تحت الماء لذلك تجنب تعريضه للماء و الرطوبة قدر الامكان)
- • شاشة LCD 16×2 .
- • طنان كهربائي (buzzer) .
- • ضوء LED .
- • رز تحكم ( push button ) عدد 2 .
- • مقاومـة 10K عدد 2 .
- • مقاومـة متغيرة ( potentiometer ) .
- • لوجة تجارب مثقبة (breadboard).
- • اسلاك توصيل .
• هل تجد صعوبة في توفير القطع الالكترونية باسعار مناسبة ؟
اقرأ هذا المقال عن كيفية شراء اقطع الالكترونية من خلال الانترنت
لنبـــدأ :
عمل البرنامج سيكون حسب التسلسل الت :
شــــاهد الفيديو التالـــــي :
.jpg)
نوصل الحساس مع الاردوينو كالتالي :
Trigger مــــع ( Pin 10) .
Echo مــــع ( Pin 9 ) .
Vcc مــع مصدر تغذية 5V في الاردوينو .
GND مـع الارضي في الاردوينو .
في هذه التجربة سيقوم المستخدم بتحديد نوع التنبيه , و يقوم الجهاز ايضاُ بعرض مستوى الماء باستمرار , لذلك نحتاج لأدوات ادخال و اخراج مع الردوينو .
سوف نستخدم الأزرار و شاشة كريستالية 16×2 .
توصيل الشاشة مع الاردوينو يكون حسب المخطط التالــي :
من السهل جداً التعامل مع هذا النوع من الشاشات , لوجود مكتبة تدعمـه , مما يسهل كتابة الكودات داخل البرنامج الكلي !
نقوم بتوصيل الأزرار مع المقاومة (pull-down) و توصيلها مع الاردوينو على المداخل 6 , 7 !
و نقوم بتوصيل الطنان الكهربائي و ضوء التنبيه على المدخل رقم 13 .
نقوم بتوصيل طرف GND من الطنان على المدخل 13 . اي ان الطنان سوف يعمل عندما تكون حالة المدخل LOW و منطفئ عندما تكون حالة المدخل HIGH .
و ذلك كي تكون تغذية الاطنان مباشرة من الـ 5 V و لا تعتمد على تغذية المدخل 13 !
لأن تغذية المدخل قد لا تكفي للطنان و الضوء ( و لا ننسى وجود LED داخلي موصول معه في بطاقة الاردوينو ).
لأن تغذية المدخل قد لا تكفي للطنان و الضوء ( و لا ننسى وجود LED داخلي موصول معه في بطاقة الاردوينو ).
و يكون الشكل النهائي للدارة كما يلي :
البرمجــة :
بعد توصيل كل المكونات و تجهيزهـا , نكتب الكود البرمجي التالي للتحكم فيهــا :
/*
Project : Water Level Detector & Alarm !!
By : Ali Hadabeen , Hashemite University, 2013
https://www.facebook.com/ali.hadabeen
*/
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
#define trigPin 10
#define echoPin 9
#define alarmPin 13
#define button_1 7
#define button_2 6
int a ; // alarm mode
void setup() {
lcd.begin(16, 2);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(alarmPin, OUTPUT);
pinMode(button_1, INPUT);
pinMode(button_2, INPUT);
digitalWrite(alarmPin, HIGH); // the GND line of alarm is connecting to this pin !
delay (150);
lcd.clear();
lcd.print("Level Sensor");
lcd.setCursor(0, 1);
delay (150);
lcd.print("By: Ali Hadabeen");
delay (5000);
lcd.clear();
lcd.setCursor(2, 0);
lcd.print("select Alarm");
lcd.setCursor(5, 1);
lcd.print("mode");
while ( digitalRead(button_1) == LOW && digitalRead(button_2) == LOW ) {}
if ( digitalRead(button_1) == HIGH )
{ a = 1;} // FULL alarm mode
else if (digitalRead(button_2) == HIGH)
{ a = 2;} // EMPTY alarm mode
lcd.clear();
delay(150);
if (a == 1 )
{ lcd.print("FULL Alarm Mode"); } // turn the LED off by making the voltage LOW
else if(a==2)
{ lcd.print("EMPTY Alarm Mode");}
}
void loop() {
delay (2000);
lcd.clear();
lcd.print(" Water Level : ");
lcd.setCursor(5, 1);
if (a == 1 ){
while ( a == 1 ){
int duration, distance;
digitalWrite(trigPin, HIGH);
delayMicroseconds(1000);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distance = (duration/2) / 29.1;
lcd.setCursor(5, 1);
lcd.print(100 - distance);
delay(100);
if (distance >= 200 || distance <= 0){
lcd.clear();
lcd.print("Out of range");
digitalWrite(alarmPin, LOW); }
else if (distance <= 10) {
lcd.clear();
lcd.print("FULL Tank !");
digitalWrite(alarmPin, LOW); }
}
}
if (a == 2) {
while ( a == 2 ){
int duration, distance;
digitalWrite(trigPin, HIGH);
delayMicroseconds(1000);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distance = (duration/2) / 29.1;
lcd.setCursor(5, 1);
lcd.print(100 - distance);
delay(100);
if (distance >= 200 || distance <= 0){
lcd.clear();
lcd.print("Out of range");
digitalWrite(alarmPin, LOW); }
else if (distance >= 100) { // the tank depth = 1 meter (100cm)
lcd.clear();
lcd.print("EMPTY Tank !");
digitalWrite(alarmPin, LOW); }
}
}
}
تثبيت الحساس على الخزان :
• يجب تثبيت الحساس في اعلى الخزان بعيداً عن اي مياه ! لأن هذا الحساس غير مقاوم و سيتلف مباشرة عند ملامسته للماء !
• يجب ان يكون هناك مجرى للماء بعيد عن الحساس في حال امتلأ الخزان !
• قم بقياس المسافة من الحساس حتى قعر الخزان و اضف القيمة للكود البرمجي .
• لا تقم بتمديد اسلاك طويلة ( لنقل الشاشة لداخل البيت مثلاً ) , اذا اردت فصل الحساس عن شاشة العرض جرب نقل القراءة لاسلكياً .
____________________________________________________
• زاوية الموجات الخارجة من الحساس 30 درجة , تأكد انه لا توجد اي عوائق في طريقها غير الماء !
عندما يقترب مستوى الماء من الحساس , قد يعطي قراءات خاطئة (المسافة تعتمد على نوع الحساس من 3 - 10 سم ) .
لذلك من الأفضل ( في حالة السوائل ) ان يكون الحساس داخل الخزان , لتجنب حدوث اخطاء عند امتلاء الخزان .
◙◙◙◙◙ تــنـبـــيـــه ◙◙◙◙◙
الحساس المستخدم في التجربة غير مقاوم للماء ,
و ضعه داخل الخزان سوف يسبب تـلـفـه !
◘◘◘◘◘◘◘◘◘◘◘◘