قياس الجهد باستخدام الاردوينو

إن معرفة جهد مصدر الطاقة ضروري، في كافة المشاريع حتى لا يحدث أي خطأ بتوصيل جهد زائد  والتسبب في تلف الدائرة،  أو جهد أقل و الإخلال بأدائها، و من هنا تكمن أهمية أجهزة قياس الجهد المتعددة، في هذا الدرس سنساعدك على صنع مقياس جهد التيار المستمر بنفسك وذلك باستخدام الاردوينو (Arduino) و مستشعر جهد التيار

 

voltmeter

 

المواد والأدوات

اردوينو

X1 اردوينو اونو

DC-Voltage-Sensor

X1 مستشعر جهد التيار المستمر

LCD

X1 الشاشة الكرستالية

X1لوحة تجارب

arduino-usb-lead-blue

X1 سلك اردوينو

مقاومة متغيرة

1X مقاومة متغيرة

أسلاك توصيل

مجموعة أسلاك توصيل (M/M)

us-sanitizer-without-touch

مجموعة أسلاك توصيل (M/F)

 

توصيل الدائرة

Arduino-Uno- voltage sensor

البرمجة

 

#include "LiquidCrystal.h"

const int voltageSensor = A0;

float vOUT = 0.0;
float vIN = 0.0;
float R1 = 30000.0;
float R2 = 7500.0;
int value = 0;

LiquidCrystal lcd(7, 6, 5, 4, 3, 2); // RS, E, D4, D5, D6, D7

void setup()
{
//Serial.begin(9600);
lcd.begin(16,2);
lcd.print(" Measure > 25V ");
delay(2000);
}

void loop()
{
value = analogRead(voltageSensor);
vOUT = (value * 5.0) / 1024.0;
vIN = vOUT / (R2/(R1+R2));
//Serial.print("Input = ");
//Serial.println(vIN);
lcd.setCursor(0,0);
lcd.print("Input = ");
lcd.setCursor(9,0);
lcd.print(vIN);
delay(500);
}

شرح الكود البرمجي

بالبداية يتطلب استدعاء مكتبة الشاشة الكرستالية

#include "LiquidCrystal.h"

نعرف منفذ لقراءة مستشعر جهد التيار المستمر

const int voltageSensor = A0;

نعرف قيمة ابتدائية للمتغيرات

float vOUT = 0.0;
float vIN = 0.0;

نعرف قيمة المقاومات الموجودة بالحساس

float R1 = 30000.0;
float R2 = 7500.0;
int value = 0;

نعرف منافذ الشاشة الكرستالية

LiquidCrystal lcd(7, 6, 5, 4, 3, 2); // RS, E, D4, D5, D6, D7

في دالة void setup() نكتب أوامر تهيئة الشاشة

void setup()
{

lcd.begin(16,2);
lcd.print(" Measure > 25V ");
delay(2000);
}

في دالة void loop() نأخذ القراءات من المستشعر و نكتب المعادلات لحساب قيمة الجهد
ليتم طباعتها على الشاشة الكرستالية

void loop()
{
value = analogRead(voltageSensor);
vOUT = (value * 5.0) / 1024.0;
vIN = vOUT / (R2/(R1+R2));
//Serial.print("Input = ");
//Serial.println(vIN);
lcd.setCursor(0,0);
lcd.print("Input = ");
lcd.setCursor(9,0);
lcd.print(vIN);
delay(500);
}



قياس شدة المجال المغناطيسي باستخدام الاردوينو

في هذا الدرس سنتعلم ما هو مستشعر المغناطيسية وبرمجته مع الاردوينو لقراءة قيم رقمية عند وجود مجال مغناطيسي، و قيم تناظرية لشدة المجال المغناطيسي تبدأ القراءة بقيمة أولية يحددها جهد الدخل ومقياس الجهد، وستزداد هذه القيمة أو تنقص اعتمادًا على شدة وقطبية المجال المغناطيسي.

المواد والأدوات

اردوينو

X1 اردوينو

سلك اردوينو

X1 سلك اردوينو

مستشعر المغناطيسية

X1 مستشعر المغناطيسية

اسلاك توصيل

مجموعة أسلاك توصيل (M/F)

 

مستشعر المغناطيسية

مبدأ عمل مستشعر تأثير هول

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

يتم وصف عمل مستشعر تأثير هول أدناه:

عندما يتدفق تيار كهربائي عبر المستشعر، تتحرك الإلكترونات خلاله في خط مستقيم.

linear-magnetic-hall-sensor-with-arduino
عندما يعمل مجال مغناطيسي خارجي على المستشعر، فإن قوة لورنتز تزيح حاملات الشحنة لتتبع مسارًا منحنيًا.
نتيجة لذلك، تنحرف حاملات الشحنة السالبة نحو جانب واحد من الموصل وحاملات الشحنة الموجبة إلى جانب آخر.
بسبب تراكم حاملات الشحنة الموجبة والسالبة في جوانب مختلفة من الموصل، يمكن ملاحظة جهد (فرق الجهد) بين جانبي اللوحة. الجهد الناتج يتناسب طرديا مع التيار الكهربائي وشدة المجال المغناطيسي.

linear-magnetic-hall-sensor-with-arduino

توصيل الدائرة

linear-magnetic-hall-sensor-with-arduino

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

int analogPin = A0;

int digitalPin = 3;

void setup() {
pinMode(digitalPin, INPUT);
Serial.begin(9600);
}

void loop() {
int analogVal = analogRead(analogPin);
int digitalVal = digitalRead(digitalPin);
Serial.print(analogVal);
Serial.print("\t");
Serial.println(digitalVal);
delay(100);
}

شرح الكود البرمجي 

