الجمعة، 6 يوليو 2018

كيفية التحكم في مكيف الهواء في المنزل مع Arduino ، حتى عن بعد

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

المتطلبات

  2  Arduino Mega Arduino Uno
جهاز استقبال الأشعة تحت الحمراء TSOP1738
 دايود ضوئي
 330 أوم المقاوم
 بعض الكابلات المرنة

الخطوة 1: كيف يعمل النظام؟

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


الخطوة 2: كيفية إعداد البيانات المختلفة


كما ذكر في الصفوف السابقة ، يجب عليك الحصول على ترميزات جهاز التحكم عن بعد الخاص بنا لإعادة إرسالها إلى Arduino. للقيام بذلك ، سنستخدم مكتبة Arduino iRemote ، ولا سيما هذا الكود:

#include <IRremote.h>

int RECV_PIN = 11;

IRrecv irrecv(RECV_PIN);

decode_results results;

void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn(); // Start the receiver
}

// Dumps out the decode_results structure.
// Call this after IRrecv::decode()
// void * to work around compiler issue
//void dump(void *v) {
//  decode_results *results = (decode_results *)v
void dump(decode_results *results) {
  int count = results->rawlen;
  if (results->decode_type == UNKNOWN) {
    Serial.print("Unknown encoding: ");
  }
    else if (results->decode_type == NEC) {
    Serial.print("Decoded NEC: ");
  }
  else if (results->decode_type == SONY) {
    Serial.print("Decoded SONY: ");
  }
  else if (results->decode_type == RC5) {
    Serial.print("Decoded RC5: ");
  }
  else if (results->decode_type == RC6) {
    Serial.print("Decoded RC6: ");
  }
  else if (results->decode_type == SAMSUNG) {
    Serial.print("Decoded SAMSUNG: ");
  }
  else if (results->decode_type == JVC) {
    Serial.print("Decoded JVC: ");
  }
  else if (results->decode_type == PANASONIC) {
    Serial.print("Decoded Panasonic: ");
  }
  Serial.print(results->value, HEX);
  Serial.print("(");
  Serial.print(results->bits, DEC);
  Serial.println(" bits)");
  Serial.print("#define Something_DEC ");
  Serial.println(results->value, DEC);
  Serial.print("#define Something_HEX ");
  Serial.println(results->value, HEX);
  Serial.print("Raw (");
  Serial.print(count, DEC);
  Serial.print("): ");
  for (int i = 0; i < count; i++) {
    if ((i % 2) == 1) {
      Serial.print(results->rawbuf[i]*USECPERTICK, DEC);
    }
    else {
      Serial.print(-(int)results->rawbuf[i]*USECPERTICK, DEC);
    }
    Serial.print(" ");
  }
  Serial.println("");
}

void loop() {
  if (irrecv.decode(&results)) {
    dump(&results);
    irrecv.resume(); // Receive the next value
  }
}
بعد تحميل الرمز على Arduino ، يجب أن نضغط على الأزرار الموجودة على جهاز التحكم عن بعد وننسخ في مكان ما النتائج التي يظهرها المسلسل.
في حالتي ، حصلت على التسلسل التالي من الترميزات:
Accensione 20 C° Caldo
Raw (150): -5320 3000 -3000 3000 -4400 550 -1600 600 -550 550 -1650 550 -550 550 -550 550 -1650 550 -550 550 -1650 500 -550 550 -1650 550 -550 550 -500 600 -500 600 -550 550 -550 550 -1650 500 -550 550 -600 500 -1700 500 -550 550 -550 550 -550 550 -600 500 -550 550 -550 550 -550 550 -550 550 -1650 550 -1650 550 -1650 500 -1650 550 -1650 550 -550 550 -550 550 -550 550 -550 550 -1650 550 -1650 550 -500 550 -550 550 -1700 500 -1650 550 -550 550 -500 600 -550 550 -550 550 -550 550 -550 550 -550 550 -1650 500 -1700 500 -550 550 -550 550 -550 550 -550 550 -550 550 -600 500 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -1650 550 -500 550 -1700 500 -550 550 -550 550 -550 550 -1650 550

