حساب المسافة بإستخدام حساس الموجات فوق صوتية

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

استخدام-حساس-الموجات-فوق-الصوتية-مع-ال

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

arduino uno r3

Arduino Uno

Ultrasonic Sensor HC-SR04

HC-SR04 Ultrasonic Sensor

 

HD44780

LCD 16×2

220 Ω resistor

مقاومة 220 اوم

Full size breadboard 830

Breadboard

Breadboard Jumper Wire 65 pcs

Wires

حساس الموجات فوق الصوتية

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

استخدام-حساس-الموجات-فوق-الصوتية-مع-ال

قم بتوصيل حساس الموجات الفوق صوتية مع الأردوينو كما هو موضح بالصورة :

استخدام-حساس-الموجات-فوق-الصوتية-مع-ال

الشاشة LCD

استخدام-حساس-الموجات-فوق-الصوتية-مع-ال
تعمل الشاشة في احد الحالات التالية:

1- أن تستقبل امر من الارودوينو و تقوم بتنفيذه مثلا: أمر مسح الشاشة و أمر التهيئة 

lcd.begin(16,2);
lcd.clear();

2- أن تستقبل معلومات من الاردوينو و تقوم بعرضها مثلا : كتابة جملة معينة  

lcd.print("Hello");

 

قم بتوصيل شاشة LCD مع الأردوينو كما هو موضح بالصورة :

استخدام-حساس-الموجات-فوق-الصوتية-مع-ال

شرح الدارة

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

استخدام-حساس-الموجات-فوق-الصوتية-مع-ال

 

استخدام-حساس-الموجات-فوق-الصوتية-مع-ال

توصيل حساس الموجات فوق الصوتية

Ultrasonic Sensor Arduino
GND GND
Echo Pin 2
Trigger Pin 3
Vcc 5v

الكود

#include <LiquidCrystal.h>         // the LCD Library
#include <NewPing.h>               // the Ultrasonic Library

#define TRIG  3                    // Pin-3 of Arduino Connected to Trig Pin of Ultrasonic
#define ECHO  2                    // Pin-4 of Arduino Connected to Echo Pin of Ultrasonic
#define MAX_DISTANCE 100           // Max. Distance the Sensor Can Measure, Required for the Library


NewPing sonar(TRIG, ECHO, MAX_DISTANCE); // Ultrasonic Variable
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);  // LCD Variable


unsigned int duration;             // Variable Used To Store The Measured Distance

void setup()
{
 pinMode(TRIG,OUTPUT);             // Set Trig Pin of Arduino As Output
 pinMode(ECHO, INPUT);             // Set Echo Pin of Arduino As Input
 lcd.begin(16,2);                  // To Setup and Start the LCD
 lcd.clear();                      // To Clear the LCD
}

void loop()
{
 duration = sonar.ping();          // Send ping, get ping time in microseconds (uS).
 duration = duration / 2 / 29.4;   // Explained Below
 lcd.print("Ping: ");              // to Print " Ping:  " on the LCD
 lcd.print(duration);              // next to it print the Calculated Value
 lcd.print(" cm");

 // on lcd we will see "  Ping: 30 cm  "

 delay(1000);                      // min. delay between pings is 29 msec
 lcd.clear();                      // to clear the LCD for the Next Round
}

 شرح الكود :

في البداية قم بإدراج المكتبات المستخدمة في البرنامج, هنا سيتم استخدام مكتبة الشاشة LCD و مكتبة حساس الموجات فوق الصوتية Ultrasonic.

نقوم بتعريف أسماء منافذ الاردوينو التي تم توصيلها مع الحساس :

#define TRIG  3

ننشىء المتغيرات اللازمة للمكتبات المستخدمة :

 أولا، نقوم بتعريف المتغير الخاص بمكتبة الشاشة LCD، وإعداده إعتمادا على كيفية توصيله مع الأردوينو :

LiquidCrystal lcd(7, 8, 9, 10, 11, 12);