نعرف المنافذ التناظرية و الرقمية التي تم توصيلها مع الحساس

int analogPin = A0; 
int digitalPin = 2;

نقوم بتهيئة الاتصال التسلسلي و تعريف منفذ الدخل

void setup() {
pinMode(digitalPin, INPUT);
Serial.begin(9600);
}

في دالة void loop() نقوم بقراءة القيم من الحساس و عرضها على شاشة الاتصال التسلسلي

void loop() {
int analogVal = analogRead(analogPin);
int digitalVal = digitalRead(digitalPin);
Serial.print(analogVal);
Serial.print("\t");
Serial.println(digitalVal);
delay(100);
}

 




إضاءة ذكية باستخدام مستشعر تجنب الحواجز بالأشعة تحت الحمراء

يستخدم مستشعر تجنب الحواجز بالأشعة تحت الحمراء (IR Obstacle Avoidance) مع اردوينو في عدد من التطبيقات مثل الروبوتات وأنظمة الأمان وخطوط الانتاج الصناعية. في هذا الدرس سنتعلم صنع اضاءة ذكية باستخدام مستشعر تجنب الحواجز بالأشعة تحت الحمراء وكيفية عمل الحساس في عد الزوار بالأماكن المغلقة مثل قاعات المؤتمرات والفصول الدراسية وجعل الاضاءة في هذه الأماكن تعمل فقط في حال وجود أفراد وذلك تجنبا للاستهلاك الزائد للطاقة وهدرها

إضاءة ذكية مستشعر تجنب الحواجز بالأشعة تحت الحمراء

المواد والأدوات المطلوبة

اردوينو

x1 اردوينو أونو

إضاءة ذكية مستشعر تجنب الحواجز بالأشعة تحت الحمراء

x2 مستشعر تجنب الحواجز بالأشعة تحت الحمراء

arduino-usb-lead-blue

x1 سلك أردوينو

lcd

x1 شاشة كرستالية

لوحة تجارب

x1 لوحة تجارب

ليدات 10 ملم

x1 LED

مقاومة متغيرة

x1 مقاومة متغيرة

مقاومة 220

x2 مقاومة 220 أوم

اسلاك توصيل

أسلاك توصيل (M/M)اسلاك توصيل

أسلاك توصيل (F/M)

مستشعر تجنب الحواجز بالأشعة الحمراء

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

إضاءة ذكية مستشعر تجنب الحواجز بالأشعة تحت الحمراء

فكرة عمل المشروع 

تعتمد فكرة المشروع على وجود حساسين تجاوز العقبات ، يزيد العداد أو ينقص اعتمادًا على اتجاه حركة الشخص ويتم تحديد ذلك من خلال أي من المستشعرين يكتشف الشخص أولاً.

إضاءة ذكية مستشعر تجنب الحواجز بالأشعة تحت الحمراء

توصيل الدائرة

إضاءة ذكية مستشعر تجنب الحواجز بالأشعة تحت الحمراء

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

قم برفع الكود البرمجي التالي على لوحة الاردوينو

#include <LiquidCrystal.h>
LiquidCrystal lcd(2, 3, 4, 5, 6, 7); 
#define sensorPin1 9
#define sensorPin2 10
#define led 8

int sensorState1 = 0;
int sensorState2 = 0;
int count=0;

void setup()
{
pinMode (sensorPin1, INPUT_PULLUP);
pinMode (sensorPin2, INPUT_PULLUP);
pinMode(led, OUTPUT);

lcd.begin(16,2);
lcd.setCursor(4,0);
lcd.print("COUNTER");
lcd.setCursor(0,1);
lcd.print("No Visitors ");
delay(200);
}

void loop()
{ 
sensorState1 = digitalRead(sensorPin1);
sensorState2 = digitalRead(sensorPin2);

if(sensorState1 == LOW){
count++; 
delay(500);
}

if(sensorState2 == LOW){
count--; 
delay(500);
}


if(count<=0)
{
digitalWrite(led, LOW); 
lcd.setCursor(0,1);
lcd.print("No visitors ");
}
else if (count>0 ){
digitalWrite(led, HIGH);
lcd.setCursor(0,1);
lcd.print("Visitors: ");
lcd.setCursor(12,1);
lcd.print(count);
lcd.setCursor(13,1);
lcd.print(" "); 

}
}

شرح الكود البرمجي

بالبداية نقوم باستدعاء مكتبة الشاشة الكرستالية LiquidCrystal و نعرف منافذ الشاشة و منافذ حساس تجنب العوائق و الليد

#include <LiquidCrystal.h>
LiquidCrystal lcd(2, 3, 4, 5, 6, 7); 
#define sensorPin1 9
#define sensorPin2 10
#define led 8

ننشئ متغير لحالة الحساس الأول و الثاني بقيمة ابتدائية 0

int sensorState1 = 0;
int sensorState2 = 0;

ننشئ متغير يمثل قيمة عدد الأفراد الموجودين بالغرفة

int count=0;

في دالة (void setup) نعرف منافذ الادخال و منافذ الاخراج للقطع المستخدمة ونقوم بتهيئة الشاشة

void setup()
{
pinMode (sensorPin1, INPUT_PULLUP);
pinMode (sensorPin2, INPUT_PULLUP);
pinMode(led, OUTPUT);

lcd.begin(16,2);
lcd.setCursor(4,0);
lcd.print("COUNTER");
lcd.setCursor(0,1);
lcd.print("No Visitors ");
delay(200);
}

في دالة ال(void loop) نقوم بقراءة اشارة الدخل من الحساس