Spegnimento
Raw (150): -3276 3100 -2900 2950 -4400 700 -1500 700 -400 700 -1500 700 -400 650 -450 550 -1650 550 -550 650 -1500 600 -500 600 -1600 600 -500 600 -500 600 -450 650 -450 600 -550 550 -550 550 -550 550 -600 500 -1600 600 -500 600 -500 600 -550 550 -500 600 -500 600 -550 550 -550 550 -1600 600 -500 600 -500 600 -500 550 -1650 550 -1600 600 -500 600 -500 600 -550 550 -550 550 -1600 600 -1600 550 -550 550 -550 550 -1650 550 -1600 600 -550 550 -500 600 -500 600 -550 550 -550 550 -500 600 -500 600 -1600 600 -1600 550 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -500 600 -550 550 -550 550 -500 600 -500 600 -500 600 -1600 600 -500 600 -1600 550 -550 550 -1600 600 -550 550 -550 550

Accensione 23 C° Freddo 2 FAN
Raw (150): -16044 3050 -3000 3000 -4400 550 -1600 600 -550 550 -1650 550 -550 550 -550 550 -1650 550 -500 600 -1600 550 -550 550 -1650 550 -1650 550 -1650 550 -550 550 -550 550 -500 600 -1600 550 -550 550 -550 550 -1650 550 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -500 600 -1650 500 -550 550 -600 500 -1700 500 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -1650 550 -1650 550 -550 550 -500 550 -1650 550 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -1650 550 -550 550 -550 550 -550 550 -550 550 -500 550 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -1650 550 -1600 600 -550 550

Accensione 20 C° Caldo e Swing
Raw (150): 18566 3000 -3000 3000 -4400 550 -1650 550 -500 600 -1600 600 -500 600 -500 600 -1600 550 -550 550 -1650 550 -500 600 -1600 600 -550 550 -550 550 -550 550 -1600 600 -500 600 -500 550 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -1650 550 -550 550 -1600 550 -550 550 -600 500 -550 550 -550 550 -550 550 -550 550 -550 550 -1650 550 -1650 550 -550 550 -550 550 -1600 550 -1650 550 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -1650 550 -1650 550 -550 550 -550 550 -550 550 -550 500 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -1650 550 -1650 550 -1650 500 -1650 550 -550 550 -1700 500

Accensione 23 C° Freddo 2 FAN e Swing
Raw (150): 2084 2950 -3050 2950 -4400 550 -1600 600 -550 550 -1650 550 -550 550 -550 550 -1600 600 -500 600 -1600 550 -500 600 -1650 550 -1650 550 -1600 600 -500 600 -1600 600 -500 600 -500 550 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -500 600 -550 550 -500 600 -1650 550 -550 550 -1600 600 -500 600 -1600 550 -1600 600 -500 600 -500 600 -550 550 -500 600 -1650 550 -1600 600 -500 600 -500 550 -1650 550 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -1650 550 -500 600 -500 600 -500 600 -500 600 -500 550 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -550 550 -1650 550 -1650 550 -1600 600 -1600 550 -550 600 -500 550 -550 550 -550 550

الخطوة 3: إرسال أمر الأشعة تحت الحمراء إلى A / C



باستخدام التعليمة البرمجية التالية ، ستتمكن من إرسال أمر IR إلى A / C عبر Arduino:


#include "IRremote.h"

IRsend irsend;

void setup()
{
  Serial.begin(9600);
}

