الأربعاء، 28 مارس 2018

تحكم البيت الذكي بواسطة اردوينو مع جي اس ام - GSM Based Home Automation using Arduino

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

في هذا المشروع ، يستخدم اردوينو للتحكم في العملية برمتها. هنا قمنا باستخدام الاتصالات اللاسلكية GSM للتحكم في الأجهزة المنزلية. نرسل بعض الأوامر مثل "# A.light on *" و "# A.light off *" وما إلى ذلك للتحكم في الأجهزة المنزلية AC. بعد تلقي أوامر معينة من Arduino عبر GSM ، يرسل Arduino إشارة إلى المرحلات ، لتشغيل أو إيقاف تشغيل الأجهزة المنزلية باستخدام برنامج الترحيل.

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

اردوينو أونو
وحدة GSM
ريلاي 5 فولت
توصيل الأسلاك
16x2 LCD شاشة
مزود الطاقة
الهاتف الخلوي




هنا استخدمنا بادئة في سلسلة الأوامر التي هي "#A.". يتم استخدام هذه البادئة لتحديد أن الأمر الرئيسي يأتي بجانبه و * في نهاية السلسلة يشير إلى أنه قد تم إنهاء الرسالة.

عندما نرسل رسالة نصية إلى وحدة GSM عن طريق الجوال ، فإن GSM يتلقى تلك الرسائل ويرسلها إلى Arduino. الآن يقرأ Arduino هذه الرسالة القصيرة واستخراج الأمر الرئيسي من السلسلة المستلمة والمخازن في متغير. بعد ذلك ، قارن اردوينو هذه السلسلة مع سلسلة محددة مسبقا. في حالة حدوث مطابقة ، يرسل Arduino إشارة للتتابع عبر برنامج تشغيل الترحيل لتشغيل الأجهزة المنزلية وإيقاف تشغيلها. والنتيجة النسبية أيضا تطبع على LCD 16X2 باستخدام الأوامر المناسبة.

هنا في هذا المشروع ، استخدمنا 3 لمبة بقدرة صفرية لمظاهرة تشير إلى المروحة والضوء والتلفزيون.
في ما يلي قائمة الرسائل التي نرسلها عبر الرسائل القصيرة SMS ، لتشغيل وإيقاف تشغيل المروحة والضوء والتلفزيون:


ربط الدائرة


كود اردوينو

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

#include<LiquidCrystal.h>
LiquidCrystal lcd(6,7,8,9,10,11);

#define Fan 3
#define Light 4
#define TV 5