void loop()
{ 
sensorState1 = digitalRead(sensorPin1);
sensorState2 = digitalRead(sensorPin2);

if(sensorState1 == LOW){
count++; 
delay(500);
}

if(sensorState2 == LOW){
count--; 
delay(500);
}

اذا كانت قيمة متغير عدد أفراد الغرفة (count) أقل أو يساوي 0 يتم ايقاف تشغيل الاضاءة و يتم طباعة “No Visitors” على الشاشة الكرستالية

if(count<=0)
{
digitalWrite(led, LOW); 
lcd.setCursor(0,1);
lcd.print("No visitors ");
}

اذا كانت قيمة متغير عدد أفراد الغرفة (count) وطباعة عدد أفراد الغرفة على الشاشة الكرستالية  أكبر من 0 يتم تشغيل الاضاءة

else (count>0 ){
digitalWrite(led, HIGH);
lcd.setCursor(0,1);
lcd.print("Visitors: ");
lcd.setCursor(12,1);
lcd.print(count);
lcd.setCursor(13,1);
lcd.print(" "); 

}

}



نظام أمان باستخدام الأردوينو ووحدة الاتصال اللاسلكي (SIM800l)

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

SMS و وحدة SIM800l

المواد والأدوات

اردوينو

X1 اردوينو 

SIM800l

X1 وحدة SIM800L

PIR SENSOR

X1 حساس الحركة

DC TO DC

X1 منظم جهد (DC TO DC)

Half-size Breadboard

X1 لوحة تجارب 

سلك يو اس بى A-B

X1سلك اردوينو 

اسلاك

 اسلاك توصيل(M/M) 

اسلاك

أسلاك توصيل (M/F)

 


وحدة SIM800L

 SIM800l

وحدة الاتصال اللاسلكي (SIM800L) تساعدك في مراقبة المنزل عن بعد أو تنشيط أي نظام داخل منزلك بمكالمة أو رسائل SMS عبارة عن مودم (GSM) مصغر فيمكن استخدامها لإجراء مهام ارسال أو استقبال الرسائل النصية القصيرة، إجراء مكالمات هاتفية أو استقبالها، الاتصال بالإنترنت من خلال (GPRS) و (TCP / IP)، يمكن استخدامها في عدد كبير من مشاريع إنترنت الأشياء. تحتاج أن تضيف شريحة 2G SIM في منفذ الشريحة لتتمكن من برمجته مع المتحكم حسب متطلبات مشروعك

مؤشر الوميض:

يوجد مؤشر الوميض أعلى الجانب الأيمن على وحدة الاتصال اللاسلكي (SIM800L) يشير إلى حالة شبكتك الخلوية. سيومض بمعدلات مختلفة لإظهار حالة الاتصال بالشبكة:

وميض كل ثانية :الوحدة قيد التشغيل ولكنها لم تتصل بالشبكة الخلوية.

SMS و وحدة SIM800l

وميض كل ثانيتين: تم تنشيط بيانات (GPRS)

SMS و وحدة SIM800l

وميض كل ثلاثة ثواني : اتصلت الوحدة بالشبكة الخلوية ويمكنها إرسال / استقبال الاتصال والرسائل القصيرة

منافذ وحدة الاتصال اللاسلكي (SIM800l)

SIM800l

الجدول التالي يوضح وظائف المنافذ

المنفذ في وحدة (SIM 800L) الوظيفة
NET منفذ للحام الهوائي الحلزوني المزود مع الوحدة .
VCC منفذ الطاقة للوحدة. من 3.4 فولت إلى 4.4 فولت. و 2أمبير عدم تزويد الوحدة بالطاقة بشكل كافي سيتسبب في عدم عملها بشكل صحيح
RST (Reset) RST (إعادة الضبط). سحب الدبوس LOW لمدة 100 مللي ثانية لإجراء إعادة تعيين ثابت.
RxD (Receiver) منفذ للاتصال التسلسلي
TxD (Transmitter) منفذ للاتصال التسلسلي
GND GND
RING دبوس مؤشر. يعطي اشارة HIGH افتراضيًا وسينبض LOW لمدة 120 مللي ثانية عند تلقي مكالمة. يمكن أيضًا تهيئته للنبض عند تلقي رسالة نصية قصيرة.
DTR لإلغاء وتنشيط وضع السكون حسب الاشارة التي يتم ارسالها له. إشارة HIGH تفعيل وضع السكون، وبالتالي تعطيل الاتصال التسلسلي. اشارة LOW تعطيل وضع السكون وتشغيل الوحدة.
MIC± مدخل المايكرفون
SPK± مدخل مكبر الصوت

توصيل الدائرة

قبل توصيل الدائرة عليك التأكد من أن خرج منظم الجهد (DC TO DC buck converter) يساوي 4.4 قد يتسبب زيادة الجهد إلى تلف وحدة الاتصال اللاسلكي (SIM800l)

SIM800l

البرمجة

برمجة هذا المشروع تحتاج إلى كتابة الشفرة البرمجية بلغة (C++)على بيئة التطوير المتكاملة للأردوينو Arduino IDE)) يمكن التعرف على البرنامج أكثر من خلال الرابط

أولا: عليك تحميل مكتبة (SoftwareSerial)

ثانيا: كتابة الأوامر البرمجية التالية

#include <SoftwareSerial.h>
SoftwareSerial mySerial(3, 2);
int p=7;
void setup()
{ 
pinMode(p, INPUT);
mySerial.begin(9600);
delay(1000);
}
void loop()
{int buttonState = digitalRead(7);
if (buttonState == HIGH) {
delay(1000);
mySerial.println("AT");
delay(500);
mySerial.println("AT+CMGF=1");
delay(500);
mySerial.println("AT+CMGS=\"+966XXXXXXXX\"\r");
delay(500);
mySerial.print("Warning! Motion detected!");
delay(500);
mySerial.write(26);}}

