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

تعلم كيفية استخدام المعقم بدون لمس باستخدام الاردوينو و محرك السيرفو
استخدام الاردوينو مع حساس الموجات فوق الصوتية فى عمل مسح للفضاء المحيط.
استخدام حساس درجة الحرارة lm35 لقياس درجة الحرارة و عرضها على شاشة LCD.
ستتعلم كيفية ارسال بريد الكتروني حال استشعار الحركة
في هذا الدرس سنقوم بإظهار درجة الحرارة ودرجة سطوع اضاءة الغرفة على الشاشة الكرستالية ...
في هذا الدرس ستتعلم كيفية اصدار الاصوات بمتحكم الأردوينو.
ستتعلم في هذا الدرس كيفية قياس قوة الاضاءة باستخدام المدخل التناظري 'analog input'.
جميع دروس ومشاريع الحساسات والمستشعرات
في الدرس السابق تعلمنا تصنيع معقم بالمنزل في هذا الدرس تعلم كيف، يمكننا استخدام حساس المسافة للتعقيم بدون مسك العبوة،
في هذا المشروع سنتعلم كيفية استخدام حساس الموجات الفوق صوتية (Ultrasonic) مع الأردوينو في عمل مسح للفضاء المحيط
حساس المسافة (Ultrasonic Sensor)
هو عبارة عن جهاز يقوم بتحويل الاشارة الكهربائية إلى حركة ميكانيكية. يختلف هذا المحرك عن محركات التيار المستمر (DC) في ان حركته غير مستمرة.
اي عند دخول إشارة كهربائية إلى محرك السيرفو بقيمة معينة ينتج عن ذلك حركة بزاوية معينة ثم يتوقف المحرك عن الحركة ويظل محتفظ بالزاوية التي وصل إليها. على عكس محركات التيار المستمر فإنها تستمر في الدوران بمجرد إمدادها بالتيار الكهربائي.
يعمل محرك السيرفو بوضع اشارة كهربائية PWM بزمن محدد . تقوم مكتبة السيرفو في الاردوينو بالاهتمام بهذا الامر عنك، فحسب هذه الإشارة يتحرك السيرفو بزاوية معينة من 0 إلى 180 درجة.
يقوم مستشعر الموجات فوق الصوتية بقياس المسافة. حيث يقوم باطلاق موجات صوتية عالية التردد لا يمكن للأذن البشرية سماعها وعند اصطدام هذه الموجات بجسم ما ترتد على شكل صدى Echo ،عند ارتداد هذه الموجات يتم حساب الزمن الذي استغرقته للعودة إلى المستشعر ثم يتم حساب المسافة.
قم بتوصيل الدارة كما هو موضح بالصورة التالية :
تم توصيل حساس الموجات الفوق صوتية (Ultrasonic) مع الأردوينو كما هو موضح بالصورة :
قم توصيل محرك السيرفو كما هو موضح بالجدول :
الطرف | التوصيل |
الاحمر | Vcc / 5 V |
البرتقالى | Arduino Pin 9 |
البنى | Ground |
يتم تثبيت حساس الموجات الصوتية فوق محرك السيرفو، ينتمكن من إلتقاط الأبعاد للمكان بالكامل. انظر إلى الصورة التالية :
سنقوم بكتابة برنامج يقوم بإرسال إشارة دوران محرك السيرفو بزاوية معينة وحساب المسافة الموجودة امام المستشعر عند تلك الزاوية. ثم يتم ارسال هذه النتائج إلى المنفذ التسلسلي.
وبدلا من قراءة هذه النتائج على الشاشة التسلسلية (Serial Monitor) نقوم بتشغيل برنامج الماتلاب. نقوم بالماتلاب بعمل كود خاص به ليتم تشغيله لإجراء بعض الحسابات ومن ثم إعطاء مخطط بسيط لخريطة المكان.
#include <Servo.h> #include <NewPing.h> #define TRIGGER_PIN 12 #define ECHO_PIN 11 #define MAX_DISTANCE 200 NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); Servo myservo; int pos = 0; int it = 10; void setup() { myservo.attach(9); Serial.begin(9600); delay(3000); } void loop() { int i = 0; int t = 0; int a = 0; for (i = 0; i < 180; i ++) { unsigned int uS = sonar.ping(); myservo.write(i); delay(20); for (t = 0; t < it; t++) { uS = sonar.ping(); a = uS/US_ROUNDTRIP_CM + a; delay(30); } a = a / (it-1); t = 0; Serial.println(a); a = 0; } }
في البداية قمنا بادراج المكتبات المستخدمة مثل مكتبة السيرفو ومكتبة حساس الموجات فوق الصوتية ثم قمنا بتسمية منافذ الأردوينو المستخدمة في المشروع :
#include <Servo.h> #include <NewPing.h> #define TRIGGER_PIN 12 #define ECHO_PIN 11 #define MAX_DISTANCE 200
بعد ذلك اعلنا عن المتغيرات اللازمة مثل المتغيرات الخاصة بالسيرفو و حساس الموجات فوق الصوتية والتي تستخدمها المكتبات ايضا. اعلنا عن متغير pos المستخدم في تسجيل موضع السيرفو و المتغير it المستخدم كعداد.
NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); Servo myservo; int pos = 0; int it = 10;
في الدالة ()setup قمنا بوضع الاعدادات اللازمة مثل تشغيل السيرفو و السيريال ثم الانتظار 3 ثوان حتى نضمن ان المحرك اصبح في وضعه الصحيح :
void setup() { myservo.attach(9); Serial.begin(9600); delay(3000); }
في الدالة ()loop نقوم بتحريك السيرفو حركة واحدة واخذ 10 قراءات للحساس، لحساب المتوسط لها، ثم كتابتها على المنفذ التسلسلي الذي لاحقا سنقوم باستقبال النتائج من خلاله على برنامج الماتلاب.
ثم بعد ذلك نقوم بتحريك السيرفو درجة اخرى و ننفذ كل ماسبق مرة اخرى و هكذا حتى يكتمل دوران السيرفو 180 درجة .
void loop() { int i = 0; int t = 0; int a = 0; for (i = 0; i < 180; i ++) { unsigned int uS = sonar.ping(); myservo.write(i); delay(20); for (t = 0; t < it; t++) { uS = sonar.ping(); a = uS/US_ROUNDTRIP_CM + a; delay(30); } a = a / (it-1); t = 0; Serial.println(a); a = 0; } }
السبب في اخذ 10 قراءات و حساب المتوسط لها للحصول على دقة أعلى، لان من الممكن ان تكون احدى القراءات غير سليمة بسبب الضوضاء او لأي سبب اخر.
بعد رفع كود الأردوينو نقوم بتشغيل برنامج الماتلاب عم طريق كتابة الكود الخاص بالماتلاب في ملف file.m . اي عند كتابة كود الماتلاب في ملف نصي تأكد من أن الإمتداد له m. أو قم بإنشاء ملف script من داخل اماتلاب وضع الكود به.
theta = 0:(pi/180):pi; s = serial('/dev/ttyS1011'); s.BaudRate=9600 fopen(s) i = 0; inc = 1; while i<180 A = fgets(s); num(i+1) = str2num(A); i = i+1; end fclose(s) j = 1 while j<181 tab(j,1) = (j-1)*inc tab(j,2) = num(j) tab(j,3) = num(j)*cosd((j-1)*inc) tab(j,4) = num(j)*sind((j-1)*inc) j = j+1 end %figure %polar(theta,num) plot(tab(:,3),tab(:,4))
يقوم الكود بإستقبال ما يتم رسله من قبل الأردوينو على المنفذ التسلسلي. بعد ذلك، يقوم بعمل بعض العمليات الحسابية على البيانات المستلمة وثم يقوم بتجميع النتائج في مصفوفة ضخمة. في النهاية يقوم بعمل مخطط للنتائج.
التغيير الوحيد الذي ستقوم بة في كود الماتلاب هو تغير اسم منفذ السيريال الذي يستخدمه الاردوينو.
فتقوم بتغييرة الى COM0 او COM1 او ايا كان اسم المنفذ الذي يستخدمة الاردوينو
و بعد ان تنتهي من كل شيء تقوم بضغط Run في برنامج الماتلاب و تنتظر إلى ان ينتهي السيرفو من عمل المشوار كامل ثم تظهر النتائج على الشاشة
ملاحظة : عند تشغيل كود الماتلاب تاكد ان لا يكون الSerial Monitor الخاص ببرنامج الاردوينو مفتوح
في هذا المشروع سنقوم بعمل جهاز لمراقبة وقياس درجة الحرارة . سيتم قياس درجة الحرارة بإستخدام حساس درجة الحرارة LM35، وعرض درجة الحرارة الحالية والمطلوبة من خلال شاشة العرض.
استقبال أمر من الأردوينو وتنفيذه، على سبيل المثال : أمر التهيئة ومسح الشاشة:
lcd.begin(16,2); lcd.clear();
استقبال معلومات من الأردوينو وعرضها، على سبيل المثال : كتابة جملة معينة :
lcd.print("Hello");
هو عبارة عن عنصر إلكتروني يتأثر بالحرارة ويعطي خرج كهربائي على شكل فولت يمكننا قياسه. أي أن الجهد الكهربائي الناتج منه يتناسب طرديا مع درجة الحرارة فكلما كانت درجة الحرارة عالية كلما كانت الفولتية الناتجة منه عالية.
مُخرج هذا الحساس يكون قيمة تناظرية (Analog) ، اي نحتاج إلى توصيله على أحد المنافذ التناظرية (Analog) في الأردوينو. الأطراف التناظرية في الأردوينو من A0 إلى A5 .
الطرف (بداية من اليسار) | التوصيل |
1 | Vcc |
2 | Output To Arduino |
3 | Ground |
يجب التدقيق في عملية التوصيل، لأنه في حال توصيل الأطراف بشكل خاطىء قد يتسبب في تلف العنصر. ولاحظ عند توصيل العنصر يتم وضعه بحيث تكون الناحية المسطحة مواجهة لنا.
قم بتوصيل الدارة كما هو موضح بالصورة التالية :
سيقوم الحساس LM35 بقياس درجة الحرارة بإستمرار وعرضها على شاشة الـ LCD وبإستخدام مفتاح التحكم (Push Buttons) يمكننا التحكم في رفع أو خفض درجة الحرارة المطلوبة في المكان.
قم بكتابة الكود التالي ورفعه على الأردوينو :
#include <LiquidCrystal.h> #define tempPin A0 #define tup 10 #define tdown 9 float temp; int defC = 23; int upstate = 0; int downstate = 0; LiquidCrystal lcd(7, 6, 5, 4, 3, 2); void setup() { lcd.begin(16, 2); lcd.setCursor(0, 0); lcd.print("Config.."); delay(900); lcd.clear(); pinMode(tup, INPUT); pinMode(tdown, INPUT); } void loop() { upstate = digitalRead(tup); downstate = digitalRead(tdown); int tvalue = analogRead(tempPin); if (upstate == HIGH) { defC = defC + 1; } if (downstate == HIGH) { defC = defC - 1; } temp = tvalue * 0.48828; lcd.setCursor(0, 0); lcd.print("Current "); lcd.print (temp); lcd.print ('C'); lcd.setCursor (0, 1); lcd.print ("Desired "); lcd.print (defC); lcd.print ('C'); delay(200); }
في البداية، نقوم بإضافة المكتبة الخاصة بشاشة الـ LCD :
#include <LiquidCrystal.h>
ثم نقوم بتسمية منافذ الأردوينو المستخدمة في المشروع :
#define tempPin A0 #define tup 10 #define tdown 9
بعد ذلك، نقوم بالإعلان عن المتغيرات التي سيتم استخدامها في البرنامج لتسجيل قيم درجات الحرارة :
float temp; int defC = 23; int upstate = 0; int downstate = 0;
يتم تسجيل درجة الحرارة الناتجة من حساس الحرارة على المتغير temp. واستخدام المتغير defC لتسجيل درجة الحرارة المطلوبة. والمتغير upstate لتسجيل حالة المفتاح الأول الخاص برفع درجة الحرارة المطلوبة. والمتغير downstate لتسجيل حالة المفتاح الثاني الخاص بخفض درجة الحرارة المطلوبة.
ثم نقوم بإنشاء المتغير الخاص بشاشة الـ LCD وتحديد الأرجل التي سيتم توصيلها مع الأردوينو :
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);
في الدالة ()setup، نقوم بضبط الإعدادات اللازمة، كإعدادات شاشة الـ LCD وضبط المفاتيح (Push Buttons) كمخرج :
void setup() { lcd.begin(16, 2); lcd.setCursor(0, 0); lcd.print("Config.."); delay(900); lcd.clear(); pinMode(tup, INPUT); pinMode(tdown, INPUT); }
في الدالة ()loop، نقوم بقراءة المفاتيح (Push Buttons) ، وقراءة قيمة الجهد الناتج من الحساس :
upstate = digitalRead(tup); downstate = digitalRead(tdown); int tvalue = analogRead(tempPin);
ثم نقوم بإختبار ما إذا تم الضغط على المفاتيح. فعند الضغط على مفتاح زيادة درجة الحرارة المطلوبة نقوم بإضافة 1 إلى درجة الحرارة المسجلة في المتغير defC. ويتم العكس عند الضغط على مفتاح خفض درجة الحرارة المطلوبة :
if (upstate == HIGH) { defC = defC + 1; } if (downstate == HIGH) { defC = defC - 1; }
ونقوم بإستخدام قيمة الجهد الناتج من الحساس لإيجاد قيمة درجة الحرارة عن طريق المعادلة التالية :
temp = tvalue * 0.48828;
وأخيرا، يتم عرض درجة الحرارة الحالية وأيضا درجة الحرارة المطلوبة على شاشة الـ LCD :
lcd.setCursor(0, 0); lcd.print("Current "); lcd.print (temp); lcd.print ('C'); lcd.setCursor (0, 1); lcd.print ("Desired "); lcd.print (defC); lcd.print ('C'); delay(200);
في هذا الدرس ستتعلم استخدام مستشعر الحركة ‘Motion PIR sesnor’ وجعل الأردوينو يرسل بريد إلكتروني حالما يستشعر الحركة عبر برنامج كتب بالبايثون Python بكمبيوترك.
يقوم متحكم الأردوينو بإنتظار إشارة من مستشعر الحركة ‘Motion PIR sensor’، وفور حصولة على اشارة من المسشتعر تشير لوجود تحرك ، يقوم متحكم الأردوينو بإرسال الأمر لجهاز الكمبيوتر عبر منفذ USB لإرسال البريد الإلكتروني.
لتنفيذ هذا المشروع عليك توفي القطع التالية ، كما يجب توفير جهاز كمبيوتر أو لابتوب متصل بالإنترنت (حتى يمكنك ارسال البريد الإلكتروني)
PIR Sensor
مستشعر الحركة
Half-sized Breadboard
Arduino Uno R3
Jumper wires
كما تلاحظ الشي الوحيد الذي تقوم بتوصيله هنا هو مستشعر الحركة ‘PIR sensor’ مع الأردوينو ، فيمكنك ربطه مباشره بالأردوينو عوضاُ عن استخدام لوح التجارب اذا رغبت ولكن احرص على ثبات اسلاك التوصيل.
متحكم الأردوينو سيقوم بإرسال رسالة عبر الاتصال التسلسلي ‘Serial Connection’ المتصل بالكمبيوتر عبر منفذ USB كلما تم اسشعار حركة .
ولكن هذا يعني انه قد يقوم بإرسال الكثير من الإيميلات الإلكترونية نظراً لتكرار الحركة اما المستشعر. لذلك سيقوم متحكم الإردوينو بإرسال رسالة مختلفة اذا سبق وارسل ايميل الكترونية خلال دقيقه.
int pirPin = 7; int minSecsBetweenEmails = 60; // 1 min long lastSend = -minSecsBetweenEmails * 1000l; void setup() { pinMode(pirPin, INPUT); Serial.begin(9600); } void loop() { long now = millis(); if (digitalRead(pirPin) == HIGH) { if (now > (lastSend + minSecsBetweenEmails * 1000l)) { Serial.println("MOVEMENT"); lastSend = now; } else { Serial.println("Too soon"); } } delay(500); }
يمكنك تغيير القيمه المسجله في ‘minSecsBetweenEmails’ لأي قيمه تجدها مناسبة.
هنا وضعنا القيمه لتكون 60 ثانية ، حتى لا يتم ارسال الايميلات الالكترونية لمدة دقيقه .
نستخدم المتغير ‘lastSend’ لننتبع متى تم ارسال آخر ايميل الكتروني.
تم تعريف الرقم “بالسالب” والمأخوذ من متغير ‘minSecsBetweenEmails’ ، وتم فعل ذلك حتى نضمن أن يتم تفعيل مستشعر الحركة بشكل مباشر بعد تشغيل متحكم الأردوينو مباشرة.
داخل دالة loop ، دالة ‘millis()’ استخدمت للحصول على عدد أجزاء الثانية منذ بداية تشغيل الأردوينو حتى يتم المقارنة ببينها وبين المره الأخيرة التي تم تسجيل الايتشعار ، حيث سيتم ارسال رسالة “Movement ” اي “حركة” اذا كانت المده قد تجاوزت أكثر من 60 ثانية ، والا فسوف يتم ارسال الرسالة “Toosoon” اي “من المبكر جداً”
قبل ربط المشروع ببرنامج Python قم بتجربة الكود وذلك عبر فتح شاشة الاتصال التسلسلي Serial Monitor في برنامج الأرديونو ‘Arduino IDE’.
اذا كنت تستخدم نظام تشغيل لينكس أو ماك ، فإن الـPython موجود مسبقاً .واذا كنت تسخدم الويندوز فإنه يتوجب عليك تحميله وتنصيبه .
كما يجب عليك (في كل نظم التشغيل) تحميل وتنصيب مكتبة PySerial للسماح بالتواصل مع الأردوينو.
تحميل وتنصيب Python على الويندوز
لتحميل Python على الويندوز، عليك تحميله من http://www.python.org/getit/
ننصح استخدام النسخة Python 2 وذلك لتوافقها بشكل أفضل.
بعد تنصيب البايثون على جهازك ، علينا اجراء التعديلات ليتم السماح بتنفيذ اوامره في شاشة الأوامر ‘Command Prompt’، يهمنا ذلك لنتمكن من تحميل وتنصيب PySerial>
علينا اضافة مترجم اوامر البايثون إلى امتدادات الأوامر – PATH environment variable
لفعل ذلك ، عليك الذهاب للوحة تحكم الويندوز والعثور على ‘System Properties control’.
ثم الضغط على ‘Environment Variables’ ، ثم اختيار ‘Path’ ، باسفل قائمة (System Variables) قم بالضغط على ‘Edit’، وبنهاية ‘Variable Value’ وبدون أي عديل على النص الموجود ،قم باضافة النص ‘C:\Python27;’ (أومكان الملف الذي قمت بتحديده للبايثون)
لاتنسى إضافة ‘ ; ‘ قبل اضافة النص.
للتأكد من نجاح العملية ، قم بفتح شاشة الأوامر (Dos Prompt) وادخل الأمر ‘python’ ، من المفترض مشاهدة النتيجة التالية:
مهما اختلف نظام التشغيل الموجود على جهازك (لينكس ، ماك ، ويندوز ) ، قم بتحميل باقة .tar.gz لـPySerial 2.7 من
https://pypi.python.org/pypi/pyserial
هذا سيعطيك ملف اسمه: pyserial-2.7.tar.gz
اذا كنت تستخدم الويندوز ، عليك فك ضغط الملف عبر اداة (http://www.7-zip.org/) 7-zip
اذا كنت تستخدم لينكس أو مالك ، قم بفتح شاشة terminal ، واذهب لمجلد الملف pyserial-2.7.tar.gz وقم بتنفيذ الأمر التالي للقيام بفك الضغط
$ tar -xzf pyserial-2.6.tar.gz
الأمر التالي يتم تنفيذه مهما كان نظام التشغل الذي تستخدمه ، اذهب لمجلد pyserial2.7 ثم نفذ الأمر:
sudo python setup.py install
والآن عليك عمل برنامج بلغة البايثون. لفعل ذلك ، قم بنسخ الكود التالي ووضعه بملف نصي وقم بتسميته بـ ‘movement.py’ .
يمكنك فعل ذلك في نظام التشغيل لينكس أو ماك عبر استخدام محرر ‘nano’، اما بالنسبة للويندوز فيفضل استخدام محرر البايثون في ‘IDLE’ والذي ستجده في شاشة ابدأ بعد تنصيبه.
import time import serial import smtplib TO = 'email@gmail.com' GMAIL_USER = 'email@gmail.com' GMAIL_PASS = 'yourPasswordHere' SUBJECT = 'Intrusion!!' TEXT = 'Your PIR sensor detected movement' ser = serial.Serial('COM4', 9600) def send_email(): print("Sending Email") smtpserver = smtplib.SMTP("smtp.gmail.com",587) smtpserver.ehlo() smtpserver.starttls() smtpserver.ehlo smtpserver.login(GMAIL_USER, GMAIL_PASS) header = 'To:' + TO + '\n' + 'From: ' + GMAIL_USER header = header + '\n' + 'Subject:' + SUBJECT + '\n' print header msg = header + '\n' + TEXT + ' \n\n' smtpserver.sendmail(GMAIL_USER, TO, msg) smtpserver.close() while True: message = ser.readline() print(message) if message[0] == 'M' : send_email() time.sleep(0.5)
قبل تجربة البرنامج ، هنالك بعض الاعدادات التي يجب تعديلها .
قمنا بوضع اعدادت حساب بريد Gmail ، لذا ان لم ليكن لديك حساب على Gmail ، فقم بتسجيله .
قم بوضع البريد الإلكتروني الذي تغب باستلام الاشعارات عليه في خانة ‘To’.
قم بوضع بريدك(حساب Gmail) في قيمة متغير ‘GMAIL_USER’
قم بوضع كلمة المرور للبريد في قيمة متغير ‘GMAIL_PASS’
كما يمكنك تعديل عنوان البريد ونص الرسالة التي يتم ارسالها.
كما يجب عليك اعداد منفذ الاتصال Serial Port للأردوينو عبر تعديل السطر التالي:
ser = serial.Serial('COM4', 9600)
في نظام الويندوز سيكون مثل ‘COM4’ ، وفي نظام لينكس أو ماك ستكون مثل ‘/dev/tty.usbmodem621’. يمكنك معرفة ذلك عبر فتح برنامج Arduino IDE ومشاهدة يمين الجزء الأسفل .
بعد تعديل الاعدادات ، يمكنك تنفيذ البرنامج عبر كتابة الأمر التالي في شاشة الأوامر
python movement.py
عند استشعار حركة ، يفترض ان تشاهد تتبع كالتالي ، وخلال فترة قصيرة سيصلك ايميل الكتروني للبريد الذي ادخلته .
لاحظ رسائل ‘Too Soon’ والتي ترسل اذا تم استشعار حركة خلال 60 ثانية من ارسال الايميل الأخير ( حتى لا يتم ارسال ايميلات الكترونية كثيره )
والآن وقد تعلمت كيفية ارسال الايميل الالكتروني واستخدام مستشعر الحركة ، يمكنك استخدام انواع اخرى من المستشعرات وارسال القراءات عبر البريد الإلكتروني (مثل ارسال درجة الحرارة والرطوبة )
في هذا الدرس سنقوم بإظهار درجة الحرارة ودرجة سطوع اضاءة الغرفة على الشاشة الكرستالية LCD
سنقوم بقياس درجة سطوع اضاءة الغرفة عبر مستشعر الاضاءة ‘photocell’ الذي قمنا بإستخدامه في الدرس العاشر.
لقياس درجة الحرارة ، سنقوم بإستخدام مستشعر الحرارة . هذه الاداة تمتلك ثلاث رؤوس ، واحدة للحصول على طاقة 5V وواحدةللمخرج الأرضي GND وواحدة لأجل التوصيل إلى مدخل تناظري analog input بالأردوينو.
LCD Display (16×2 characters)
10kΩ variable resistor (pot)
مقاوم متغير
1kΩ Resistor
Photocell
TMP36 temperature sensor
مستشعر الحرارة
Half-size Breadboard
Arduino Uno R3
Jumper wires
تصميم لوح التجارب يعتمد على تصميم الدرس الثاني عشر
قمنا بتغيير بعض التوصيلات في التصميم كما تلاحظ ، تحديداً التوصيلات التي حول المقاوم المتغير ‘pot’ .
مستشعر الضوء ‘photocell’ والمقاومه 1kΩ و مستشعر الحرارة TMP36 هي الاضافات التي قمنا باضافتها للوح التجارب. الجزء المقوس لمستشعر الحرارة TMP36 يكون بإتجاه الشاشة.
الكود البرمجي لهذا الدرس يعتمد على الكود البرمجي للدرس الثاني عشر، وقمنا باضافة بعض الاسطر لقراءة درجة الحرارة ودرجة سطوع ضوء الغرفة لاظهارها على شاشة LCD
#include <LiquidCrystal.h> int tempPin = 0; int lightPin = 1; // BS E D4 D5 D6 D7 LiquidCrystal lcd(7, 8, 9, 10, 11, 12); void setup() { lcd.begin(16, 2); } void loop() { // Display Temperature in C int tempReading = analogRead(tempPin); float tempVolts = tempReading * 5.0 / 1024.0; float tempC = (tempVolts - 0.5) * 100.0; float tempF = tempC * 9.0 / 5.0 + 32.0; // ---------------- lcd.print("Temp F "); lcd.setCursor(6, 0); lcd.print(tempF); // Display Light on second row int lightReading = analogRead(lightPin); lcd.setCursor(0, 1); // ---------------- lcd.print("Light "); lcd.setCursor(6, 1); lcd.print(lightReading); delay(500); }
في السطر التالي قمنا بوضع تعليق ‘comment’ لمعرفة التوصيلات مابين منافذ الأردوينو ورؤوس شاشة الـLCD
// BS E D4 D5 D6 D7 LiquidCrystal lcd(7, 8, 9, 10, 11, 12);
هذا يسهل عملية التعديل واستخدام منافذ اخرى من اختيارك اذا رغبت لاحقاً.
في دالة setup هنالك امرين علينا القيام بها ، الأول علينا تحويل القيمة التناظرية analog لمستشعر الحرارة إلى مقياس حرارة صحيح ، والثاني هو اظهارها على شاشة الـLCD
أولا لنلقي نظرة على طريقة تحويل واحتساب درجة الحرارة
int tempReading = analogRead(tempPin); float tempVolts = tempReading * 5.0 / 1024.0; float tempC = (tempVolts - 0.5) * 100.0; float tempF = tempC * 9.0 / 5.0 + 32.0;
قمنا بالسطر الأول بقراءة القيمة التناظرية من مستشعر الحرارة وتخزين القيمة في tempReading
السطر الثاني قمنا بضرب قيمة tempReading في 5 ثم القسمة على 1024 وتخزين الناتج في tempVolts وهي قيمة الجهد ( مابين 0 و 5 )
السطر الثالث قمنا بطرح 0.5 من قيمة tempVolts (الجهد) ثم ضربها في 100 وتخزين القيمة في tempC وذلك لتحويل الجهد إلى درجة الحرارة C
السطر الرابع قمنا بضرب قيمة tempC (درجة حرارة C) في 9 ثم قسمتها على 5 ثم جمعها+32 وتخزين القيمة في tempF وذلك لتحويل درجة الحرارة C إلى درجة حرارة F
عرض القراءات على شاشة LCD قد تكون صعبة وذلك لاستمرار تغير قيم القراءات وعدد خانات القراءة مما يجعل خانات القراءة القديمة تذهب يسار الشاشة.
لحل هذه المشكلة ، كل ماعليك فعله هو طباعة السطر كاملاً في كل مره ، داخل دالة loop.
// ---------------- lcd.print("Temp F "); lcd.setCursor(6, 0); lcd.print(tempF);
سطر التعليق ‘comment’ وضع لاجلك حتى تعرف عدد الخانات 16 التي يمكن اظهارها في شاشة LCD في حال رغبت في بتغيير الجمل التي ترغب وضعها اسفلها.
لملء الفراغات ، قم بتحديد موضع المؤشر حيث بداية الخانة التي ترغب بإظهارها على الشاشة.
قمنا بعمل نفس الطريقة مع مستشعر الاضاءة ‘photocell’ ، لايوجد مقياس لدرجة سطوع الضوء لذلك قمنا بإظهار القراءة التناظرية analogRead التي حصلنا عليها من المستشعر مباشرة على الشاشة.
حاول ان تظهر درجة الحرارة المئوية C بدلاً من الفهرنهايت F
في هذا الدرس ستتعلم كيفية اصدار الاصوات بمتحكم الأردوينو.
اولاً ستقوم بتشغيل مقطع صوتي ، ثم القيام بالتلاعب بمستوى الصوت عبر المستشعر الضوئي ‘photocell’.
1 kΩ Resistor
Piezo sounder
سماعة البيزو
Photocell
المستشعر الضوئي
Half-size Breadboard
Arduino Uno R3
Jumper wires
في هذا الجزء ستجد ان سماعة البيزو ‘piezo buzzer’ موضوعه على لوح التجارب . واحده من ارجل القطعه موصولة بالمجال الأرضي GND والرجل الأخرى مربوطه بالمنفذ الرقمي digital pin 12 .
قم برفع الكود البرمجي التالي على متحكم الأردوينو
int speakerPin = 12; int numTones = 10; int tones[] = {261, 277, 294, 311, 330, 349, 370, 392, 415, 440}; // mid C C# D D# E F F# G G# A void setup() { for (int i = 0; i < numTones; i++) { tone(speakerPin, tones); delay(500); } noTone(speakerPin); } void loop() { }
لتشغيل مقطع صوتي ، تقوم بتحديد المجال الترددي . انظر للجزء التالي من الدرس المخصص للصوت .
كل مجال ترددي لكل نوته صوتية تم الاحتفاظ به في مصفوفه ‘array’ . المصفوفه ‘array’ هي مثل القائمة ، وبذلك يتم تشغيل المقطع عبر الانتقال لكل نوته صويته بالقائمه.
في حلقة ‘for’ loop سيبدأ العد من 0 وحتى 9 باستخدام القيمه i . للحصول على المجال الترددي للنوته الصوتية لتشغيلها بكل خطوه نقوم باستخدام ‘tone‘. هذا يعني ان القيمة الموجودة في مصفوفة ‘tones’ في موضع ‘i’
كمثال ، قيمة ‘[0]tones’ هي 261 ، وقمية ‘[1]tones’ هي 277 .. وهكذا ..
الأمر ‘tone’ في الأردوينو يقوم بأخذ متغيرين اثنين ، الأول هو المنفذ الذي يقوم بتشغيل المقطع الصوتي والثاني هي التردد الصوتي للمقطع لتشغيله.
عند الانتهاء من تشغيل من جميع النوتات الصوتية ، أمر ‘noTone’ يقوم بإيقاف تشغيل الصوت.
كان بإمكاننا ان نضع الكود البرمجي لتشغيل الاصوات داخل دالة loop عوضاَ عن دالة setup وذلك لأنها ستكرر المقطع الصوتي مره بعد مره دون توقف مما سيتسبب بالإزعاج لذلك تم وضعه داخل دالة setup
لذلك دالة loop فارغة .
لاعادة تشغيل المقطع الصوتي كل ماعليك فعله هو الضغط على زر reset الموجود بمتحكم اردوينو .
الصوت هو عبارة عن ذبذبة في ضغط الهواء . سرعة الذبذبة (دورات بالثانية أو هيرتز ) هي مايصدر الصوت. كلما زادت قوة الذبذبة كلما زاد علو الصوت.
المتوسط C عادة يعرف بالتردد 261Hz. وكأنك قمت بتشغيل واطفاء منفذ رقمي ‘digital pin’ لاكثر من 261 مره بالثانية .
لسماع النتيجة ، علينا القيام بتركيب قطعه تقوم بترجمة التردادت الالكترونية إلى صوت . هذا يمكن عن طريق تركيب سماعات كبيره او عبر استخدامنا لسماعة البيزو ‘piezo sounder’.
سماعة piezo تستخدم نوع خاص من الكريستال تتمدد وتنكمش كتردد الكتروني والتي ينتج عنها الصوت.
هذه الآلة تقوم بإصدار اصوات غريبة عند تمرير يدك امامها ،
سنقوم بصنع آلة مشابهه في الوظيفة للتحكم والتأثير على مستوى الصوت بمجرد تمرير يدك فوق المستشعر الضوئ ‘photocell’.
سنقوم باضافة المستشعر الضوئي ‘photocell’ و المقاوم resistor للوح التجارب.
قم برفع الكود التالي على متحكم الاردوينو
int speakerPin = 12; int photocellPin = 0; void setup() { } void loop() { int reading = analogRead(photocellPin); int pitch = 200 + reading / 4; tone(speakerPin, pitch); }
الكود واضح ، نستخدم المنفذ التناظري ‘analog pin’ للقراءة من A0 لقياس الضوء. وستكون القيمة مابين 0 و 700.
اضفنا القيمة 200 لجعل التردد 200Hz كأقل تردد ، وببساطه يتم اضافة القراءه عبر قسمة القيمة على 4 ، لاصدار تردد مابين 200Hz و 370Hz.
حاول تغيير القيمة 4 بالسطر التالي لخفض القيم المرتفعة
int pitch = 200 + reading / 4;
تغيير القيمه سيرفع أو يقلل من التردد اعتماداً على الرقم الذي قمت بوضعه.
حاول التلاعب بقيم النوتات الصوتية لترى ماذا سيحدث..
ستتعلم في هذا الدرس كيفية قياس قوة الاضاءة باستخدام المدخل التناظري ‘analog input’.
ستستخدم ماتعلمته في الدرس التاسع، واستخدام قوة الاضاءة بالغرفة للتحكم في عدد مصابيح الـLEDs التي يتم اضاءتها.
تم استبدال المقاوم المتغير ‘pot’ في الدرس التاسع ووضعنا مكانه المستشعر الضوئي ‘photocell’
5mm red LED
عدد 8
270 Ω Resistors
عدد 8
1 kΩ Resistor
74HC595 Shift Register
Photocell
المستشعر الضوئي
Half-size Breadboard
Arduino Uno R3
Jumper wires
تصميم الدائرة في هذا الدرس هو نفس التصميم بالدرس التاسع ولكن قمنا باستبدال المقاوم المتغير ‘pot’ بـالمستشعر الضوئي ‘photocell’ و مقاومة 1 kΩ .
التالي هو تصميم لوح التجارب من الدرس التاسع
فقط قم بازالة المقاوم المتغير ‘pot’ واستبداله بالمستشعر الضوئي’photocell’ ومقاوم ..كالتالي
المستشعر الضوئي ‘photocell’ يعتبر مقاوم يعتمد على الضوء ويدعى احيانا بـ’LDR’ وذلك اختصار لـ Light Dependent Resistor.
المستشعر الضوئي يملك قوة مقاومه تصل حتى 50kΩ في الظلام الدامس و 500Ω عند وجود الاضاءة . يمكنان بواسطة متحكم الأردوينو أن نقرأ قيمة المقاومه للمستشعر عبر مدخل تناظري ‘Analog input’
أسهل طريقة للقيام بهذا هو ربطها مع مقاوم ثابث
المقاوم الثابت والمستشعر الضوئي ‘photocell’ معاً يعتبرون كالمقاوم المتغير ‘pot’، اعتماداً على كمية الضوء المسلطه على المستشعر الضوئي ‘photocell’ يتغير قدر المقاومة التي يقوم بها المستشعر الضوئي ‘photocell’
فاذا كانت كمية الضوء مشعة بالقدر الكافي فإن كمية المقاومه التي ينتجها المستشعر الضوئي أقل من المقاومه الثابته وبالتالي فكأنها عباره عن مقاوم متغير ‘pot’ تم رفع قيمة للقيمه القصوى. والعكس صحيح..
قم برفع الكود البرمجي التالي بمتحكم الأردوينو وقم بتغطيه المستشعر الضوئي بيدك ورفعها مره اخرى لترى مدى التأثير.
الكود التالي مشابه للدرس التاسع ولكن نظراً لإستخدامنا للمستشعر الضوئي قمنا ببعض التغيرات البسيطه
int lightPin = 0; int latchPin = 5; int clockPin = 6; int dataPin = 4; int leds = 0; void setup() { pinMode(latchPin, OUTPUT); pinMode(dataPin, OUTPUT); pinMode(clockPin, OUTPUT); } void loop() { int reading = analogRead(lightPin); int numLEDSLit = reading / 57; //1023 / 9 / 2 if (numLEDSLit > 8) numLEDSLit = 8; leds = 0; // no LEDs lit to start for (int i = 0; i < numLEDSLit; i++) { leds = leds + (1 << i); // sets the i'th bit } updateShiftRegister(); } void updateShiftRegister() { digitalWrite(latchPin, LOW); shiftOut(dataPin, clockPin, LSBFIRST, leds); digitalWrite(latchPin, HIGH); }
أول شيء قمنا بتغييره هو تسيمة المنفذ التناظري ‘analog pin’ من ‘potPin’ إلى ‘lightPin’ وذلك قمنا بتبديل المقاوم المتغير ‘pot’ بالمستعشر الضوئي ‘photocell’ .
التغيير الآخر هو السطر الذي يقوم باحتساب عدد مصابيح الـLEDs لإضاءتها
int numLEDSLit = reading / 57; // all LEDs lit at 1k
هذه المره قمنا بقسمة القراءة على 57 بدلاً من 114 من الدرس التاسع . بمعنى آخر قمنا بقسمتها على نصف القيمة السابقه حتى نقوم بتوزيعها على 9 مجموعات، ابتداءاً من (حيث لايتم اضاءة أي من المصابيح الثمانية) وحتى (اضاءة جميع المصابيح الثمانية) ، العامل الاضافي هو حساب قيمة المقاومه الثابته 1kΩ
هذا يعني انه عندما تكون قيمة المستشعر الضوئي ‘photocell’ هي 1kΩ (نفس قيمة المقاوم الثابت ) يتم قراءة الصف 1023 وقسمته على 2 = 511 . بذلك يتم اضاءة جميع المصابيح (numLEDSLit ستكون 9)
لتغيير مقدار حساسية المستشعر للضوء قم بتغيير القيمة 57 التي يتم قسمة القراءه عليها.
زيادة القيمه ستجعل من المستشعر أقل حساسية.