 |
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
|
|
نشاط [ F.Abdelaziz ]
قوة السمعة:333
|
|
13-03-2020, 11:39 AM
المشاركة 2
|
|
مشروع مبين ومتحكم لمستوى (منسوب) المياه تلقائيا فى خزان باستخدام الاردوينو
في هذا المشروع الذي يستند إلى Arduino ، سنقوم بقياس مستوى الماء باستخدام أجهزة استشعار بالموجات فوق الصوتية ultrasonic . يعتمد المبدأ الأساسي لقياس المسافة بالموجات فوق الصوتية على الصدى ECHO. عندما ترسل الموجات الصوتية في البيئة ، فإنها تعود إلى الأصل كصدى ECHO بعد الارتداد من أي عقبة. لذلك علينا فقط حساب وقت الانتشار لكل من الموجة المرسلة والموجة المستقبلة يعني وقت المغادرة ووقت العودة إلى الأصل بعد ضرب أي عقبة. وبعد بعض الحسابات يمكننا الحصول على النتيجة وهي المسافة. يتم استخدام هذا المفهوم في مشروعنا للتحكم في المياه حيث يتم تشغيل مضخة محرك المياه تلقائيًا عندما يصبح مستوى الماء في الخزان منخفضًا.
الدائرة الكهربية :