شرح الشفرة البرمجية (Code)

استدعاء مكتبة (SoftwareSerial)

 #include <SoftwareSerial.h>

تعريف منافذ الأردوينو التي تم توصيلها مع منافذ الارسال والاستقبال للاتصال التسلسلي (TX-RX) في وحدة الاتصال اللاسلكي (SIM800l) حيث تم توصيل المنفذ الرقمي 3 مع منفذ الاستقبال (RX) والمنفذ الرقمي 2 مع منفذ الارسال(TX)

 SoftwareSerial mySerial(3, 2);

تعريف منافذ الأردوينو الذي تم توصيل منفذ الخرج (Out) في حساس الحركة وهو المنفذ رقم 7

int p=7;

في دالة () void setup نُعرف منافذ الدخل والخرج

كذلك نقوم بتهيئة الاتصال التسلسلي

 
void setup()
{ 
pinMode(p, INPUT);
mySerial.begin(9600);
delay(1000);
}

في دالة void loop () سنعرف متغير يخزن داخله حالة حساس الحركة التي ستم قرأتها من المنفذ رقم 7
ثم نكتب الجملة الشرطية التي تجعل البرنامج ينتظر لمدة ثانية إذا كانت توجد حركة

 void loop()
{int buttonState = digitalRead(7);
if (buttonState == HIGH) {
delay(1000);

تحدد بروتوكولات ارتباط الاتصال في بداية الاتصال

mySerial.println("AT");
delay(500);

التشغيل على وضع نص SMS

mySerial.println("AT+CMGF=1");
delay(500);

تحديد الرقم الذي سيتم ارسال الرساله له

 
mySerial.println("AT+CMGS=\"+9665XXXXXX\"\r");
delay(500);

نص الرسالة الذي سيتم ارسالها في حال وجود حركة

 
mySerial.print("Warning! Motion detected!");
delay(500);
mySerial.write(26);}}

 




التحكم بالمصباح عن طريق الصوت باستخدام ليتل بيتس (LittleBits)

مقدمة

في درس التحكم بالمصباح  الصوت باستخدام ليتل بيتس ستتعلم التحكم بإغلاق وتشغيل المصباح  وكيفية توصيل قطع ليتل بيتس بالطريقة الصحيحة.

المواد والأدوات من ليتل بيتس

حتى تتمكن من تجميع مكونات نظام التحكم بالمصباح عن طريق الصوت تحتاج مجموعة (littleBits Base Inventor Kit) وحدات المبتكر ليتل بيتس:

Automatic-LED

1× مستشعر الصوت

Automatic-LED

2× سلك

Automatic-LED

1×حامل البطارية

Automatic-LED

1×سلك البطارية

Automatic-LED

1× بطارية

Automatic-LED

1× قالب الكرتوني رقم (5)

1× منفذ الطاقة

Automatic-LED ليتل بيتس

1×مزلاج

Automatic-LED

1× مصباح

Automatic-LED

1× لوحة

توصيل الدائرة

يعتبر كلًا من البطارية و منفذ الطاقة الموجدان في مجموعة ليتل بيتس، مسؤولان عن تزويد دائرتك بالطاقة اللازمة لتشغيلها.

ثبت البطارية على الحامل ثم ثبت سلك البطارية.

littlebits-alarm-proximity/

صل الطرف الثاني من سلك البطارية مع منفذ الطاقة.

ليتل بيتس

ثبت البطارية وسلك البطارية على اللوحة.

ليتل بيتس

اسحب السلك لمنفذ الطاقة، ثم اضف مستشعر الصوت للطرف الآخر.

ليتل بيتس

يقوم مستشعر الصوت الموجود في ليتل بيتس بالكشف عن درجة الصوت الموجودة بالقرب منه ثم يقوم بإرسال الإشارات للمزلاج لمدة 3 ثوانٍ، بعد ذلك سيضيء المصباح.

ليتل بيتس

اسحب الزر في مستشعر الصوت للمنتصف كما هو ظاهر.
يستخدم الزر لتحديد حجم الصوت المطلوب اكتشافه، يمكنك جعل حجم الصوت المطلوب أعلى أو أقل حسب احتياجات مشروعك.
ليتل بيتس

اسحب المزلاج لمستشعر الصوت، ثم اسحب المصباح  للمزلاج.

 يستخدم المزلاج لتحويل المدخلات اللحظية من مستشعر الصوت لمدخلات رقمية على شكل أمرين إما تشغيل أو إيقاف للمصباح.

ليتل بيتس

تجميع مكونات نظام التحكم بالمصباح عن طريق الصوت

ضع القالب الكرتوني بحيث يكون الجزء اللغير ملون والذي يحتوي على رقم القالب للأعلى.

littlebits-alarm-proximity/ ليتل بيتس

اطو القالب من المنتصف بحيث يتقابل الوجه الأول مع الوجه الثاني.

ليتل بيتس

 الوجه الأول يحتوي على وصلة تثبيت، و يقابله منفذ بالوجه الثاني، ثبت وصلة التثبيت داخل المنفذ المقابل له (لاحظ تطابق الأرقام بين الفتحة ووصلة التثبيت).

littlebits-alarm-proximity/

كرر نفس الخطوات مع المنفذ رقم 3 و المنفذ رقم 4.

littlebits-alarm-proximity/ ليتل بيتس

 شكل القالب الكرتوني بعد الطي.

littlebits-alarm-proximity/ ليتل بيتس

ادخل اللوحة في الفتحة المستطيلة للقالب الكرتوني.

تثبيت مكونات ليتل بيتس على اللوحة:

ثبت الدائرة على اللوحة.

الآن قد اكتمل نظام التحكم بالضوء عن طريق الصوت بعد تجميع كل مكونات ليتل بيتس.