ثم نقوم بتعريف المتغير الخاص بمكتبة Ultrasonic، وتحديد منافذ الأردوينو المتصل معها :

NewPing sonar(TRIG, ECHO, MAX_DISTANCE);

نقوم بتهيئة الشاشة LCD للعمل عن طريق الامر :

lcd.begin(16,2);

يقوم الكود بتشغيل الحساس و حساب المسافة ثم يتم عرضها على الشاشة :

void loop()
{
 duration = sonar.ping();          // Send ping, get ping time in microseconds (uS).
 duration = duration / 2 / 29.4;   // Explained Below
 lcd.print("Ping: ");              // to Print " Ping:  " on the LCD
 lcd.print(duration);              // next to it print the Calculated Value
 lcd.print(" cm");

 // on lcd we will see "  Ping: 30 cm  "

 delay(1000);                      // min. delay between pings is 29 msec
 lcd.clear();                      // to clear the LCD for the Next Round
}

في البداية، نقوم بإستخدام الدالة ()sonar.ping لنحصل على قيمة الوقت الذي استغرقته موجات الـUltrasonic لتصدم بكائن و تعود الى الحساس مرة اخرى. ثم نقوم بعمل حسابات بسيطة على هذة القيمة سيتم شرحها لاحقا بعد ذلك قمنا بعرض هذة الحسابات على شاشة LCD.

  • الحسابات الخاصة بعمل حساس الموجات فوق الصوتية:

يقوم الحساس بارسال موجات فوق صوتية و عند اصطدامها بحائل ترتد مرة اخرى فيمكن للاردوينو حساب الوقت الذى استغرقته الموجات للذهاب و العودة لذلك لابد من القسمة على 2 لاننا نريد حساب المسافة و هذا يعتمد على وقت الذهاب فقط.

 سرعه الصوت في الهواء في الحالة العادية تقريبا 340 متر لكل ثانية فيكون الوقت المستهلك لعبور 1 سم هو :

100 للتحويل من متر الى سم , و 10^6 للتحويل من ثانية الى مايكروثانية .




عرض درجة الحرارة والرطوبة

في هذا المشروع سوف نتعلم كيفية استخدام DHT11 أو جهاز الاستشعار DHT22  مع لوحة الاردوينو لقياس درجة الحرارة و الرطوبة . وسيتم طباعة درجة حرارة الغرفة والرطوبة على شاشة الـ LCD .

temp-humidity-display

القطع المطلوبة:

الأدوات التي تحتاجها لهذا المشروع :

humidity sensor

مستشعر درجة الحرارة و الرطوبة DHT11

LCDشاشة عرض 16×2 شاشة

potentiometer 10k

Potentiometer 10K Ω

220 Ω resistor

مقاومة 220 اوم

Half-size Breadboard

لوح تجارب حجم متوسط (Half size breadboard )

arduino uno r3

Arduino Uno R3

Jumper Wires Male/Male

 اسلاك توصيل ذكر/ذكر (Jumper Wires Male Male)

حساسات DHT11/DHT22 :

هذه الأجهزة شعبية جدا لهواة الالكترونيات لأنها رخيصة و تقدم أداء رائعة. وفي يلي يتم توضيح المواصفات و الفرق بين هذه الحساسات :
DHT22 هو نسخة أكثر تكلفة لأنها تقدم مواصفات أفضل . مثلا في نطاق قياس درجة الحرارة هو من -40 إلى +125  درجة مئوية مع 0.5 درجة دقة ، في حين  DHT11من 0 الى 50 درجة مئوية مع 2 درجة دقة. أيضا DHT22 لديه نطاق قياس رطوبة أفضل ، من 0 إلى 100% مع 2-5% من الدقة. في حين DHT11  نطاق الرطوبة من 20 الى 90% مع  5% من الدقة.

temp-humidity-display