في هذه الدائرة ، يتم وضع وحدة الاستشعار بالموجات فوق الصوتية في الجزء العلوي من خزان المياه . ستقوم وحدة الاستشعار هذه بقراءة المسافة بين وحدة المستشعر وسطح الماء ، وسوف تظهر المسافة على شاشة LCD مع رسالة “Water Space in Tank is:” . هذا يعني أننا نعرض هنا المكان الفارغً بدلاً من مستوى الماء. بسبب هذه الوظيفة ، يمكننا استخدام هذا النظام في أي خزان مياه. عندما يصل مستوى فراغ الماء إلى مسافة حوالي 30 سم ، يقوم Arduino بتشغيل مضخة المياه عن طريق تشغيل الريلاى . وحينها ستعرض شاشة LCD “LOW Water Level” “Motor turned ON” ، وسيبدأ ليد LED بيان حالة الريلاى في التوهج .
الآن إذا وصلت المساحة الفارغة على مسافة حوالي 12 سم ، يقوم اردوينو بإيقاف تشغيل الريلاى التتابع وستظهر شاشة LCD “Tank is full” “Motor Turned OFF” . الصفارة أيضا نعطى صفير لبعض الوقت ويتم فصل ليد بيان حالى الريلاى .
البرمجة :
1- فى بداية (مقدمة) البرنامج :
• يتم تضمين مكتبة LCD .
• تعريف الأطراف المستخدمة فى البرنامج لربط الأجهزة الخارجية مثل الحساس والريلاى والصفارة وشاشة LCD .
• إنشاء كائن من فئة الشاشة وليكن lcd مع تحديد الأطراف المستخدمة .
• إعلان المتغيرات المستخدمة .
كود:
#include <LiquidCrystal.h>
#define trigger 10
#define echo 11
#define motor 8
#define buzzer 12
LiquidCrystal lcd(7,6,5,4,3,2);
float time=0,distance=0;
int temp=0;
2- فى دالة الإعداد setup :
• تهيئة الشاشة LCD للعمل وتحديد نوعها 16 حرف (عامود) و 2 سطر (صف) .
• تحديد اتجاه الأطراف المستخدم خرج OUTPUT / دخل INPUT .
• عرض رسالة إفتتاحية Water Level فى السطر الأول و Indicator فى السطر الثانى لمدة (تأخير) 2 ثانية .
كود:
void setup()
{
lcd.begin(16,2);
pinMode(trigger,OUTPUT);
pinMode(echo,INPUT);
pinMode(motor, OUTPUT);
pinMode(buzzer, OUTPUT);
lcd.print(" Water Level ");
lcd.setCursor(0,1);
lcd.print(" Indicator ");
delay(2000);
}
3- الدالة loop وفيها يتم :
أ- الجزء الأول :
• مسح الشاشة .
• مسح المخرج trigger بجعله فى الحالة المنخفضة لمدة 2 ميكروثانية .
• جعل المخرج trigger فى الحالة المرتفعة لمدة 10 ثوانى حتى يتمكن الحساس من توليد الإشارة الفوق صوتية .
• إعادة مسح المخرج trigger بجعله فى الحالة المنخفضة لمدة 2 ثانية ، حيث يتم إرسال الإشارة فوق الصوتية واستقبالها بعد إنعكاسها من العائق ومن ثم تكوين نبضة مدتها تتناسب مع المسافة إلى العائق .
• الحصول على زمن النبضة time باستخدام الدالة pulseIn ومن ثم يمكن حساب المسافة distance .
• طباعة الرسالة Water Space In فى السطر الأول ، وفى السطر الثانى يتم طباعة Tank is: يليها قيمة المسافة distance ووحداتها Cm ، وذلك لمدة 2 ثانية .
كود:
void loop()
{
lcd.clear();
digitalWrite(trigger,LOW);
delayMicroseconds(2);
digitalWrite(trigger,HIGH);
delayMicroseconds(10);
digitalWrite(trigger,LOW);
delayMicroseconds(2);
time=pulseIn(echo,HIGH);
distance=time*340/20000;
//lcd.clear();
lcd.print("Water Space In ");
lcd.setCursor(0,1);
lcd.print("Tank is: ");
lcd.print(distance);
lcd.print("Cm");
delay(2000);
ب- الجزء الثانى : عمليات المقارنة للتحكم التلقائى فى منسوب المياة ، وهنايتم تنفيذ واحدة من 3 حالات :
• الحالة الأولى : عندما يصل الخزان إلى حالة الملو إى المسافة أقل من 12 سم ، و (&&) المتغير temp==0 . عندئذ يتم إيقاف المحرك ، وإصدار صفير ، ومسح الشاشة وعرض Water Tank Full فى السطر الأول و Motor Turned OFF ولمدة 2 ثانية ، ثم إيقاف الصفير والانتظار 3 ثانية وأخيرا يتم تحويل المتغير temp=1 .
• الحالة الثانية : عندما يكون الحزان مملوء والمتغير temp==1 يتم : إيقاف المحرك ومسح الشاشة وعرض Water Tank Full و Motor Turned OFF لمدة خمس ثوانى .
• الحالة الثالثة : عندما تكون المسافة أكبر من 30 (بما فى ذلك حالة بدء ملو الخزان) يتم : تشغيل المحرك ، ومسح الشاشة وعرض LOW Water Level و Motor Turned ON والتأخير 5 ثانية وتحويل المتغير temp=0 .
كود:
if(distance<12 && temp==0)
{
digitalWrite(motor, LOW);
digitalWrite(buzzer, HIGH);
lcd.clear();
lcd.print("Water Tank Full ");
lcd.setCursor(0,1);
lcd.print("Motor Turned OFF");
delay(2000);
digitalWrite(buzzer, LOW);
delay(3000);
temp=1;
}
else if(distance<12 && temp==1)
{
digitalWrite(motor, LOW);
lcd.clear();
lcd.print("Water Tank Full ");
lcd.setCursor(0,1);
lcd.print("Motor Turned OFF");
delay(5000);
}
else if(distance>30)
{
digitalWrite(motor, HIGH);
lcd.clear();
lcd.print("LOW Water Level");
lcd.setCursor(0,1);
lcd.print("Motor Turned ON");
delay(5000);
temp=0;
}
}
البرنامج :
كود:
#include <LiquidCrystal.h>
#define trigger 10
#define echo 11
#define motor 8
#define buzzer 12
LiquidCrystal lcd(7,6,5,4,3,2);
float time=0,distance=0;
int temp=0
void setup()
{
lcd.begin(16,2);
pinMode(trigger,OUTPUT);
pinMode(echo,INPUT);
pinMode(motor, OUTPUT);
pinMode(buzzer, OUTPUT);
lcd.print(" Water Level ");
lcd.setCursor(0,1);
lcd.print(" Indicator ");
delay(2000);
}
void loop()
{
lcd.clear();
digitalWrite(trigger,LOW);
delayMicroseconds(2);
digitalWrite(trigger,HIGH);
delayMicroseconds(10);
digitalWrite(trigger,LOW);
delayMicroseconds(2);
time=pulseIn(echo,HIGH);
distance=time*340/20000;
//lcd.clear();
lcd.print("Water Space In ");
lcd.setCursor(0,1);
lcd.print("Tank is: ");
lcd.print(distance);
lcd.print("Cm");
delay(2000);
if(distance<12 && temp==0)
{
digitalWrite(motor, LOW);
digitalWrite(buzzer, HIGH);
lcd.clear();
lcd.print("Water Tank Full ");
lcd.setCursor(0,1);
lcd.print("Motor Turned OFF");
delay(2000);
digitalWrite(buzzer, LOW);
delay(3000);
temp=1;
}
else if(distance<12 && temp==1)
{
digitalWrite(motor, LOW);
lcd.clear();
lcd.print("Water Tank Full ");
lcd.setCursor(0,1);
lcd.print("Motor Turned OFF");
delay(5000);
}
else if(distance>30)
{
digitalWrite(motor, HIGH);
lcd.clear();
lcd.print("LOW Water Level");
lcd.setCursor(0,1);
lcd.print("Motor Turned ON");
delay(5000);
temp=0;
}
}
|