افحص مجددًا تركيب النظام لترى انه متوافق مع الصور.

تأكد من تشغيل وحدة مزود الطاقة.

يمكنك إصدار أي صوت لتختبر النظام في حال أضاء المصباح فخطواتك صحيحة يمكنك الرجوع للخطوات السابقة في حال وجود مشكلة ما.

تذكر فصل وحدة مزود الطاقة عند الانتهاء من استخدام النظام.



التحكم بالإضاءة باستخدام مستقبل الأشعة تحت الحمراء(IRreceiver)

المقدمة

في هذا الدرس سنتعرف على طريقة برمجة مستقبل الأشعة تحت الحمراء (IR receiver) مع الأردوينو، ليساعدنا في التحكم بإضاءة الثنائي المشع للضوء، حيث نستخدم ريموت تحكم عن بعد لتشغيل الإضاءة، يمكن أن يساعدنا هذا المشروع ، للتحكم في الأجهزة المنزلية عن بعد و لاسلكيا.

irreceiver مستقبل الأشعة تحت الحمراء

المواد والأدوات

اردوينو

X1 اردوينو أونو 

سلك اردوينو

X1 سلك الأردوينو

rgbcontrol

 X1مستقبل الإشارات تحت الحمراء(IR receiver)

led-5mm-red

X3 الثنائي المشع للضوء 

مقاومة 220

X3 مقاومة 220أوم

لوحة تجارب

X1 لوحة تجارب 

أسلاك ذكر / ذكر

مجموعة أسلاك توصيل (ذكر/ذكر)

 

مستقبل الأشعة تحت الحمراء(IRreceiver )

يعد الاتصال بالأشعة تحت الحمراء (IR) تقنية لاسلكية مستخدمة على نطاق واسع وسهلة التنفيذ ولها العديد من التطبيقات المفيدة. من أبرز الأمثلة في الحياة اليومية التلفزيون

الأشعة تحت الحمراء
الأشعة تحت الحمراء هي شكل من أشكال الضوء مشابه للضوء الذي نراه من حولنا. الفرق الوحيد بين ضوء الأشعة تحت الحمراء والضوء المرئي هو التردد وطول الموجة. تقع الأشعة تحت الحمراء خارج نطاق الضوء المرئي ، لذلك لا يمكن للبشر رؤيتها:

مستقبل الأشعة تحت الحمراء 

irreceiver مستقبل الأشعة تحت الحمراء

فك اشارات ريموت التحكم باستخدام الأردوينو 

Label Value
CH- 0x00FFA25D
CH 0x00FF629D
CH+ 0x00FFE21D
|<< 0x00FF22DD
>>| 0x00FF02FD
>|| 0x00FFC23D
+ 0x00FFE01F
0x00FFA857
EQ 0x00FF906F
0 0x00FF6897
100+ 0x00FF9867
200+ 0x00FFB04F
1 0x00FF30CF
2 0x00FF18E7
3 0x00FF7A85
4 0x00FF10EF
5 0x00FF38C7
6 0x00FF5AA5
7 0x00FF42BD
8 0x00FF4AB5
9 0x00FF52AD

توصيل الدائرة

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

توصيل الدائرة لـ irreceiver مستقبل الأشعة تحت الحمراء

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

#include <IRremote.h>
int LED1= 3;
int LED2= 4;
int LED3= 5;

int RECV_PIN = 2;
IRrecv irrecv(RECV_PIN);
decode_results results;

void setup() {  
   Serial.begin(9600);
   irrecv.enableIRIn(); // Start the receiver
  
    /***Pin mode declaration***/
    pinMode(LED1, OUTPUT);
    pinMode(LED2, OUTPUT);
    pinMode(LED3, OUTPUT);
    
  }
  
  void loop() {
    if (irrecv.decode(&results)) {
    
    
    switch (results.value)
    {
      case 0xFFA25D:
      digitalWrite(red, HIGH);
      delay(300);
      digitalWrite(red, LOW);
      break;
      case 0xFF629D:
      digitalWrite (green, HIGH);
      delay(300);
      digitalWrite(green, LOW); 
      break;
      case 0xFFE21D:
      digitalWrite (blue, HIGH);
      delay(300);
      digitalWrite(blue, LOW); 
       break;
}
      
   irrecv.resume();

      
    }
 }

 

شرح الكود :

في البداية نقوم بتعريف متغيرات للإشارة إلى أرقام منافذ الأردوينو المستخدمة في المشروع. , واستدعاء مكتبة التحكم ب IRreceiver ، قم بتحميل المكتبة من هنا

int red = 3;
int green = 9;
int blue = 10;
#include <IRremote.h>
int RECV_PIN = 11

تعريف كائن  (object) من النوع IRrecv  ،  وتعريف متغيرات لحفظ قيم سطوع إضاءة الثلاث ألوان الخاصة بالRGB (أحمر،أخضر،أزرق).

IRrecv irrecv(RECV_PIN);
decode_results results;
int redBrightness = 0;
int greenBrightness = 0;
int blueBrightness = 0;

في الدلة ()setup ، نقوم بضبط الإعدادات اللازمة مثل ضبط المنافذ الموصلة مع الـ LEDs كمخرج وتهيئة معدل سرعة نقل البيانات عبرالمنفذ التسلسلي (Serial Port) لاستقبال بيانات من الأردوينو :

void setup() {  
   Serial.begin(9600);
   irrecv.enableIRIn(); 
  
 
    pinMode(red, OUTPUT);
    pinMode(green, OUTPUT);
    pinMode(blue, OUTPUT);
    
  }

