Salve da molto tempo ero infastidito dal fatto di dover usare due telecomandi in sala, ho un amplificatore e una tv collegati assieme e dalla tv non posso controllare l amplificatore, quindi non posso comandare il volume e settare l amplificatore, di contro anche con il telecomando dell amplificatore non posso cambiare canale eccetera… in realtà il telecomando dell amplificatore mi permette alcune cose ma non tutte ma andiamo oltre.
Ho risolto questo problema grazie alla classe ir remote di arduino, con essa posso usare il telecomando della tv per comandare l amplificatore, infatti arduino non fa altro che riconoscere il comando impartito e reinviare il comando , per alzare il volume ad esempio, all amplificatore. funziona a meraviglia e fin qui tutto ok.
ho collegato anche un dispositivo simile ad un raspberry alla tv lo uso come mediacenter, si chiama odroid c2 e per accenderlo bisognava alzarsi ogni volta per premere un tasto, quindi ho inserito un transisotor comandato da una porta di arduino che accende il mediacenter quando premo un certo tasto del telecomando, anche questa funzione va a meraviglia, ma passato diverso tempo l’odroid si accende di sua iniziativa nonostante la porta logica destinata al transistor sia settata su low.
io non capisco se questo comportamento sia dovuto al codice di arduino, o qualcos’altro, tenete presente che uso anche un raspberry pi3 sempre come mediacenter in camera da letto collegato ad arduino ma questa volta solo per accenderlo e questo funziona regolarmente.
vi allego il codice perdonate gli errori di ignoranza eventuali
#ifndef driver_ir
#define driver_ir
#include <IRremote.h>
IRsend irsend; //
int ric_pin=11;
int led=13;
int transistor=4; // transistor per accensione raspberry
//CODICI DECIMALI TELECOMANDO LG INPUT :////////////////////////////////////////////////////////////
#define codVol_up 551502015
#define codVol_down 551534655
#define cod_up 551486205
#define cod_down 551518845
#define cod_sx 551542815
#define cod_dx 551510175
#define cod_ok 551494365
#define cod_back 551490795
#define cod_green 551521905
#define cod_red 551505585
#define cod_yellow 551536185
#define cod_blue 551519865
#define cod_AD 551520630
/////////////////////////////////FINE CODICI LG//////////////////////////////////////////////////////
//CODICI HEX TELECOMANDO YAMAHA OUTPUT:
#define YcodVol_up 0X5EA158A7
#define YcodVol_down 0X5EA1D827
#define Ycod_up 0X5EA1B946
#define Ycod_down 0X5EA139C6
#define Ycod_sx 0X5EA1F906
#define Ycod_dx 0X5EA17986
#define Ycod_ok 0X5EA17B84
#define Ycod_back 0X5EA155AA
#define Ycod_green 0X5EA152AC
#define Ycod_yellow 1587624644 // irsend accetta anche valori decimali
#define Ycod_blue 0X5EA1B24C
#define ON_AVR 2122405035
/////////////////////////////////FINE CODICI YAHAMA///////////////////////////////////////////////
IRrecv ricevitore(ric_pin); // oggetto ricevitore inizializzato con il pin di ricezione
decode_results decodifica; // struttura dati con i valori decodificati, CONTIENE VALORI DI DECODIFICA RAW,HEX, DEC
class telecomando{
public:
telecomando(); //costruttore di default puo essere omesso
telecomando(unsigned long segnale); //costruttore sovraccaricato
void confronto();
private:
unsigned long _segnale;
};
#endif
#include "driver_ir.h" // include l'header che si trova nella stessa directory del programma.ino
void setup(){
pinMode(transistor,OUTPUT); // inizializzazione accensione raspberry
digitalWrite(transistor,LOW);
Serial.begin(9600); //inizializzazione monitor seriale
ricevitore.blink13(ric_pin); // attiva il led 13 per lampeggiare alla ricezione di un impulso ir
ricevitore.enableIRIn(); // avvio la ricezione
}
void loop() {
if (ricevitore.decode(&decodifica)){
telecomando yamaha(decodifica.value); // inizializzo l oggetto di tipo telecoando chiamato yamaha passandogli la lettura del codice ir
yamaha.confronto(); //seleziono e invio il segnale yamaha tramite il metodo confronto
ricevitore.enableIRIn(); //riabilito la ricezione dopo che irsend l ha disabilitata
// delay(50);
ricevitore.resume(); //riavvio lettura ir
}
}
//pagina 3 con selezione codice e invio
#include "driver_ir.h"
telecomando::telecomando(unsigned long segnale){
_segnale=segnale;
}
void telecomando::confronto(){
delay(50); // ritardo tra 2 letture
Serial.println(decodifica.value); // monitor seriale
switch (decodifica.value){
case codVol_up:
Serial.println("comando vol+ ricevuto!");
irsend.sendNEC(YcodVol_up,32);
Serial.println("comando vol+ inviato!");
break;
case codVol_down:
Serial.println("comando vol- ricevuto!");
irsend.sendNEC(YcodVol_down,32);
Serial.println("comando vol- inviato!");
break;
case cod_up:
Serial.println("comando SU ricevuto!");
irsend.sendNEC(Ycod_up,32);
Serial.println("comando su inviato!");
break;
case cod_down:
Serial.println("comando giu ricevuto!");
irsend.sendNEC(Ycod_down,32);
Serial.println("comando giu inviato!");
break;
case cod_sx:
Serial.println("comando sx ricevuto!");
irsend.sendNEC(Ycod_sx,32);
Serial.println("comando sx inviato!");
break;
case cod_dx:
Serial.println("comando dx ricevuto!");
irsend.sendNEC(Ycod_dx,32);
Serial.println("comando dx inviato!");
break;
case cod_ok:
Serial.println("comando ok ricevuto!");
irsend.sendNEC(Ycod_ok,32);
Serial.println("comando ok inviato!");
break;
case cod_back:
Serial.println("comando back ricevuto!");
irsend.sendNEC(Ycod_back,32);
Serial.println("comando back inviato!");
break;
case cod_green:
Serial.println("comando VERDE ricevuto!");
irsend.sendNEC(Ycod_green,32);
Serial.println("comando HDMI2 inviato!");
break;
case cod_red:
Serial.println("comando rosso ricevuto!");
digitalWrite(transistor,HIGH);
delay(2500);
digitalWrite(transistor,LOW);
Serial.println("raspberry acceso");
break;
case cod_yellow:
Serial.println("comando GIALLO ricevuto!");
irsend.sendNEC(Ycod_yellow,32);
Serial.println("comando AV4 inviato!");
break;
case cod_blue:
Serial.println("comando blu ricevuto!");
irsend.sendNEC(Ycod_blue,32);
Serial.println("comando HDMI3 inviato!");
break;
case cod_AD:
Serial.println("comando AD ricevuto!");
irsend.sendNEC(ON_AVR,32);
Serial.println("comando on_AVR inviato!");
break;
/*
//automatismo accensione mediacenter + passaggio hdmi su tv e amplificatore
case cod_red:
Serial.println("comando ROSSO ricevuto!");
delay(3000); // attendi 20 sec
irsend.sendNEC(0X5EA152AC,32);//imposta hdmi2 yamaha hdmi2
Serial.println("comando hdmi 2 inviato");
delay(1000);
irsend.sendNEC(0X20DFD02F,32); //imposta hdmi su tv input
Serial.println("comando input lg ");
delay(1000);
irsend.sendNEC(0X20DFD02F,32); //imposta hdmi su tv input
Serial.println("comando hdmi su lg!");
delay(1000);
irsend.sendNEC(0X5EA17B84,32); //imposta hdmi su tv ok
Serial.println("comando ok");
// ricevitore.enableIRIn(); //riabilito la ricezione dopo che irsend l ha disabilitata
break; */
}
}