كود البحث

تحكم في مصباح AC باستخدام أي جهاز تحكم عن بعد بالأشعة تحت الحمراء مع أردوينو وRelay

تحكم في مصباح AC باستخدام أي جهاز تحكم عن بعد بالأشعة تحت الحمراء مع أردوينو وRelay

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

سنستخدم مستقبلًا بالأشعة تحت الحمراء لالتقاط الإشارات من جهاز التحكم عن بُعد، وسيفسر الـ Arduino هذه الإشارات لأداء إجراءات معينة. سيمكنك الكود المقدم من اختيار نوع جهاز التحكم (أسود أو أبيض) وما إذا كنت تستخدم لوحة دوائر مطبوعة أو وحدة عارية للمستقبل. تأكد من مشاهدة الفيديو المرتبط للحصول على تفاصيل إضافية وتوضيحات (في الفيديو في 0:00).

شرح الأجهزة

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

وحدة مرحل بمستوى عالٍ 5 فولت
وحدة ترحيل تحكم مستوى عالٍ 5 فولت

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

تعليمات التوصيل

IR_remote_AC_relay_wiring

ابدأ بتوصيل الأسلاك من خلال ربط وحدة استقبال الأشعة تحت الحمراء بأردوينو. يتصل دبوس VCC من المستقبل بالدبوس 5V على الأردوينو، ويتصل دبوس الأرضي بدبوس GND. يجب توصيل دبوس الإشارة من مستقبل الأشعة تحت الحمراء بالدبوس الرقمي.11على الأردوينو.

بعد ذلك، قم بتوصيل وحدة الريليه. يجب توصيل دبوس التحكم في الريليه بالدبوس الرقمي.2على الأردوينو. أيضًا، قم بتوصيل دبابيس VCC و GND للريلي بالأردوينو 5V و GND على التوالي. أخيرًا، قم بتوصيل مصباح التيار المتردد بالريلي وفقًا لمواصفات الريلي لضمان تشغيل آمن.

أمثلة الشيفرة وشرح تفصيلي

في مرحلة الإعداد من البرنامج، نقوم بتهيئة الاتصالات التسلسلية وضبط دبوس التتابع. المُعرفRECV_PINتم تعيينه لـ11، حيث يتم توصيل دبوس إشارة مستقبل الأشعة تحت الحمراء. هذا يسمح لنا باستقبال البيانات من جهاز التحكم عن بعد.

void setup() {
  Serial.begin(9600);
  irrecv.enableIRIn(); // Start the receiver
  pinMode(RELAY_PIN, OUTPUT); // define a pin for relay as OUTPUT
  digitalWrite(RELAY_PIN, HIGH); // set relay to OFF at the beginning
}

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

void loop() {
  if (irrecv.decode(&results)) {
    Serial.println(results.value, HEX); // Print the received value
    robojaxValidateCode(results.value); // Validate the code
    irrecv.resume(); // Receive the next value
  }
  delay(100);
}

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

void robojaxValidateCode(int cd) {
  if (type == 'W' && !PCB) {
    // Check White remote codes
    for (int i = 0; i < sizeof(whiteRemote) / sizeof(int); i++) {
      if (whiteRemote[i] == cd) {
        Serial.print("Key pressed: ");
        Serial.println(whiteRemoteKey[i]);
        relayAction(whiteRemoteKey[i]); // Take action
      }
    }
  }
}

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

عرض / ما يمكن توقعه

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

توقيتات الفيديو

  • :00 ابدأ
  • 00:49 مقدمة
  • 02:00 التوصيل والأسلاك
  • 05:27 شرح كود أردوينو
  • 09:51 عرض التحكم بمصباح الإضاءة المتغيرة باستخدام جهاز تحكم عن بعد مختلف
  • :13 استخدام جهاز التحكم عن بُعد للتلفاز للتحكم في لمبة التكييف

الصور