إنشاء دالة ()setcolor والتي تقوم بحساب شدة الإضاءة الخاصة بكل لون في RGB اعتمادا على نوعه إما مصعد مشترك (Common anode) أو مهبط مشترك (Common Cathode)، ثم ارسال القيم عبر المنافذ الخاصة بالـ RGB ليتم إضاءة اللون المطلوب .

 void setcolor (int redx, int greenx, int bluex){
    Serial.print("Led");
    int red1= 255 - redx ;
    int green1=255 - greenx;
    int blue1=255 - bluex;
    analogWrite(red, red1);
    analogWrite(green, green1);
    analogWrite(blue, blue1);
  
  }  

في الدالة loop() نقوم بقراءة القيمة التي يستقبلها IR receiver عند الضغط على أزرار الريموت و تحديد اللون الذي سيظهر على RGB اعتمادا على القيمة المقروءة .

void loop() {
    if (irrecv.decode(&results)) {
    
    
    switch (results.value)
    {
      case 0xE318261B:
        setcolor (255, 0, 0);
        break;
      case 0x511DBB:
        setcolor (0, 0, 255);
        break;
      case 0xFFE21D:
        setcolor (0, 255, 0);
        break;
      }
   irrecv.resume();

      
    }
 }



استخدام المعقم بدون لمس

المقدمة

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

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

اردوينو(Arduino)

us-sanitizer-without-touch

A-B USB cable

us-sanitizer-without-touch

حساس مسافة (ultrasonic sensor)

us-sanitizer-without-touch

(TowerPro MG946R Servo )محرك سيرفو

us-sanitizer-without-touch

لوح تجارب صغير (Small size breadboard)

us-sanitizer-without-touch

(Jumper Wires Female/male )اسلاك توصيل أنثى/ذكر

us-sanitizer-without-touch

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

توصيل الدائرة :

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

servo_sanitizer

الكود البرمجي :

#include <Servo.h>
Servo myservo; 
const int trigPin = 10;
const int echoPin = 11;
long duration;
int distance; 
void setup() {
  myservo.attach(9);  
pinMode(trigPin, OUTPUT); 
pinMode(echoPin, INPUT); 
}

void loop() {
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distance= duration*0.034/2;

if (distance < 5)
{
myservo.write(110);
}
else
{
myservo.write(35);
}}

شرح الكود البرمجي :

في البداية قمنا بادراج مكتبة السيرفو ثم قمنا بتسمية منافذ الأردوينو المستخدمة في المشروع و تعريف المتغيرات

#include <Servo.h>
Servo myservo; 
const int trigPin = 10;
const int echoPin = 11;
long duration;
int distance; 

في دالة setup تعريف المنفذ الذي سيتحكم بمحرك السيرفو ،

و تعريف منافذ حساس  المسافة

myservo.attach(9);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);

يقوم الكود بتشغيل الحساس و حساب المسافة

void loop() {
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distance= duration*0.034/2;

فقط اذا كانت المسافة أقل من 5سم يتحرك السيرفو بمقدار 110درجة

if (distance < 5)
{
myservo.write(110);
}
else
{
myservo.write(35);
}
}



نظام مسح الفضاء المحيط

في هذا المشروع سنتعلم كيفية استخدام حساس الموجات الفوق صوتية (Ultrasonic) مع الأردوينو في عمل مسح للفضاء المحيط

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

 

arduino uno r3

الأردوينو (Arduino Uno)

حساس المسافة (Ultrasonic Sensor)

محرك سيرفو (Servo Motor)

Full size breadboard 830

 لوحة تجارب (Breadboard)

Breadboard Jumper Wire 65 pcs

أسلاك توصيل (Wires)

محرك السيرفو (Servo Motor)

هو عبارة عن جهاز يقوم بتحويل الاشارة الكهربائية إلى حركة ميكانيكية. يختلف هذا المحرك عن محركات التيار المستمر (DC) في ان حركته غير مستمرة.

Servo Motor: استخدام مقاومة متغيرة للتحكم فى حركة محرك سيرفو

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

مداخل محرك السيرفة :

Servo Motor: استخدام مقاومة متغيرة للتحكم فى حركة محرك سيرفو

كيفية عمله

يعمل محرك السيرفو بوضع اشارة كهربائية PWM بزمن محدد . تقوم مكتبة السيرفو في الاردوينو بالاهتمام بهذا الامر عنك، فحسب هذه الإشارة يتحرك السيرفو بزاوية معينة من 0 إلى 180 درجة.

   لمعلومات اكتر راجع درس محرك السيرفو Servo Motor

 

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

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

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

توصيل الدارة

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

Room Map-Making Using Ultrasonic With Arduino

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

Room Map-Making Using Ultrasonic With Arduino

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

الطرف التوصيل
الاحمر Vcc / 5 V
البرتقالى Arduino Pin 9
البنى Ground

يتم تثبيت حساس الموجات الصوتية فوق محرك السيرفو، ينتمكن من إلتقاط الأبعاد للمكان بالكامل. انظر إلى الصورة التالية :

Room Map-Making Using Ultrasonic With Arduino

 

التوصيل كاملا :

 

Room Map-Making Using Ultrasonic With Arduino

البرمجة :

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

وبدلا من قراءة هذه النتائج على الشاشة التسلسلية (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;
  }

}

شرح الشفرة البرمجية (Code):

 في البداية قمنا بادراج المكتبات المستخدمة مثل مكتبة السيرفو ومكتبة حساس الموجات فوق الصوتية ثم قمنا بتسمية منافذ الأردوينو المستخدمة في المشروع :

#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))

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

Room Map-Making Using Ultrasonic With Arduino

ملاحظة :

التغيير الوحيد الذي ستقوم بة في كود الماتلاب هو تغير اسم منفذ السيريال الذي يستخدمه الاردوينو.