int khz=38; //NB Change this default value as neccessary to the correct modulation frequency
// ON and 2O C° with 1 FAN heat
unsigned heat[] = {3000,3000,3000,4400,550,1600,600,550,550,1650,550,550,550,550,550,1650,550,550,550,1650,500,550,550,1650,550,550,550,500,600,500,600,550,550,550,550,1650,500,550,550,600,500,1700,500,550,550,550,550,550,550,600,500,550,550,550,550,550,550,550,550,1650,550,1650,550,1650,500,1650,550,1650,550,550,550,550,550,550,550,550,550,1650,550,1650,550,500,550,550,550,1700,500,1650,550,550,550,500,600,550,550,550,550,550,550,550,550,550,550,1650,500,1700,500,550,550,550,550,550,550,550,550,550,550,600,500,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,1650,550,500,550,1700,500,550,550,550,550,550,550,1650,550};
// OFF the A/C
unsigned OFF[] = {3100,2900,2950,4400,700,1500,700,400,700,1500,700,400,650,450,550,1650,550,550,650,1500,600,500,600,1600,600,500,600,500,600,450,650,450,600,550,550,550,550,550,550,600,500,1600,600,500,600,500,600,550,550,500,600,500,600,550,550,550,550,1600,600,500,600,500,600,500,550,1650,550,1600,600,500,600,500,600,550,550,550,550,1600,600,1600,550,550,550,550,550,1650,550,1600,600,550,550,500,600,500,600,550,550,550,550,500,600,500,600,1600,600,1600,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,500,600,550,550,550,550,500,600,500,600,500,600,1600,600,500,600,1600,550,550,550,1600,600,550,550,550,550};
// ON and 23° with 2 FAN cold
unsigned cold[] = {3050,3000,3000,4400,550,1600,600,550,550,1650,550,550,550,550,550,1650,550,500,600,1600,550,550,550,1650,550,1650,550,1650,550,550,550,550,550,500,600,1600,550,550,550,550,550,1650,550,550,550,550,550,550,550,550,550,550,550,550,550,500,600,1650,500,550,550,600,500,1700,500,550,550,550,550,550,550,550,550,550,550,550,550,1650,550,1650,550,550,550,500,550,1650,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,1650,550,550,550,550,550,550,550,550,550,500,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,1650,550,1600,600,550,550};
// ON and 20 C° with 1 FAN heat and SWING
unsigned heat_with_swing[] = {3000,3000,3000,4400,550,1650,550,500,600,1600,600,500,600,500,600,1600,550,550,550,1650,550,500,600,1600,600,550,550,550,550,550,550,1600,600,500,600,500,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,1650,550,550,550,1600,550,550,550,600,500,550,550,550,550,550,550,550,550,550,550,1650,550,1650,550,550,550,550,550,1600,550,1650,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,1650,550,1650,550,550,550,550,550,550,550,550,500,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,1650,550,1650,550,1650,500,1650,550,550,550,1700,500};
// ON and 23° with 2 FAN cold and SWING
unsigned cold_with_sqwing[] = {2950,3050,2950,4400,550,1600,600,550,550,1650,550,550,550,550,550,1600,600,500,600,1600,550,500,600,1650,550,1650,550,1600,600,500,600,1600,600,500,600,500,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,500,600,550,550,500,600,1650,550,550,550,1600,600,500,600,1600,550,1600,600,500,600,500,600,550,550,500,600,1650,550,1600,600,500,600,500,550,1650,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,1650,550,500,600,500,600,500,600,500,600,500,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,550,1650,550,1650,550,1600,600,1600,550,550,600,500,550,550,550,550,550};

void loop() {

irsend.sendRaw(heat, sizeof(heat)/sizeof(int), khz);
delay(10000);
irsend.sendRaw(OFF, sizeof(OFF)/sizeof(int),khz);
delay(10000);
}

إذا خرجنا لتشغيل مكيف الهواء في المنزل ، فنحن على الطريق الصحيح لإكمال المشروع!
كما ذكر سابقا ، من الضروري استخدام اثنين من اردوينو ، واحد يدير خادم الويب ، والآخر الذي يعالج الاتصالات مع مكيف الهواء.
لتوصيل اثنين من اردوينو بطريقة صحيحة ، ينبغي الحرص على الصورة أدناه.
من الضروري على الجهاز المتصل بـ Ethernet Shield تحميل البرنامج الذي يحمل اسم AC_Webpage_Controller.ino ، بينما يقوم nell'Arduino بإرسال أوامر الأشعة تحت الحمراء ، فيجب تحميل البرنامج الذي يحمل اسم AC_Sender_Code.ino من هنا 


الآن بعد أن أكملنا عملية التحميل ، علينا فقط القيام ببعض الأعمال لتحسين المشروع ، الأكثر فائدة ، هو إتاحته من خلال خادم ويب بعيد. للقيام بذلك ، يجب علينا "فتح الأبواب" لجهاز التوجيه الخاص بنا لتوجيه الطلبات التي تتم خارج شبكتنا المحلية بشكل صحيح.
تجدر الإشارة إلى أنه في نسخة من التعليمات البرمجية على Github ذكرت ، لا يوجد كلمة مرور الأمان المستوى ، لتبسيط بت 'المشروع. ومع ذلك ، مع بعض التعديلات على الشفرة AC_Webpage_Controller.ino ، يمكنك أيضًا تنفيذ هذه الميزة.

الخطوة 4: إعادة توجيه الميناء ، لوضع Arduino و A / C على WEB
تشغيل إعادة توجيه المنفذ ، يختلف من موجه إلى موجه ، ولكن بشكل عام ، يمكنك المتابعة كما يلي:

• تحديد عنوان IP لخادم الويب اردوينو
• تحديد عنوان IP للبوابة
• افتح المتصفح واكتب عنوان IP الخاص بالموجّه وأدخل بيانات الاعتماد
• اﻓﺗﺢ ﻗﺳم إﻋﺎدة ﺗوﺟﯾﮫ اﻟﻣﻧﻔذ وأدﺧل اﻟﺑﯾﺎﻧﺎت ﻣﺛل ﻣﻧﻔذ IP ﮐﻣﺎ ھو Arduino و 80.

الآن يمكننا أيضًا الوصول إلى خارج شبكتنا المحلية ، ببساطة عن طريق فتح صفحة ويب مع عنوان IP العام لاتصال ADSL (لاسترداد هذه القيمة ، اكتب ببساطة على Google.com "my ip").

الآن يمكننا أخيرًا اختبار مشروعنا!

الخطوة 5: تنزيل تطبيق Android!





إذا كنت لا ترغب في استخدام صفحة الويب ، فيمكنك تنزيل التطبيق على Android!


يمكنك القيام بذلك عن طريق كتابة RemoteAC من متجر Play ، أو استخدام هذا الرابط:  هنــــــــــــــــــا
تذكر أنه بمجرد فتح التطبيق تحتاج إلى ضبط IP من اردوينو في تفضيلات!




الثلاثاء، 19 يونيو 2018

التحكم بتسعة اجهزة عن طريق بلوتوث اردوينو - control 9 devices via arduino bluetoth

ربط الدائرة 




كود البرمجة 

#include <SoftwareSerial.h>

SoftwareSerial BT(10, 11); //TX, RX respetively
String device;

void setup() {
 BT.begin(9600);
 Serial.begin(9600);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(12, OUTPUT);
  pinMode(13, OUTPUT);


}
//-----------------------------------------------------------------------// 
void loop() {
  while (BT.available()){  //Check if there is an available byte to read
  delay(10); //Delay added to make thing stable
  char c = BT.read(); //Conduct a serial read
  device += c; //build the string.
  } 
  if (device.length() > 0) {
    Serial.println(device);

  if(device == "1")
  {
    digitalWrite(3, HIGH);
  }

  else if(device == "2")
  {
    digitalWrite(3, LOW);
    
  }

  else if (device == "3")
  {
    digitalWrite (4,HIGH);
    
  }
  
 else if ( device == "4")
 {
   digitalWrite (4, LOW);
 }

 else if (device == "5")
 {
   digitalWrite (5, HIGH);

 }

 else if (device == "6")
 {
   
 digitalWrite (5, LOW);

}

 else if (device == "7")

 {
   
   digitalWrite (6, HIGH);
   
 }

 else if (device == "8")

 {
   
 digitalWrite (6, LOW);

}

else if (device == "9")

 {
   digitalWrite (7, HIGH);
 }

else if (device == "10")

 {
   
 digitalWrite (7, LOW);

}

 else if (device == "11")

 {
   
   digitalWrite (8, HIGH);
   
 }

else if (device == "12")
 {

 digitalWrite (8, LOW);

}

 else if (device == "13")

 {
   digitalWrite (9, HIGH);
   
 }

else if (device == "14")

 {
   
   digitalWrite (9, LOW);

 }

  else if (device == "15")
  
 {
   digitalWrite (12, HIGH);
}

else if (device == "17")

 {
   digitalWrite (12, LOW);
   
}

 else if (device == "16")

 {
   
   digitalWrite (13, HIGH);
   
 }
   
else if (device == "18")
 {
   digitalWrite (13, LOW);
   }
   
device="";}} //Reset the variable





الأربعاء، 6 يونيو 2018

التحكم التلقائي بالانارة باستخدام اردوينو ---Auto Power Controller (APC



جهاز إنترنت الأشياء (IoT) لتشغيل / إيقاف تشغيل الأجهزة الإلكترونية تلقائيًا بناءً على توفر الكائنات البشرية ، خاصة في الخدمات العامة

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

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

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

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

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

تحكم تلقائي في الطاقة - تقنية Stack:

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

صافي التوفير = عدد وحدات توفير الطاقة * معدل لكل وحدة طاقة (يحددها مزود الطاقة)

جهاز استشعار شرطة التدخل السريع

وحدة المعالجات الدقيقة

PCB Relay 5v

المقاوم 220 أوم (أي المقاوم أدناه 1k أوم)

البطارية (5-9 فولت)

توصيل الأسلاك

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

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


Apc fc auihfrphwf


int ledPin = 13; // choose the pin for the LED
int inputPin = 2; // choose the input pin (for PIR sensor)
int pirState = LOW; // we start, assuming no motion detected
int val = 0; // variable for reading the pin status

void setup() {
pinMode(ledPin, OUTPUT); // declare LED as output
pinMode(inputPin, INPUT); // declare sensor as input

Serial.begin(9600);
}

void loop(){
val = digitalRead(inputPin); // read input value
if (val == HIGH) { // check if the input is HIGH
digitalWrite(ledPin, HIGH); // turn LED ON
if (pirState == LOW) {
// we have just turned on
Serial.println("Motion detected!");
// We only want to print on the output change, not state
pirState = HIGH;
}
} else {
digitalWrite(ledPin, LOW); // turn LED OFF
if (pirState == HIGH){
// we have just turned of
Serial.println("Motion ended!");
// We only want to print on the output change, not state
pirState = LOW;
}
}
}



الاثنين، 4 يونيو 2018

الموقتات الداخلية اردوينو - Internal Timers of Arduino

المكونات

اردوينو اونو او جينون اونو
دايود ضوئي
مقاومة 220 اوم

نظرة عامة
إذا كنت بحاجة إلى حساب وقت دقيق ، فأنت بحاجة إلى استخدام جهاز توقيت ، ولكن عادة ليس من السهل استخدام المؤقتات الداخلية لـ Arduino ، لذا أحاول في هذا البرنامج التعليمي شرح كيفية استخدامها بطريقة سهلة.

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

أستخدم TIMER0 لأنه هو أسهل توقيت ، وربما أقوم في المستقبل بشرح الموقتات الأخرى.

كيف تعمل
أول شيء يجب أن تراه هو ورقة بيانات ATmega328P.
COUNTER BLOCK DIAGRAM
هذا هو مخطط كتلة العداد ، وبالنظر إلى هذا يمكنك فهم كيفية عمله.

يتلقى جهاز metaler نبضًا من دورة الساعة ثم يمررها إلى Control Logic ، وبالتالي يزيد Log Control من سجل TCNTn بمقدار 1.

الآن يمكننا مقارنة قيمة TCNTn بقيمة محددة. عندما يصل سجل TCNTn إلى هذه القيمة ، ستعرف أنه يتم تمريره في وقت محدد.

هذه الطريقة تسمى وضع CTC لـ "Clear Timer on Compare". تتم مقارنة قيمة سجل TCNTn بسجل OCRn ، عندما تحدث مطابقة مقارنة TOVn يولد مقاطعة.

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



شيء آخر مهم هو تحديد قيمة التسجيل OCRn لحساب وقت معين ، تحتاج إلى القليل من الرياضيات.


أعلم أن كل هذا يمكن أن يبدو معقدًا للغاية ولكني متأكد من أن الشفرة أدناه ستوضح كل سؤال.

في هذه الحالة ، نقوم بتنشيط طلب المقاطعة كل 0.1 ثانية.

TCCR0A|=(1<<WGM01);    //Set the CTC mode
 OCR0A=0xF9;            //Set the value for 1ms
 TIMSK0|=(1<<OCIE0A);   //Set the interrupt request
 sei();                 //Enable interrupt
 TCCR0B|=(1<<CS01);    //Set the prescale 1/64 clock
 TCCR0B|=(1<<CS00);
ISR(TIMER0_COMPA_vect){    //This is the interrupt request
}

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

/*
This program turns on and off a LED on pin 13 each 1 second using an internal timer
*/

int timer=0;
bool state=0;
void setup() {
  pinMode(13,OUTPUT);
    
  TCCR0A=(1<<WGM01);    //Set the CTC mode   
  OCR0A=0xF9; //Value for ORC0A for 1ms 
  
  TIMSK0|=(1<<OCIE0A);   //Set the interrupt request
  sei(); //Enable interrupt
  
  TCCR0B|=(1<<CS01);    //Set the prescale 1/64 clock
  TCCR0B|=(1<<CS00);

 
    
}

void loop() {
  //in this way you can count 1 second because the nterrupt request is each 1ms
  if(timer>=1000){
    state=!state;
    timer=0;
  }
  
  digitalWrite(13,state);
  
}

ISR(TIMER0_COMPA_vect){    //This is the interrupt request
  timer++;
}