int temp=0,i=0;
int led=13;
بعد تهيئة هذا الاتصال التسلسلي على 9600 بت في الثانية ، ويعطي توجيه دبوس المستخدم.
void setup()
{
  lcd.begin(16,2);
  Serial.begin(9600);
  pinMode(led, OUTPUT);
   pinMode(Fan, OUTPUT);
    pinMode(Light, OUTPUT);
     pinMode(TV, OUTPUT);

لاستقبال البيانات بشكل تسلسلي ، استخدمنا وظيفتين ، أحدهما هو Serial.available الذي يتحقق مما إذا كانت أي بيانات تسلسلية قادمة وأخرى هي Serial.read التي تقرأ البيانات التي تأتي متسلسلة.
 while (Serial.available()) 
      {
      char inChar=Serial.read();
بعد تلقي البيانات بشكل تسلسلي ، قمنا بتخزينها في سلسلة ثم ننتظر إدخال.
void serialEvent() 
 {
  while(Serial.available()) 
  {
    if(Serial.find("#A."))
    {
      digitalWrite(led, HIGH);
      delay(1000);
      digitalWrite(led, LOW);
      while (Serial.available()) 
      {
      char inChar=Serial.read();
      str[i++]=inChar;
      if(inChar=='*')
      {
        temp=1;
        return;
      } 

عند بدء البرنامج ، يبدأ البرنامج بمقارنة السلسلة المستلمة بسلسلة محددة بالفعل وإذا تمت مطابقة السلسلة ، فيتم إجراء عملية نسبية باستخدام الأمر المناسب المعطى في الكود.
void check()
{
   if(!(strncmp(str,"tv on",5)))
    {
      digitalWrite(TV, HIGH);
      lcd.setCursor(13,1); 
      lcd.print("ON    ");
      delay(200);
    }  
   
   else if(!(strncmp(str,"tv off",6)))
    {
      digitalWrite(TV, LOW);
      lcd.setCursor(13,1); 
      lcd.print("OFF    ");
      delay(200);
    }
الكود كاملة


#include<LiquidCrystal.h>
LiquidCrystal lcd(6,7,8,9,10,11);
#define Fan 3
#define Light 4
#define TV 5
int temp=0,i=0;
int led=13;
char str[15];
void setup()
{
  lcd.begin(16,2);
  Serial.begin(9600);
  pinMode(led, OUTPUT);
   pinMode(Fan, OUTPUT);
    pinMode(Light, OUTPUT);
     pinMode(TV, OUTPUT);
 
  lcd.setCursor(0,0);
  lcd.print("GSM Control Home");
  lcd.setCursor(0,1);
  lcd.print("   Automaton    ");
  delay(2000);
  lcd.clear();
  lcd.print("Circuit Digest");
  delay(1000);
  lcd.setCursor(0,1);
  lcd.print("System Ready");
  Serial.println("AT+CNMI=2,2,0,0,0");
  delay(500);
  Serial.println("AT+CMGF=1");
  delay(1000);
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("Fan   Light  TV ");
  lcd.setCursor(0,1);
  lcd.print("OFF    OFF   OFF ");
}
void loop()
{
  lcd.setCursor(0,0);
  lcd.print("Fan   Light  TV");
  if(temp==1)
  {
    check();
    temp=0;
    i=0;
    delay(1000);
  }
}
 void serialEvent()
 {
  while(Serial.available())
  {
    if(Serial.find("#A."))
    {
      digitalWrite(led, HIGH);
      delay(1000);
      digitalWrite(led, LOW);
      while (Serial.available())
      {
      char inChar=Serial.read();
      str[i++]=inChar;
      if(inChar=='*')
      {
        temp=1;
        return;
      }
      }
    }
   }
 }
void check()
{
   if(!(strncmp(str,"tv on",5)))
    {
      digitalWrite(TV, HIGH);
      lcd.setCursor(13,1);
      lcd.print("ON    ");
      delay(200);
    }
 
   else if(!(strncmp(str,"tv off",6)))
    {
      digitalWrite(TV, LOW);
      lcd.setCursor(13,1);
      lcd.print("OFF    ");
      delay(200);
    }
 
    else if(!(strncmp(str,"fan on",5)))
    {
      digitalWrite(Fan, HIGH);
      lcd.setCursor(0,1);
      lcd.print("ON   ");
      delay(200);
    }

    else if(!(strncmp(str,"fan off",7)))
    {
      digitalWrite(Fan, LOW);
      lcd.setCursor(0,1);
      lcd.print("OFF    ");
      delay(200);
    }

    else if(!(strncmp(str,"light on",8)))
    {
      digitalWrite(Light, HIGH);
      lcd.setCursor(7,1);
      lcd.print("ON    ");
      delay(200);
    }

    else if(!(strncmp(str,"light off",9)))
    {
      digitalWrite(Light, LOW);
      lcd.setCursor(7,1);
      lcd.print("OFF    ");
      delay(200);
    }
   
    else if(!(strncmp(str,"all on",6)))
    {
      digitalWrite(Light, HIGH);
      digitalWrite(Fan, HIGH);
      digitalWrite(TV, HIGH);
      lcd.setCursor(0,1);
      lcd.print("ON     ON    ON  ");
      delay(200);
    }

    else if(!(strncmp(str,"all off",7)))
    {
      digitalWrite(Light, LOW);
      digitalWrite(Fan, LOW);
      digitalWrite(TV, LOW);
      lcd.setCursor(0,1);
      lcd.print("OFF   OFF    OFF  ");
      delay(200);
    }    
}

الخميس، 15 مارس 2018

استخدام اردوينو ووحدة الموجات فوق الصوتية لتحديد مستوى المياه في خزان.

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

ATMega328P او اردوينو بأي نوع كان
متحسس الترا سونيك HC-SR04
مقاومة 10K
كرستال 16Mhz
منظم LM7805 5V
بطارية 9V 
مكثف 10uF
اسلاك ربط مع لوحة الربط

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



كود البرمجة

int d = 18; //Enter depth of your tank here in centimeters int trig = 11; // Attach Trig of ultrasonic sensor to pin 11 int echo = 10; // Attach Echo of ultrasonic sensor to pin 10 int pin1 = 2;//Highest level int pin2 = 3; int pin3 = 4; int pin4 = 5; int pin5 = 6; int pin6 = 7;//Lowest evel void setup() { pinMode (pin1, OUTPUT);// Set pins to output for controlling I/O pinMode (pin2, OUTPUT); pinMode (pin3, OUTPUT); pinMode (pin4, OUTPUT); pinMode (pin5, OUTPUT); pinMode (pin6, OUTPUT); } void loop() { digitalWrite(pin1, LOW);//Resetting the LEDs to off state digitalWrite(pin2, LOW); digitalWrite(pin3, LOW); digitalWrite(pin4, LOW); digitalWrite(pin5, LOW); digitalWrite(pin5, LOW); // Establish variables for duration of the ping, // and the distance result in inches and centimeters: long duration, in, cm; //'in' is inches and 'cm' is centimeter // The PING is triggered by a HIGH pulse of 2 or more microseconds. // Give a short LOW pulse beforehand to ensure a clean HIGH pulse: pinMode(trig, OUTPUT); digitalWrite(trig, LOW); delayMicroseconds(2); digitalWrite(trig, HIGH); delayMicroseconds(5); digitalWrite(trig, LOW); // The same pin is used to read the signal from the PING: a HIGH // pulse whose duration is the time (in microseconds) from the sending // of the ping to the reception of its echo off of an object. pinMode(echo, INPUT); duration = pulseIn(echo, HIGH); // Convert the time into a distance in = microsecondsToInches(duration); cm = microsecondsToCentimeters(duration); delay(100);// To save battery,remove if felt inconvenient if (in < 6 * d / 7)// Else is included to light only one led at a level and thus save battery charge digitalWrite(pin1, HIGH); else if (in < 5 * d / 6) digitalWrite(pin2, HIGH); else if (in < 4 * d / 6) digitalWrite(pin3, HIGH); else if (in < 3 * d / 6) digitalWrite(pin4, HIGH); else if (in < 2 * d / 6) digitalWrite(pin5, HIGH); else if (in < 1 * d / 6) digitalWrite(pin5, HIGH); }



الأربعاء، 14 مارس 2018

قراءة مقاييس الحرارة والرطوبة باستخدام اردوينو وعرضها على شاشة OLED

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

اردوينو اونو
شاشة 128X64 OLED
حساس DHT22 للحرارة والرطوبة
اسلاك التوصيل - لوحة الربط

في هذا المشروع ، سنقوم بعمل ميزان حرارة و مقياس رطوبة OLED من اردوينو. سوف نقرأ درجة الحرارة والرطوبة من مستشعر DHT22 ثم نعرض البيانات على شاشة OLED.





كود اردوينو

#include   
#include "DHT.h"
#define DHTPIN 7 
#define DHTTYPE DHT22 
DHT sensor(DHTPIN, DHTTYPE);

U8GLIB_SH1106_128X64 oled (13, 11, 10, 9, 8);  

void setup() 
{
sensor.begin(); 
oled.firstPage();  
do 
{
oled.setFont(u8g_font_fur14);    //setting the font size
//Printing the data on the OLED   
oled.drawStr(20, 15, "Welcome"); 
oled.drawStr(40, 40, "To");
oled.drawStr(5, 60, "DIYHACKING");  
}  while( oled.nextPage() );
delay(5000);
}

void loop()
{
float h = sensor.readHumidity();   //Reading the humidity value
float t = sensor.readTemperature();   //Reading the temperature value
float fah = sensor.readTemperature(true); //Reading the temperature in Fahrenheit
if (isnan(h) || isnan(t) || isnan(fah)) {  //Checking if we are receiving the values or not
Serial.println("Failed to read from DHT sensor!");
return;
}
float heat_index = sensor.computeHeatIndex(fah, h); //Calculating the heat index in Fahrenheit
float heat_indexC = sensor.convertFtoC(heat_index);    //Calculating the heat index in Celsius

oled.firstPage();  
do 
{
oled.setFont(u8g_font_fub11);    //setting the font size
//Printing the data on the OLED
oled.drawStr(0, 15, "Temp: ");
oled.drawStr(0, 40, "Hum: ");
oled.drawStr(0, 60, "Hi: ");
oled.setPrintPos(72, 15);       //setting the dimensions to print the temperature
oled.print(t, 0);
oled.println("C"); 
oled.setPrintPos(72, 40);  //setting the dimensions to print the humidity
oled.print(h, 0);     
oled.println("%");
oled.setPrintPos(72, 60);  //setting the dimensions to print the heat index
oled.print(heat_indexC, 0);
oled.println("%");
}  
while( oled.nextPage() );
delay(2000);  
}

الجمعة، 9 مارس 2018

صنع قصب الذكي للمعاقين بصريا بواسطة اردوينو

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

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

اردوينو اونو
بطارية 9 فولت
حافظة بطارية
صافرة
اسلاك التوصيل
مفتاح التشغيل
هزاز ( يمكن استخراجه من هاتف قديم)
انبوب ماء مطاطي


بعد استخراج الهزاز يربط على لوح كالاتي

تربط المكونات كالاتي


المحصلة النهائية للدائرة تكون كالاتي


كود الاردوينو


#define trigPin 13 #define echoPin 12 #define motor 7 #define buzzer 6 void setup() { pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); pinMode(motor, OUTPUT); pinMode(buzzer,OUTPUT); } void loop() { long duration, distance; digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); duration = pulseIn(echoPin, HIGH); distance = (duration/2) / 29.1; if (distance < 70) // Checking the distance, you can change the value { digitalWrite(motor,HIGH); // When the the distance below 100cm digitalWrite(buzzer,HIGH); } else { digitalWrite(motor,LOW);// when greater than 100cm digitalWrite(buzzer,LOW); } delay(500); }


الاثنين، 5 مارس 2018

ركن السيارة في المرأب( كراج ) باستخدام اردوينو

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

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



ربط الاجزاء




الربط النهائي


كود البرمجة
int trigPin = PD5; 

int echoPin = PD6; // Sensor Echo pin connected to Arduino pin D6

int redLED = PD2; // Red LED connected to pin D2

int yellowLED = PD3; // Yellow LED connected to pin D3

int greenLED = PD4; // Green LED connected to pin D4

int buzzer = A0; // Buzzer connected to Analogue pin A0

long TempDistance = 0; // A variable to store the temporary distance

int counter = 0; // Counter value to check if the object has stopped moving

void setup() {

Serial.begin(9600);

pinMode(trigPin, OUTPUT);

pinMode(echoPin, INPUT);

pinMode(redLED, OUTPUT);

pinMode(greenLED, OUTPUT);

pinMode(yellowLED, OUTPUT);

pinMode(buzzer, OUTPUT);

}

void loop() {

long duration, Distance;

digitalWrite(trigPin, LOW);

delayMicroseconds(2);

digitalWrite(trigPin, HIGH);

delayMicroseconds(10);

digitalWrite(trigPin, LOW);

duration = pulseIn(echoPin, HIGH);

Distance = (duration/2) / 74; // Distance in Inches

if(counter < 20){ // Do the rest if the car is still moving

if (Distance > 200) { // Nothing in the garrage

turnThemAllOff();

}

if ((Distance > 55) && (Distance <= 200)) { // Turn on Green LED

digitalWrite(greenLED, HIGH);

digitalWrite(yellowLED, LOW);

digitalWrite(redLED, LOW);

noTone(buzzer);

}

if ((Distance > 15) && (Distance <= 55)) { // Turn on Yellow LED

digitalWrite(yellowLED, HIGH);

digitalWrite(redLED, LOW);

digitalWrite(greenLED,LOW);

noTone(buzzer);

}

if (Distance <= 15) { // Turn on Red LED

digitalWrite(redLED, HIGH);

digitalWrite(greenLED,LOW);

digitalWrite(yellowLED, LOW);

noTone(buzzer);

}

if (Distance < 8) { // Item is way to close - start the buzzer

tone(buzzer, 500);

}

}

if ((Distance == TempDistance) || ((Distance+1) == TempDistance) || ((Distance-1) == TempDistance)){

if(counter >= 20){ // Turn off the lights if the object hasn't moved for 20 cycles (no change in distance)

Serial.println("No movement detected, turning off the lights");

turnThemAllOff();

} else {

counter++;

}

} else {

counter = 0; // Reset counter if there is a movement

}

TempDistance = Distance;

Serial.print(Distance);

Serial.println(" inches");

Serial.print("Counter : ");

Serial.println(counter); delay(500); }

// Function to turn the LEDs off

void turnThemAllOff(){

digitalWrite(redLED, LOW);

digitalWrite(greenLED,LOW);

digitalWrite(yellowLED, LOW);

noTone(buzzer);

}