Room Map-Making Using Ultrasonic With Arduino

فتقوم بتغييرة الى COM0 او COM1 او ايا كان اسم المنفذ الذي يستخدمة الاردوينو

Room Map-Making Using Ultrasonic With Arduino

و بعد ان تنتهي من كل شيء تقوم بضغط Run في برنامج الماتلاب و تنتظر إلى ان ينتهي السيرفو من عمل المشوار كامل ثم تظهر النتائج على الشاشة

ملاحظة : عند تشغيل كود الماتلاب تاكد ان لا يكون الSerial Monitor الخاص ببرنامج الاردوينو مفتوح




جهاز للتحكم وقياس درجة الحرارة

 في هذا المشروع سنقوم بعمل جهاز لمراقبة وقياس درجة الحرارة . سيتم قياس درجة الحرارة بإستخدام حساس درجة الحرارة LM35، وعرض درجة الحرارة الحالية والمطلوبة من خلال شاشة العرض.

جهاز لقياس و التحكم فى درجة الحرارة باستخدام LM35

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

arduino uno r3

Arduino Uno

LM35 Temperature Sensor

LM35

HD44780

LCD 16×2

220 Ω resistor

مقاومة 220 اوم

10K Ohms Resistors

Push Buttons

Full size breadboard 830

Breadboard

Breadboard Jumper Wire 65 pcs

Wires

الشاشة LCD

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

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

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

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

lcd.print("Hello");
 للإطلاع على المزيد حول شاشة الـ LCD قم بالإطلاع على درس التحكم بشاشة LCD

حساس الحرارة LM35

LM35 Temperature Sensor

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

توصيله في الدارة :

مُخرج هذا الحساس يكون قيمة تناظرية (Analog) ، اي نحتاج إلى توصيله على أحد المنافذ التناظرية (Analog) في الأردوينو. الأطراف التناظرية في الأردوينو من A0 إلى A5 .

جهاز لقياس و التحكم فى درجة الحرارة باستخدام LM35

الطرف (بداية من اليسار) التوصيل
1 Vcc
2 Output To Arduino
3 Ground

ملاحظة هامة :

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

شرح الدارة

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

جهاز لقياس و التحكم فى درجة الحرارة باستخدام LM35

سيقوم الحساس LM35 بقياس درجة الحرارة بإستمرار وعرضها على شاشة الـ LCD وبإستخدام مفتاح التحكم (Push Buttons) يمكننا التحكم في رفع أو خفض درجة الحرارة المطلوبة في المكان.

جهاز لقياس و التحكم فى درجة الحرارة باستخدام LM35

الكود البرمجي :

قم بكتابة الكود التالي ورفعه على الأردوينو :

#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 email project

المواد والأدوات

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

PIR sensor

مستشعر الحركة (PIR Sensor)

Half-size Breadboard

لوحة التجارب (Half-size Breadboard)

Arduino Uno R3

 1× اردوينو اونو

Jumper wire pack

حزمة أسلاك توصيل (ذكر-ذكر)

Arduino cable

سلك اردوينو

تنصيب Python و PySerial

اذا كنت تستخدم نظام تشغيل لينكس أو ماك ، فإن الـPython موجود مسبقاً .واذا كنت تسخدم الويندوز فإنه يتوجب عليك تحميله وتنصيبه .
كما يجب عليك (في كل نظم التشغيل) تحميل وتنصيب مكتبة PySerial للسماح بالتواصل مع الأردوينو.

تحميل وتنصيب Python على الويندوز

لتحميل Python على الويندوز، عليك تحميله من  http://www.python.org/getit/

ننصح استخدام النسخة Python 2 وذلك لتوافقها بشكل أفضل.

python setup

بعد تنصيب البايثون على جهازك ، علينا اجراء التعديلات ليتم السماح بتنفيذ اوامره في شاشة الأوامر ‘Command Prompt’، يهمنا ذلك لنتمكن من تحميل وتنصيب PySerial>

علينا اضافة مترجم اوامر البايثون إلى امتدادات الأوامر – PATH environment variable

Python win setup

لفعل ذلك ، عليك الذهاب للوحة تحكم الويندوز والعثور على ‘System Properties control’.
ثم الضغط على ‘Environment Variables’ ، ثم اختيار ‘Path’ ، باسفل قائمة  (System Variables)  قم بالضغط على ‘Edit’، وبنهاية ‘Variable Value’ وبدون أي عديل على النص الموجود ،قم باضافة النص ‘C:\Python27;’  (أومكان الملف الذي قمت بتحديده للبايثون)

لاتنسى إضافة ‘ ; ‘ قبل اضافة النص.

للتأكد من نجاح العملية ، قم بفتح شاشة الأوامر (Dos Prompt) وادخل الأمر ‘python’ ، من المفترض مشاهدة النتيجة التالية:

py win set

تنصيب PySerial

مهما اختلف نظام التشغيل الموجود على جهازك (لينكس ، ماك ، ويندوز ) ، قم بتحميل باقة  .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

 

ارسال بريد الكتروني

توصيل الدائرة

كما تلاحظ الشي الوحيد الذي تقوم بتوصيله هنا هو مستشعر الحركة ‘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’.

ارسال بريد الكتروني

والآن عليك عمل برنامج بلغة البايثون. لفعل ذلك ، قم بنسخ الكود التالي ووضعه بملف نصي وقم بتسميته بـ ‘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

LCD Display (16×2 characters)

arduino-lesson-12-lcd

1× مقاوم متغير 10kΩ variable resistor (pot)

arduino-lesson-10-sensing-light

1× (1 kΩ Resistor)

عرض درجة الحرارة والاضاءة

 1× المستشعر الضوئي (Photocell)

