Tìm kiếm mã

Điều khiển bóng đèn AC bằng bất kỳ điều khiển hồng ngoại nào với Arduino và rơ le

Điều khiển bóng đèn AC bằng bất kỳ điều khiển hồng ngoại nào với Arduino và rơ le

Trong hướng dẫn này, chúng ta sẽ học cách sử dụng điều khiển từ xa hồng ngoại để vận hành bóng đèn xoay chiều (AC) thông qua Arduino và mô-đun rơ-le. Dự án này bao gồm việc giải mã tín hiệu từ điều khiển từ xa và sử dụng chúng để điều khiển rơ-le, từ đó bật và tắt bóng đèn AC. Đến cuối hướng dẫn này, bạn sẽ có thể sử dụng bất kỳ điều khiển từ xa hồng ngoại nào để điều khiển đèn chiếu sáng của mình.

Chúng ta sẽ sử dụng bộ thu hồng ngoại để thu tín hiệu từ điều khiển từ xa, và Arduino sẽ diễn giải các tín hiệu này để thực hiện các hành động cụ thể. Mã được cung cấp sẽ cho phép bạn chọn loại điều khiển từ xa (màu đen hoặc trắng) và liệu bạn đang sử dụng PCB hay mô-đun trần cho bộ thu. Hãy đảm bảo xem video liên quan để biết thêm chi tiết và giải thích (trong video tại 0:00).

Phần cứng được giải thích

Đối với dự án này, các thành phần chính bao gồm bo mạch Arduino, mô-đun thu hồng ngoại và mô-đun rơ-le. Bộ thu hồng ngoại chịu trách nhiệm thu tín hiệu từ điều khiển từ xa và gửi chúng đến Arduino. Mô-đun rơ-le hoạt động như một công tắc để điều khiển bóng đèn AC, cho phép bật và tắt dựa trên các tín hiệu nhận được.

Mô-đun rơ-le kích hoạt mức CAO 5V
Mô-đun rơ-le kích hoạt mức CAO 5V

Bộ thu hồng ngoại thường hoạt động ở tần số 38 kHz và có thể phát hiện tín hiệu từ khoảng cách 10 đến 15 mét. Khi Arduino nhận được tín hiệu, nó giải mã và sử dụng rơ-le để điều khiển nguồn điện cho bóng đèn.

Hướng dẫn đấu dây

IR_remote_AC_relay_wiring

Bắt đầu đấu dây bằng cách kết nối mô-đun thu hồng ngoại với Arduino. Chân VCC của bộ thu kết nối với chân 5V trên Arduino, và chân nối đất kết nối với chân GND. Chân tín hiệu từ bộ thu hồng ngoại nên được kết nối với chân kỹ thuật số 11 trên Arduino.

Tiếp theo, kết nối mô-đun rơ-le. Chân điều khiển của rơ-le nên được nối với chân kỹ thuật số 2 trên Arduino. Ngoài ra, kết nối các chân VCC và GND của rơ-le với 5V và GND của Arduino tương ứng. Cuối cùng, nối bóng đèn AC với rơ-le theo thông số kỹ thuật của rơ-le để đảm bảo hoạt động an toàn.

Ví dụ mã & Hướng dẫn chi tiết

Trong giai đoạn thiết lập của chương trình, chúng ta khởi tạo giao tiếp nối tiếp và thiết lập chân rơ-le. Định danh RECV_PIN được đặt thành 11, là nơi chân tín hiệu của bộ thu hồng ngoại được kết nối. Điều này cho phép chúng ta nhận dữ liệu từ điều khiển từ xa.

void setup() {
  Serial.begin(9600);
  irrecv.enableIRIn(); // Khởi động bộ thu
  pinMode(RELAY_PIN, OUTPUT); // định nghĩa chân cho rơ-le là OUTPUT
  digitalWrite(RELAY_PIN, HIGH); // đặt rơ-le ở trạng thái TẮT lúc ban đầu
}

Trong hàm loop, chúng ta liên tục kiểm tra các tín hiệu đến từ điều khiển từ xa. Khi phát hiện tín hiệu, giá trị được giải mã và hành động tương ứng được thực hiện dựa trên phím được nhấn.

void loop() {
  if (irrecv.decode(&results)) {
    Serial.println(results.value, HEX); // In giá trị nhận được
    robojaxValidateCode(results.value); // Xác thực mã
    irrecv.resume(); // Nhận giá trị tiếp theo
  }
  delay(100);
}

Hàm robojaxValidateCode kiểm tra mã nhận được so với các giá trị đã biết cho điều khiển từ xa. Tùy thuộc vào phím nào được nhấn, nó sẽ thực hiện hành động tương ứng bằng cách sử dụng rơ-le.

void robojaxValidateCode(int cd) {
  if (type == 'W' && !PCB) {
    // Kiểm tra mã điều khiển từ xa màu trắng
    for (int i = 0; i < sizeof(whiteRemote) / sizeof(int); i++) {
      if (whiteRemote[i] == cd) {
        Serial.print("Phím được nhấn: ");
        Serial.println(whiteRemoteKey[i]);
        relayAction(whiteRemoteKey[i]); // Thực hiện hành động
      }
    }
  }
}

Trong hàm này, mã kiểm tra xem phím được nhấn có tương ứng với các giá trị mảng đã định nghĩa hay không. Nếu tìm thấy sự khớp, nó gọi hàm relayAction để bật hoặc tắt rơ-le, tùy thuộc vào phím được nhấn.

Trình diễn / Điều gì sẽ xảy ra

Sau khi hoàn tất việc đấu dây và tải mã lên, bạn có thể sử dụng điều khiển từ xa hồng ngoại của mình để điều khiển bóng đèn AC. Nhấn các phím được chỉ định trên điều khiển từ xa, và rơ-le sẽ kích hoạt hoặc hủy kích hoạt bóng đèn tương ứng. Hãy đảm bảo kiểm tra từng phím để xem phản hồi của nó (trong video tại 5:00).

Mốc thời gian video

  • 00:00 Bắt đầu
  • 00:49 Giới thiệu
  • 02:00 Đấu dây và kết nối
  • 05:27 Giải thích mã Arduino
  • 09:51 Trình diễn điều khiển bóng đèn AC bằng điều khiển từ xa khác
  • 13:13 Sử dụng điều khiển TV của bạn để điều khiển bóng đèn AC

Hình ảnh

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
Ngôn ngữ: 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

Nghĩ bạn có thể cần

Tài nguyên & tài liệu tham khảo

Chưa có tài nguyên nào.

Tập tin📁

Tập tin Fritzing