الأربعاء، 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);
    }    
}

ليست هناك تعليقات:

إرسال تعليق