عرض درجة الحرارة والاضاءة

مستشعر الحرارة (TMP36 temperature sensor)

Half-size Breadboard

1× لوحة التجارب (Half-size Breadboard)

Arduino Uno R3

 1× اردوينو اونو

Jumper wire pack

حزمة أسلاك توصيل (ذكر-ذكر)

Arduino cable

1× سلك اردوينو

توصيل الدائرة

حتى تتمكن من عرض درجة الحرارة والاضاءة عليك الرجوع لتصميم الدائرة في الدرس الثاني عشر:

عرض درجة الحرارة والاضاءة

قمنا بتغيير بعض التوصيلات في التصميم كما تلاحظ، تحديداً التوصيلات التي حول المقاوم المتغير ‘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




اردوينو – الدرس الحادي عشر – اصدار الأصوات (Piezo sounder)

مقدمة

في هذا الدرس سنتعلم كيفية اصدار الأصوات بمتحكم الأردوينو.
أولاً ستقوم بتشغيل مقطع صوتي، ثم القيام بالتلاعب بمستوى الصوت عبر المستشعر الضوئي ‘photocell’.

اصدار الأصوات

المواد والأدوات

arduino-lesson-11-making-sound

1× (1 kΩ Resistor)

اصدار الأصوات

 1× سماعة البيزو (Piezo sounder)

arduino-lesson-11-making-sound

 1× المستشعر الضوئي (Photocell)

Half-size Breadboard

1× لوحة التجارب (Half-size Breadboard)

Arduino Uno R3

 1× اردوينو اونو

Jumper wire pack

حزمة أسلاك توصيل (ذكر-ذكر)

Arduino cable

1× سلك اردوينو

اصدار الأصوات

الصوت هو عبارة عن ذبذبة في ضغط الهواء سرعة الذبذبة (دورات بالثانية أو هيرتز) هي ما يصدر الصوت. كلما زادت قوة الذبذبة كلما زاد علو الصوت.

اصدار الأصوات

المتوسط C عادة يعرف بالتردد 261Hz. وكأنك قمت بتشغيل واطفاء منفذ رقمي ‘digital pin’ لاكثر من 261 مره بالثانية .

لسماع النتيجة، عليك القيام بتركيب قطعه تقوم بترجمة التردادت الالكترونية إلى صوت هذا يمكن عن طريق تركيب سماعات كبيره او عبر استخدامك لسماعة البيزو ‘piezo sounder’.

سماعة piezo تستخدم نوع خاص من الكريستال تتمدد وتنكمش كتردد الكتروني والتي ينتج عنها الصوت.

توصيل الدائرة

في هذا الجزء ستجد ان سماعة البيزو ‘piezo buzzer’ موضوعة على لوح التجارب.

الرجل القصيرة موصولة بالمجال الأرضي GND والرجل الأخرى مربوطه بالمنفذ الرقمي digital pin 12 على الاردوينو.

الدائرة رقم (1):

اصدار الأصوات

اصدار الأصوات

آلة Pseudo-Theremin الموسيقية الدائرة رقم (2):

يمكن اصدار الأصوات عند تمرير يدك امامها ،
ستصنع آلة مشابهه في الوظيفة للتحكم والتأثير على مستوى الصوت بمجرد تمرير يدك فوق المستشعر الضوئي ‘photocell’.

اضف المستشعر الضوئي ‘photocell’ و المقاوم resistor للوح التجارب.

اصدار الأصوات

اصدار الأصوات

 

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

ارفع الكود البرمجي التالي للدائرة رقم (1) على متحكم الاردوينو:

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[i]);
    delay(500);
  }
  noTone(speakerPin);
}
 
void loop()
{
}

لتشغيل مقطع صوتي، حدد المجال الترددي. انظر للجزء التالي من الدرس المخصص للصوت .
كل مجال ترددي لكل نوته صوتية تم الاحتفاظ به في مصفوفه ‘array’ . المصفوفه ‘array’ هي مثل القائمة، وبذلك يتم تشغيل المقطع عبر الانتقال لكل نوته صوتية بالقائمه.

في حلقة ‘for’ loop سيبدأ العد من 0 وحتى 9 باستخدام القيمه i . للحصول على المجال الترددي للنوته الصوتية لتشغيلها بكل خطوه نقوم باستخدام ‘tone[i]’. هذا يعني ان القيمة الموجودة في مصفوفة ‘tones’  في موضع ‘i’
كمثال ، قيمة ‘[0]tones’ هي 261 ، وقمية ‘[1]tones’ هي 277 .. وهكذا ..

الأمر ‘tone’ في الاردوينو يقوم بأخذ متغيرين اثنين، الأول هو المنفذ الذي يقوم باصدار الأصوات والثاني هي التردد الصوتي للمقطع لتشغيله.

عند الانتهاء من تشغيل من جميع النوتات الصوتية ، أمر ‘noTone’ يقوم بإيقاف اصدار الأصوات.

كان بإمكانك ان تضع الكود البرمجي لتشغيل الاصوات داخل دالة loop عوضاَ عن دالة setup وذلك لأنها ستكرر المقطع الصوتي مره بعد مره دون توقف مما سيتسبب بالإزعاج لذلك تم وضعه داخل دالة setup
لذلك دالة loop فارغة .

لاعادة تشغيل المقطع الصوتي كل ما عليك فعله هو الضغط على زر reset الموجود بمتحكم الاردوينو .

ارفع الكود للدائرة (2) على متحكم الاردوينو:

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;

تغيير القيمه سيرفع أو يقلل من التردد اعتمادًا على الرقم الذي قمت بوضعه.

يمكنك التلاعب بقيم النوتات الصوتية لترى ماذا سيحدث.