Decoder infrarosso per usare un solo telecomando in casa.

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;  */

        
    }

    
    }