هناك مواصفتان في DHT11 هي أفضل من DHT22. وهي معدل أخذ العينات (Sampling Rate) في مستشعر DHT11  هي 1Hz او قراءة كل ثانية، في حين  DHT22 معدل أخذ العينات هي 0.5Hz أو قراءة كل 2 ثانية. كما أن DHT11  أصغر حجما.
جهد التشغيل الكهربائي لكل من أجهزة الاستشعار هي 5-3 فولت ، في حين الحد الأقصى للتيار المستخدم عند القياس هو 2.5mA.

هذة الحساسات  تتألف من مستشعر الرطوبة , و NTC  مستشعر درجة الحرارة (أو الثرمستور) و IC على الجانب الخلفي للحساس .

temp-humidity-display

حساسات DHTxx  لديها أربعة دبابيس ، VCC ، GND ، دبوس البيانات (Data Pin)  ودبوس لا يتم استخدامه. مطلوب Pull-up resistor من  5Kالى 10K اوم للحفاظ على خط البيانات و من أجل تمكين الاتصال بين المستشعر و لوحة الاردوينو. هناك بعض الإصدارات من هذه الحساسات التي تأتي مع لوحة جانبية مدمجة مع pull-up resistor و لديها 3 دبابيس.

temp-humidity-display

مبدأ عمل DHT11 :

في هذا المشروع سنقوم بإستخدام المستشعر DHT11. بعد توصيل المستشعر إلى المتحكم، يقوم المتحكم MCU بإرسال نبضة بدء (Start signal ) للحساس لينقله من وضع الأستعداد إلى وضع التشغيل و بعد اكتمال وصول النبضه إلى الحساس و استجابته لهذه النبضة ، يرسل الحساس موجه تضم 40 Bit تضم اشارات الحرارة و الرطوبة إلى المتحكم الذي يقوم بدوره بمعالجتها و إظهار النتائج .

temp-humidity-display

تصميم لوح التجارب

 قم بتوصيل الدائرة الكهربائية للمستشعر كما هو موضح بالصورة :

temp-humidity-display

ثم قم بإضافة  LCD  ويتم توصيلها كما هو موضح بالصورة التالية :

temp-humidity-display

في هذا المشروع سيتم توصيل الشاشة كالتالي :

Arduino LCD
Pin 12 RS pin
Pin 11 Enable pin
Pin 5 D4 pin
Pin 4 D5 pin
Pin 3 D6 pin
Pin 2 D7 pin

يمكنك العودة إلى الدرس الثاني عشر للإطلاع على طريقة توصيل باقي المنافذ على شاشة الـ LCD .

الكود البرمجي للأردوينو

أولا نحن بحاجة إلى تثبيت مكتبة الـDHT  التي يمكنك تنزيلها من  هنا أو من الموقع الرسمي اردوينو هنا. ثم يتم تحديد رقم المنفذ لقراءة البيانات من المستشعر.

ثم قم برفع البرنامج التالي على الاردوينو:

#include  <LiquidCrystal.h> // includes the LiquidCrystal Library
#include <dht.h>
#define dataPin A0
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // Creates an LCD object. Parameters: (rs, enable, d4, d5, d6, d7)
dht DHT;
void setup() {
  lcd.begin(16,2); // Initializes the interface to the LCD screen, and specifies the dimensions (width and height) of the display
}
void loop() {
  int readData = DHT.read11(dataPin);
  float t = DHT.temperature;
  float h = DHT.humidity;
  lcd.setCursor(0,0); // Sets the location at which subsequent text written to the LCD will be displayed
  lcd.print("Temp.: "); // Prints string "Temp." on the LCD
  lcd.print(t); // Prints the temperature value from the sensor
  lcd.print((char)223); //degree symbol
  lcd.print("C");
  lcd.setCursor(0,1);
  lcd.print("Humi.: ");
  lcd.print(h);
  lcd.print(" %");
  delay(2000);
}

لمحة عن الكود :

سيتم استخدام الدالة ()read11 ليتم قراءة البيانات من المستشعر

int readData = DHT.read11(dataPin);

 ثم الحصول على قيم درجة الحرارة و الرطوبة و يتم وضع القيم في متغيرات.

float t = DHT.temperature; 
float h = DHT.humidity;