Tramite Arduino è possibile leggere i codici inviati da in telecomando infrarossi e, ad esempio, pilotare dei relè per accendere o spegnere una lampada.
comando rele con infrarossocomando rele con infrarosso
Lo sketch è molto semplice, apri l'IDE di Arduino e inserisci questo codice:
Arduino
#include <IRremote.h>

int IRPIN = 2;
int RELE_PIN = 4;

IRrecv irrecv(IRPIN);

decode_results result;

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

  pinMode(RELE_PIN, OUTPUT);

  Serial.println("Enabling IRin ...");
  irrecv.enableIRIn();
  Serial.println("Enabled IRin");
  digitalWrite(RELE_PIN, HIGH);
}

void loop()
{
  if (irrecv.decode(&result))
  {
    Serial.println(result.value, HEX);
    irrecv.resume();

    //comando il relè
    if (result.value == 0x4BB640BF) {
      //Volume+ accendo il relè
      digitalWrite(RELE_PIN, LOW);
      Serial.println("ON");
    } else if (result.value == 0x4BB6C03F) {
      //Volume- spengo il relè
      digitalWrite(RELE_PIN, HIGH);
      Serial.println("OFF");
    }
  }
  delay(500);
}
l'esempio usa la libreria IRremote.
Assicurati che la board sia Arduino, che la porta COM sia quella giusta e la velocità sia 9600 baud
fai l'upload del codice e apri il Serial monitor per vedere i codici ricevuti:
Serial monitorSerial monitor
quando premi il pulsante Volume+ il relè si attiva (eccita) quando premi il pulsante Volume- il relè si spenge (diseccita).
I codici 0x4BB640BF e 0x4BB6C03F sono validi per un Telecomando LG.
Se usi un altro telecomando, o vuoi usare altri pulsanti, sostituisci i valori con i relativi codici visualizzati nel serial monitor

Per avere un azione di on/off (toggle) con lo stesso pulsante:
Arduino
#include <IRremote.h>

int IRPIN = 2;
int RELE_PIN = 4;

//memorizza lo stato del relè
int releStatus = HIGH;

IRrecv irrecv(IRPIN);

decode_results result;

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

  pinMode(RELE_PIN, OUTPUT);

  Serial.println("Enabling IRin ...");
  irrecv.enableIRIn();
  Serial.println("Enabled IRin");
  digitalWrite(RELE_PIN, releStatus);
}

void loop()
{
  if (irrecv.decode(&result))
  {
    Serial.println(result.value, HEX);
    irrecv.resume();

    //comando il relè on/off
    if (result.value == 0x4BB640BF) {
      //Volume+ inverto lo stato del relè
      releStatus = releStatus==LOW ? HIGH : LOW;
      digitalWrite(RELE_PIN, releStatus);
      Serial.println(releStatus==LOW ? "ON" : "OFF");
    } 
  }
  delay(500);
}

Nuova versione

Se ottieni l'errore
The function decode(&results)) is deprecated and may not work as expected! Just use decode() without a parameter and IrReceiver.decodedIRData.<fieldname>
vuol dire che stai usando una versione della libreria IRremote più recente dove sono stati fatti dei cambiamenti e quindi va modificato il codice.

In linea di massima le modifiche sono queste:
  • va eliminata la variabile irrecv e sostituita con il nuovo oggetto IrReceiver
  • la libreria va inzializzata nel setup con IrReceiver.begin(IRPIN, ENABLE_LED_FEEDBACK)
  • il metodo decode non vuole parametri IrReceiver.decode()
  • il valore ricevuto va letto con IrReceiver.decodedIRData.decodedRawData
  • va abilitata le ricezione del prossimo comando con IrReceiver.resume()
  • per stampare nella seriale si può usare IrReceiver.printIRResultMinimal(&Serial)
questo e il codice Arduino aggiornato
Arduino
#include <IRremote.h>

// pin dove è collegato il ricevitore infrarossi
int IRPIN = 2;

// pin dove è collegato il relè
int RELE_PIN = 4;

//memorizza lo stato del relè
int releStatus = HIGH;

void setup()
{
  Serial.begin(115200);

  pinMode(RELE_PIN, OUTPUT);

  Serial.println("Enabling IRin ...");
  
  // inizializzo il ricevitore infrarossi sull'oggetto IrReceiver
  IrReceiver.begin(IRPIN, ENABLE_LED_FEEDBACK); 
  
  Serial.println("Enabled IRin");
  digitalWrite(RELE_PIN, releStatus);
}

void loop()
{
  // decode da chiamare senza parametri
  if (IrReceiver.decode())
  {
    Serial.println();
    Serial.println("-------------------");
    
    //Serial.println(IrReceiver.decodedIRData.protocol, HEX);
    //Serial.println(IrReceiver.decodedIRData.address, HEX);
    //Serial.println(IrReceiver.decodedIRData.command, HEX);
    //Serial.println(IrReceiver.decodedIRData.decodedRawData, HEX);
    // stampa il risultato dei comandi commentati
    IrReceiver.printIRResultMinimal(&Serial);

    // abilito la ricezione del prossimo valore
    IrReceiver.resume();

    //comando il relè
    // decodedRawData per avere il codice inviato
    if (IrReceiver.decodedIRData.decodedRawData == 0xFD02FB04) {
      //Volume+ inverto lo stato del relè
      releStatus = releStatus==LOW ? HIGH : LOW;
      digitalWrite(RELE_PIN, releStatus);
      Serial.println();
      Serial.println(releStatus==LOW ? "ON" : "OFF");
    } 
  }
  delay(500);
}
Potrebbe interessarti anche: