Caută cod

Controlează un bec de curent alternativ folosind orice telecomandă infraroșu cu un Arduino și un releu

Controlează un bec de curent alternativ folosind orice telecomandă infraroșu cu un Arduino și un releu

În acest tutorial, vom învăța cum să folosim o telecomandă cu infraroșu pentru a opera un bec de curent alternativ printr-un Arduino și un modul de releu. Acest proiect implică decodarea semnalelor de la telecomandă și utilizarea lor pentru a controla releul, care la rândul său va porni și opri becul de curent alternativ. Până la sfârșitul acestui tutorial, veți putea folosi orice telecomandă cu infraroșu pentru a controla corpul de iluminat.

Vom folosi un receptor cu infraroșu pentru a capta semnalele de la telecomandă, iar Arduino va interpreta aceste semnale pentru a efectua acțiuni specifice. Codul furnizat vă va permite să selectați tipul de telecomandă (neagră sau albă) și dacă utilizați un PCB sau un modul gol pentru receptor. Asigurați-vă că urmăriți videoclipul asociat pentru detalii și clarificări suplimentare (în videoclip la 0:00).

Hardware Explicat

Pentru acest proiect, componentele principale includ placa Arduino, un modul receptor cu infraroșu și un modul de releu. Receptorul cu infraroșu este responsabil pentru captarea semnalelor de la telecomandă și trimiterea lor către Arduino. Modulul de releu acționează ca un comutator pentru a controla becul de curent alternativ, permițându-i să se pornească și să se oprească pe baza semnalelor primite.

Modul releu cu declanșare pe nivel HIGH de 5V
Modul releu cu declanșare pe nivel HIGH de 5V

Receptorul cu infraroșu funcționează de obicei la o frecvență de 38 kHz și poate detecta semnale de la o distanță de aproximativ 10 până la 15 metri. Odată ce Arduino primește semnalul, îl decodifică și folosește releul pentru a controla alimentarea becului.

Instrucțiuni de Cablare

IR_remote_AC_relay_wiring

Începeți cablarea conectând modulul receptor cu infraroșu la Arduino. Pinul VCC al receptorului se conectează la pinul de 5V de pe Arduino, iar pinul de masă se conectează la un pin GND. Pinul de semnal de la receptorul cu infraroșu ar trebui conectat la pinul digital 11 de pe Arduino.

Apoi, conectați modulul de releu. Pinul de control al releului ar trebui conectat la pinul digital 2 de pe Arduino. De asemenea, conectați pinii VCC și GND ai releului la pinii de 5V și GND ai Arduino, respectiv. În final, conectați becul de curent alternativ la releu conform specificațiilor releului pentru a asigura o funcționare sigură.

Exemple de Cod și Explicații

În faza de configurare a programului, inițializăm comunicarea serială și setăm pinul releului. Identificatorul RECV_PIN este setat la 11, care este locul unde este conectat pinul de semnal al receptorului cu infraroșu. Acest lucru ne permite să primim date de la telecomandă.

void setup() {
  Serial.begin(9600);
  irrecv.enableIRIn(); // Porniți receptorul
  pinMode(RELAY_PIN, OUTPUT); // definiți un pin pentru releu ca OUTPUT
  digitalWrite(RELAY_PIN, HIGH); // setați releul pe OFF la început
}

În funcția loop, verificăm continuu semnalele primite de la telecomandă. Când este detectat un semnal, valoarea este decodificată, iar acțiunea corespunzătoare este efectuată pe baza tastei apăsate.

void loop() {
  if (irrecv.decode(&results)) {
    Serial.println(results.value, HEX); // Afișați valoarea primită
    robojaxValidateCode(results.value); // Validați codul
    irrecv.resume(); // Recepționați următoarea valoare
  }
  delay(100);
}

Funcția robojaxValidateCode verifică codul primit în raport cu valorile cunoscute pentru telecomandă. În funcție de tasta apăsată, va executa acțiunea corespunzătoare folosind releul.

void robojaxValidateCode(int cd) {
  if (type == 'W' && !PCB) {
    // Verificați codurile telecomenzii albe
    for (int i = 0; i < sizeof(whiteRemote) / sizeof(int); i++) {
      if (whiteRemote[i] == cd) {
        Serial.print("Tasta apăsată: ");
        Serial.println(whiteRemoteKey[i]);
        relayAction(whiteRemoteKey[i]); // Efectuați acțiunea
      }
    }
  }
}

În această funcție, codul verifică dacă tasta apăsată corespunde valorilor definite în array. Dacă se găsește o potrivire, apelează funcția relayAction pentru a porni sau opri releul, în funcție de tasta apăsată.

Demonstrație / Ce să Vă Așteptați

După finalizarea cablării și încărcarea codului, puteți folosi telecomanda cu infraroșu pentru a controla becul de curent alternativ. Apăsați tastele desemnate de pe telecomandă, iar releul ar trebui să activeze sau să dezactiveze becul în consecință. Asigurați-vă că testați fiecare tastă pentru a vedea răspunsul acesteia (în videoclip la 5:00).

Marcaje de Timp în Videoclip

  • 00:00 Început
  • 00:49 Introducere
  • 02:00 Cablare și conexiune
  • 05:27 Codul Arduino explicat
  • 09:51 Demonstrație de control al becului de curent alternativ cu diferite telecomenzi
  • 13:13 Folosirea telecomenzii TV pentru a controla becul de curent alternativ

Imagini

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
Limba: 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

Lucruri de care ai putea avea nevoie

Resurse și referințe

Încă nu sunt resurse.

Fișiere📁

Fișier Fritzing