Come leggere i codici infrarosso di un telecomando TV con Arduino
Tramite Arduino è possibile leggere i codici inviati da in telecomando infrarossi e, ad esempio, pilotare dei relè per accendere o spegnere una lampada.Lo sketch è molto semplice, apri l'IDE di Arduino e inserisci questo codice:
l'esempio usa la libreria IRremote.
Per avere un azione di on/off (toggle) con lo stesso pulsante:
In linea di massima le modifiche sono queste:
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);
}
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: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
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'erroreThe 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)
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);
}