5V LOW-LEVEL trigger relay
5V LOW-LEVEL trigger relay
5V HIGH-level trigger relay module
5V HIGH-level trigger relay module
remote
remote
IR_remote_AC_relay_wiring
IR_remote_AC_relay_wiring
138-Source for controlling an AC load using an Arduino
اللغة: C++
/*
 * Original library from - http://arcfn.com
 * 
 * This Arduino code decodes any remote code and then you can control an AC load using a relay
 * sold on eBay for Arduino. 
 * You have to select the type of your remote as Black or White in the code below
 * and also select your receiver 1838 as either a PCB or bare module. See video for details
 * 
 * You have to watch this video: https://youtu.be/muAkBQb24NI
 * before proceeding with this code. 
 * 
 * Modified/Written by Ahmad Shamshiri
 * on July 31, 2018 at 20:33 in Ajax, Ontario, Canada
 * for Robojax.com
 * Watch video instructions for this code: https://youtu.be/j5kb0WBpD30
 * Get other Arduino codes from Robojax.com
 * 
 */

#include <IRremote.h>

int RECV_PIN = 11;
const char type ='W';// W for white, B for black. Must keep single quotes like 'B' or 'W'
const boolean PCB = 1;// if receiver is PCB set to 1, if not set to 0. See video for details
boolean displayCode = true;// to display remote code. if not, set to false

//***** Relay settings begins
const int RELAY_PIN = 2;// 
const String ON="3";// turn relay ON with + key on remote
const String OFF="1";// turn relay OFF with - key on remote
//**** Relay settings ends

IRrecv irrecv(RECV_PIN);


// this is array holding codes for White Remote when used with PCB version of receiver
unsigned int whiteRemotePCB[] ={
            0xE318261B, // CH-
            0x511DBB,   // CH
            0xEE886D7F,  // CH+

            0x52A3D41F, // |<<
            0xD7E84B1B, // >>|
            0x20FE4DBB, // >||          

            0xF076C13B, // -
            0xA3C8EDDB, // +
            0x12CEA6E6, // EQ

            0xC101E57B, // 0
            0x97483BFB, // 100+
            0xF0C41643, // 200+

            0x9716BE3F, // 1
            0x3D9AE3F7, // 2
            0x6182021B, // 3           

            0x8C22657B, // 4 
            0x488F3CBB, // 5
            0x449E79F,  // 6

            0x32C6FDF7, // 7
            0x1BC0157B, // 8
            0x3EC3FC1B  // 9                          
            };

// this is array holding codes for White Remote when used with non-PCB version of receiver            
unsigned int whiteRemote[] ={
            0xFFA25D, // CH-
            0xFF629D,   // CH
            0xFFE21D,  // CH+

            0xFF22DD, // |<<
            0xFF02FD, // >>|
            0xFFC23D, // >||          

            0xFFE01F, // -
            0xFFA857, // +
            0xFF906F, // EQ

            0xFF6897, // 0
            0xFF9867, // 100+
            0xFFB04F, // 200+

            0xFF30CF, // 1
            0xFF18E7, // 2
            0xFF7A85, // 3           

            0xFF10EF, // 4 
            0xFF38C7, // 5
            0xFF5AA5,  // 6

            0xFF42BD, // 7
            0xFF4AB5, // 8
            0xFF52AD  // 9                          
            };
// key lables of white remote
 String whiteRemoteKey[] ={
            "CH-",
            "CH",
            "CH+",

            "|<<",
            ">>|",
            ">||",

            "-",
            "+",
            "EQ",

            "0",
            "100+",
            "200+",

            "1",
            "2",
            "3",

            "4",
            "5",
            "6",

            "7",
            "8",
            "9"
            };

// this is array holding codes for Black Remote when used with non-PCB version of receiver
 unsigned int blackRemote[] ={
            0xFF629D, // ^
            0xFF22DD,   // <
            0xFF02FD,  // OK
            0xFFC23D, // >
            0xFFA857, // v

            0xFF6897, // 1
            0xFF9867, // 2
            0xF0C41643, // 3           

            0xFF30CF, // 4 
            0xFF18E7, // 5
            0xFF7A85,  // 6

            0xFF10EF, // 7
            0xFF38C7, // 8
            0xFF5AA5,  // 9 

            0xFF42BD, // *
            0xFF4AB5, // 0
            0xFF52AD  // #                                      
            };

// this is array holding codes for Black Remote when used with PCB version of receiver
 unsigned int blackRemotePCB[] ={
            0x511DBB, // ^
            0x52A3D41F,   // <
            0xD7E84B1B,  // OK
            0x20FE4DBB, // >
            0xA3C8EDDB, // v


            0xC101E57B, // 1
            0x97483BFB, // 2
            0xF0C41643, // 3           

            0x9716BE3F, // 4 
            0x3D9AE3F7, // 5
            0x6182021B,  // 6

            0x8C22657B, // 7
            0x488F3CBB, // 8
            0x449E79F,  // 9 

            0x32C6FDF7, // *
            0x1BC0157B, // 0
            0x3EC3FC1B  // #                                      
            };

// Black remote key names
 String blackRemoteKey[] ={
            "^",
            "<",
            "OK",
            ">",
            "v",

            "1",
            "2",
            "3",

            "4",
            "5",
            "6",

            "7",
            "8",
            "9",
            
            "*",
            "0",
            "#"
            };

decode_results results;


void setup()
{
  Serial.begin(9600);
  // In case the interrupt driver crashes on setup, give a clue
  // to the user what's going on.
  Serial.println("Robojax IR Decode");
  Serial.println("Control Relay with Remote");
  irrecv.enableIRIn(); // Start the receiver

  pinMode(RELAY_PIN,OUTPUT);// define a pin for relay as OUTPUT
  digitalWrite(RELAY_PIN, HIGH);// set relay to OFF at the begining
}

void loop() {

  if (irrecv.decode(&results)) {
    if(displayCode)Serial.println(results.value, HEX);
    robojaxValidateCode(results.value);// used the "robojaxValidateCode" bellow
    irrecv.resume(); // Receive the next value
  }
  delay(100);
}

/*
 * function: robojaxValidateCode
 * validates the remote code and prints the correct key name
 * cd is code passed from the loop
 * Written by A. S. for Robojax
 */
void robojaxValidateCode(int cd)
{

  // Robojax IR Remote decoder
  int found=0;

 if(type =='W' && !PCB)
 {
    // Robojax IR White Remote decoder
    // if type is set to 'W' (white remote) and PCB=0 then check White remote code
      for(int i=0; i< sizeof(whiteRemote)/sizeof(int); i++)
      {
        if(whiteRemote[i] ==cd)
        {
          
          Serial.print("Key pressed:");
          Serial.println(whiteRemoteKey[i]);
          relayAction(whiteRemoteKey[i]);// take action
          found=1;
        }// if matched
      }// for
 }else if(type =='W' && PCB){
    // Robojax IR White Remote decoder
    // if type is set to 'W' (white remote) and PCB=1 then check White remote code
      for(int i=0; i< sizeof(whiteRemotePCB)/sizeof(int); i++)
      {
        if(whiteRemotePCB[i] ==cd)
        {
          
          Serial.print("Key pressed:");
          Serial.println(whiteRemoteKey[i]);
          relayAction(whiteRemoteKey[i]);// take action 
          found=1;
        }// if matched
      }// for  
 }else if(type =='B' && PCB){
    // Robojax IR Black Remote decoder
       // if type is set to 'B' (black remote) and PCB=1 then check Black remote code
       for(int i=0; i< sizeof(blackRemotePCB)/sizeof(int); i++)
      {
        // Robojax IR black Remote decoder
        if(blackRemotePCB[i] ==cd)
        {

          Serial.print("Key pressed:");
          Serial.println(blackRemoteKey[i]);
         relayAction(blackRemoteKey[i]);// take action     
          found=1;
        }// if matched
      }// for   
 }else{

      // if type is set to 'B' (black remote) and PCB =0 then check Black remote code
       for(int i=0; i< sizeof(blackRemote)/sizeof(int); i++)
      {
        // Robojax IR black Remote decoder
        if(blackRemote[i] ==cd)
        {

          Serial.print("Key pressed:");
          Serial.println(blackRemoteKey[i]);
          relayAction(blackRemoteKey[i]);// take action          
    
          found=1;
        }// if matched
      }// for  
 }// else
  if(!found){
    if(cd !=0xFFFFFFFF)
      {
    Serial.println("Key unknown");
      }
  }// found
}// robojaxValidateCode end

/*
 * 
 * relayAction()
 * receives string "value" as input and based on the settings, 
 * turns relay pin HIGH or LOW
 */
void relayAction(String value)
{
  // Robojax IR Relay control
   if(value == ON)
   {
    digitalWrite(RELAY_PIN, LOW);// Turn relay ON
    Serial.println("Relay Turned ON");
   }

   if(value == OFF)
   {
    digitalWrite(RELAY_PIN, HIGH);// Turn relay OFF
    Serial.println("Relay Turned OFF");
   }
}//relayAction end

الموارد والمراجع

لا توجد موارد حتى الآن.

ملفات📁

لا توجد ملفات متاحة.