faciletec

يتم التشغيل بواسطة Blogger.

الأحد، 20 مارس 2016

جهاز معرفة مستوى الماء في الخزانات water level indicator




في هذه التجربة سنقوم بعمل جهاز لتحديد لمستوى ( ارتفاع ) الماء في الخزان , يظهر لنا ارتفاع الماء داخل الخزان  و اختيار نوع للتنبيه في حالة كان كان الخزان ممتلئ أو اذا كـان فـارغ !



مـاذا نحتـــاج ؟ 


  1. • متحكــم آردوينو (أي نوع ) .
  2. • حساس ألتـراسونــك ( HC-SR04 , أو اي نوع آخر ) .
  3.   (هذا النوع لا يعمل تحت الماء لذلك تجنب تعريضه للماء و الرطوبة قدر الامكان)
  4. • شاشة LCD 16×2  .
  5. • طنان كهربائي (buzzer) .
  6. • ضوء LED .
  7. • رز تحكم ( push button ) عدد 2 .
  8. • مقاومـة 10K  عدد 2 .
  9. • مقاومـة متغيرة ( potentiometer ) .
  10. • لوجة تجارب مثقبة (breadboard).
  11. • اسلاك توصيل .


• هل تجد صعوبة في توفير القطع الالكترونية باسعار مناسبة ؟ 
اقرأ هذا المقال عن كيفية شراء اقطع الالكترونية من خلال الانترنت




لنبـــدأ :

عمل البرنامج سيكون حسب التسلسل الت :


شــــاهد الفيديو التالـــــي :




لنبدأ مع حساس الألتراسونـــك , يُـمكِـنُـنا هذا الحساس من معرفة المسافة بشكل دقيق بينه و بين الأجسام التي امامه , فهـو يقوم بارسـال موجات فوق صوتيه , و في حال انتقلت هذه الموجات من وسـط الى وسـط آخر تنعكس بعض هذه الموجات الى الحساس فنقوم بحساب الوقت اللازم للعودة الموجة , ولأن سرعة هذه الأمواج في الفراغ ثابته , يمكننــا حســاب المســافــة التي قطعتها الأمــواج !






نوصل  الحساس مع الاردوينو كالتالي :

Trigger  مــــع  ( Pin 10) .

Echo   مــــع  ( Pin 9 ) .

Vcc مــع مصدر تغذية 5V  في الاردوينو .

GND  مـع الارضي في الاردوينو .





في هذه التجربة سيقوم المستخدم بتحديد نوع التنبيه , و يقوم الجهاز ايضاُ بعرض مستوى الماء باستمرار , لذلك نحتاج لأدوات ادخال و اخراج مع الردوينو .
سوف نستخدم الأزرار و شاشة كريستالية 16×2 .


توصيل الشاشة مع الاردوينو يكون حسب المخطط التالــي : 


من السهل جداً التعامل مع هذا النوع من الشاشات , لوجود مكتبة تدعمـه , مما يسهل كتابة الكودات داخل البرنامج الكلي !






نقوم بتوصيل الأزرار مع المقاومة (pull-down) و توصيلها مع الاردوينو على المداخل 6 , 7 !






و نقوم بتوصيل الطنان الكهربائي و ضوء التنبيه على المدخل رقم 13 .

نقوم بتوصيل طرف GND من الطنان على المدخل 13 . اي ان الطنان سوف يعمل عندما تكون حالة المدخل LOW  و منطفئ عندما تكون حالة المدخل HIGH .
و ذلك كي تكون تغذية الاطنان مباشرة من الـ 5 V  و لا تعتمد على تغذية المدخل 13 !
لأن تغذية المدخل قد لا تكفي للطنان و الضوء ( و لا ننسى وجود 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 سم ) . 

لذلك من الأفضل ( في حالة السوائل ) ان يكون الحساس داخل الخزان , لتجنب حدوث اخطاء عند امتلاء الخزان .




 ◙◙◙◙◙  تــنـبـــيـــه  ◙◙◙◙◙  
الحساس المستخدم في التجربة غير مقاوم للماء ,
و ضعه داخل الخزان سوف يسبب تـلـفـه  ! 
◘◘◘◘◘◘◘◘◘◘◘◘




إقرأ المزيد.. bloggeradsenseo

استخدام الاردوينو بدلاً من اجهزة التحكم الراديوي الموجودة لديك 433MHz




قد تحتاج احياناً لصنع جهاز تحكم عن بعد (مرسل و مستقبل )  , أو استخدام الاردوينو بدلاً من اجهزة التحكم الراديوي الموجودة لديك ,  أو ارسال بيانات من حساس موجود في مكان ما الى متحكم في مكان آخر !

توجد العديد من الوسائل لنقل البيانات بين متحكمي اردوينو مثل البلوتوث , و الـWiFi  و الـ XBee  و غيرهـا .
في هذه التجربة سوف نستخدم مرسل و مستقبل راديوي 433Mhz RF Module ..
لقراءة قيمة حساس عن بعد !


RF 315/433 MHz
تحتاج الى :

• متحكم آردوينو ( عدد 2 ) .

• 433Mhz RF Module .
  ( يمكنك شراءه من هــنــا )

• مقاومة متغيرة  (potentiometer) .

• لوحة تجارب مثقبة + اسلاك توصيل .

• مكتبة rc-switch (حملها من هنا ) .

• مكتبة virtual Wire (حملها من هنا ) .





يتكون الموديول من جزئين ( المرسل و المستقبل ) :



المرسل TX


المستقبل RX


خصائص هذا النوع  :

- المرسل Tx  :  الفولتية ( من 3.3 - 12 فولت ) . 
- المستقبل Rx : الفولتية ( من 4.5 - 5 فولت ) .
- القدرة الكهربائية : 25mW . 
- سرعة ارسال البيانات : لا تتعدى 9Kbps .
- اقصى مدى : 100 متر (عند سرعة ارسال 400bps ) . 
- التيار الأعظمي Imax : اقل من 50 ملي امبير . 



نقوم بتوصيل المقاومة المتغيرة مع الاردوينو الأولى و نصل المرسل معها , بحيث يقرأ الاردوينو قيمة الحساس و ثم يقوم بأرسالها الى بطاقة الاردوينو الثانية ..





التوصيل مع الاردوينو يكون كالتالي 
 : 










البرمجة  :

سوف نستخدم مكتبة rc-switch في كتابة الكود .
| يمكنك الاطلاع عى الامثلة المرفقة مع المكتبة فهي كافية لفهم عمل المكتبة |


كود المرسل(على الاردوينو رقم 1 ) :
____________________________

#include <RCSwitch.h>

RCSwitch mySwitch = RCSwitch();

void setup() 
{
  mySwitch.enableTransmit(10);
 // المرسل موصول مع المخرج 10في الاردوينو
}


void loop() {
 int sensorValue = analogRead(A0);
 delay(100);
 mySwitch.send(sensorValue , 12);
// رقم 12 يعني ارسال القيمة عبر 12 بت
 delay(2000);  
}






كود المستقبل(على الاردوينو رقم 2 ):

سوف نستخدم مثال جاهز موجود داخل المكتبة اسمه ReceiveDemo_simple 


#include <RCSwitch.h>

RCSwitch mySwitch = RCSwitch();

void setup() {
  Serial.begin(9600);
  mySwitch.enableReceive(0); 
 // Receiver on inerrupt 0 => that is pin #2
}

void loop() {
  if (mySwitch.available()) {
    
    int value = mySwitch.getReceivedValue();
    
    if (value == 0) {
      Serial.print("Unknown encoding");
    } else {
      Serial.print("Received ");
      Serial.print( mySwitch.getReceivedValue() );
      Serial.print(" / ");
      Serial.print( mySwitch.getReceivedBitlength() );
      Serial.print("bit ");
      Serial.print("Protocol: ");
      Serial.println( mySwitch.getReceivedProtocol() );
    }

    mySwitch.resetAvailable();
  }
}






بعد تحميل الكود سيبدأ الاردوينو الاول بقراءة قيمة الحساس و ارسالها الى المستقبل .. 
و يقوم الاردوينو الثاني بقراءة هذه القيمة و عرضها على  serial monitor. 

ستظهر هذه النتيجة :










هناك تطبيقات عديدة على هذا الموضوع . 

- حيث يمكنك ببساطة صنع جهاز تحكم عن بعد . 
( للتحكم بالروبوتات أو الابواب او الاضاءة .. إلخ ) !



هذه تجربة لعمل جهاز تحكم عن بعد لسيارة باستخدام نفس الموديل :









- و يمكن استبدال  الأردوينو بـجهاز التحكم الراديوي ليقوم بنفس المهام بشكل تلقائي .
على سبيل المثال ريموت اغلاق و فتح السيارة , بعد معرفة الاوامر التي يرسلها عند الضغط على الازرار فيه !   يمكن استبداله بآردوينو و مرسل راديوي , ليرسل الاردوينو نفس الاوامر دونة الحاجة للضغط على ازرار ! 
يمكن مثلاً جعل الابواب تفتح بشكل تلقائي عند دخول شخص للكراج ! 


هذه تجربة لفك تشفير اجهزة التحكم و اعادة ارسال الاوامر :


إقرأ المزيد.. bloggeradsenseo
تطوير : مدونة حكمات