Problema con telecomando

Salve a tutti ho un problema con lo schetc qui sotto,in pratica per farla breve il tasto ON\OFF fà correttamente il suo lavoro, peccato che lo fà anche se premo altri tasti, e non capisco il perchè.

/*.....................................................................................TELECOMANDO\IRC.......................................................................................*/
                                                                 
                                                                 /*..............................................................*/
                                                                 

#include <IRremote.h>



const byte Irc(30);
IRrecv irrecv(Irc);
decode_results results;


unsigned long ValoreIrc=0;
unsigned long Time_T=millis();


boolean Acceso=0;
boolean Spento=1;

byte T_Vol=0;
byte T_Dx_Sx=0;
byte T_Func_Stop=0;
byte T_Su_Giu=0;
byte T_Play_Pause=0;
byte T_Eq=0;
byte T_St_rept=0;
byte Tasto_0=0;
byte T_Numero=0;
boolean TastoPremuto=0;

boolean Scrivi_T=0;

/*..............................................................*/
void SETTAGGIO_IRC()
{ 
 if(irrecv.decode(&results))                                      //SE ricevi un segnale
   {
    ValoreIrc=results.value;
    if(millis()-Time_T>=250)
     {      
      TELECOMANDO();       
     }
    Time_T=millis();     
                                                                    
    if(Scrivi_T=1)                                                //scrivi valore sul monitor 
      {
       Serial.print("");
       Serial.println(ValoreIrc);
      } 
    irrecv.resume();            
   }
}

/*..............................................................*/ 
void TELECOMANDO()
 
{
 T_SPENTO_ACCESO();
}
  
/*..............................................................*/
void T_SPENTO_ACCESO()
{
  if(ValoreIrc==16753245||3810010651)
      {
       Acceso=!Acceso;
       Spento=!Spento;
      }
    else{Acceso=Acceso;}   
 
    
 if(Scrivi_T=1)
   {
    Serial.print("");
    Serial.print("Acceso  ");
    Serial.println(Acceso); 
    Serial.print("");
    Serial.print("Spento  ");
    Serial.println(Spento);     
   } 
 }
 
void loop() 
{
 SETTAGGIO_IRC(); 
 Scrivi_T=1; 
}

Ho provato questa alternativa

/*..............................................................*/
void T_SPENTO_ACCESO()
{
if(acceso==0)
 {
  if(ValoreIrc==16753245||3810010651)
      {
       Acceso=!Acceso;
       Spento=!Spento;
      }
    else{Acceso=Acceso;}   
 }
    
 if(Scrivi_T=1)
   {
    Serial.print("");
    Serial.print("Acceso  ");
    Serial.println(Acceso); 
    Serial.print("");
    Serial.print("Spento  ");
    Serial.println(Spento);     
   } 
 }

che ha risolto il problema degli altri tasti(che rompono),m cosi facendo non posso più spegnere il telecomando dal tasto ON\OFF... >:( >:( >:( >:( >:(

sono sicuro (perchè ho provato) che il primo programma che hai postato non funziona!
non c'è nemmeno la funzione setup() per cui non compila
hai provato a caricare uno degli esempi della libreria iremote?
ci sono molte differenze con quello che hai scritto

solo una nota...

void TELECOMANDO()
 
{
 T_SPENTO_ACCESO();
}

fare una funzione il cui unico scopo è richiamare un'altra funzione mi pare inutile :slight_smile:

Scusate mi ero scordato il setup :cold_sweat:

void setup()
{
 Serial.begin(9600);
  
 //RUOTE
 for(byte i=0;i<6;i++)
    {
     pinMode(Ruote[i],OUTPUT);
    }
    
 //TELECOMANDO
 irrecv.enableIRIn(); 
   
 
  
}

lo so che al momento è inutile,ma in realtà la funzione "void TELECOMANDO()" appena risolvo il mio problema, :sob: :sob: conterrà tutte le funzioni per i vari tasti.

Le differenze tra gli esempi della libreria e il mio schetc,sono dovuti al fatto che foglio fare cose diverse contemporaneamente,usando il telecomando,ed al momento anche in rete non ho trovato nulla,solo esempi che riportano alle librerie.

sarebbe più semplice se usassi delle variabili per codificare i vari tasti (come negli esempi)
per esempio:

long tastoOn= 16753245     // di solito sono esadecimali...
long tastoOff=3810010651
// dopodichè diventa più semplice
 if(ValoreIrc==tastoOn.....)

comunque questa è quanto meno dubbia

 if(ValoreIrc==16753245||3810010651)

così è meglio

 if((ValoreIrc==16753245) || (ValoreIrc==3810010651))

:wink:

Prove già fatte :confused: :confused:

anche con #define il valore letto, ma il risultato non cambia.

La variabile " ValoreIrc=results.value;" l'ho messa per rendere indipendente il "results.value;".

Questo"if(ValoreIrc==16753245||3810010651)" giustamente come mi fai notare o più corretto scritto"if((ValoreIrc==16753245) || (ValoreIrc==3810010651))",
ma il risutato è lo stesso.

I due valori differenti dipendono solo da dove si trova il trova il telecomando,rispetto al ricevitore(li ho scelti perche sono quelli più frequenti).

Il mio problema è che se spingo un tasto qualsiasi,cambia il valore di "Acceso", mentre dovrebbe farlo solo se la variabile"ValoreIrc=results.value;".

E non capisco dove sto sbagliando :sob: :sob:

devi prima di tutto capire che codice invia il telecomando alla pressione di ogni tasto, non può cambiare il codice in funzione di "dove si trova il telecomando rispetto al ricevitore" non ha alcun senso!

per avere un riscontro del perchè acceso cambia stato, usa delle serial.print() per mostrare a monitor le varie variabili subito dopo averle modificate così ti rendi conto di dove passa il programma e perchè

ciao Puso,

espongo le mie considerazioni...in questo pezzo di codice:

 if (ValoreIrc == 16753245 || 3810010651)
  {
    Acceso = !Acceso;
    Spento = !Spento;
  }
  else {
    Acceso = Acceso;
  }

sicuramente i due litterals vanno scritti con UL (Unsigned Long) alla fine...cioè: 16753245UL e 3810010651UL.
non capisco l'utilità dell'else...non cambi nulla...
poi non "svuoti" mai la variabile ValoreIrc...che avrà sempre l'ultimo valore salvato...ti consiglio, dopo la sua verifica, di portarla ad un valore "neutro" .
poi hai un paio di:

if (Scrivi_T = 1)

che non va bene...devi usare "==".
per il momento mi fermo qui...

comunque anche con l'aggiunta del setup il tuo programma non compila quindi non hai postato quello giusto.... :wink:

ok grazie ragazzacci ho letto i consigli
faccio le mie prove ...poi vi faccio sapere.

prova ad eseguire questo con il monitor seriale aperto e poi dimmi come va :wink:

unsigned long ValoreIrc ;

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

void loop() {
   // partendo da 16753245 incremento dello stesso valore
   // vediamo a che punto entra nell'else...
   // a quel punto il programma entra nel while e smette di scrivere sulla seriale
   //p .s.
  // 4294967295 è il numero più grande che ci sta nell'unsigned long
   for (ValoreIrc= 16753245; ValoreIrc <= 4294967295; ValoreIrc = ValoreIrc + 16753245) {
      if (ValoreIrc == 16753245 || 3810010651) {
         Serial.print("il valore è = ");
         Serial.println(ValoreIrc);
      } else {
         Serial.print("invece il valore è = ");
         Serial.println(ValoreIrc);
         while(1) {;}
      }
   }
}

praticamente simula i codici che puoi ricevere dal telecomando....

.... se poi vuoi provare questo, non mi pare che non cambi nulla :smiley: :smiley:

unsigned long ValoreIrc ;

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

void loop() {
   // qui al contrario sono 2 blocchi (altrimenti dura troppo)
   // partendo da 16753240 fino a 16753250
   // vediamo a che punto entra nell'if e nell'else...
   // e poi partendo da 3810010645 fino a 3810010655
   // vediamo a che punto entra nell'if e nell'else...
   // poi il programma entra nel while e smette di scrivere sulla seriale
   //
   for (ValoreIrc = 16753240; ValoreIrc <= 16753250; ValoreIrc++ ) {
      if ((ValoreIrc == 16753245) || (ValoreIrc == 3810010651)) {
         Serial.println(" ");
         Serial.print("è entrato nell'if!! perchè ");
         Serial.print("il valore è = ");
         Serial.println(ValoreIrc);
         Serial.println(" ");
      } else {
         Serial.print("è entrato nell'else!! perchè ");
         Serial.print("il valore è = ");
         Serial.println(ValoreIrc);
      }
   }
   for (ValoreIrc = 3810010645; ValoreIrc <= 3810010655; ValoreIrc++ ) {
      if ((ValoreIrc == 16753245) || (ValoreIrc == 3810010651)) {
         Serial.println(" ");
         Serial.print("è entrato nell'if!! perchè ");
         Serial.print("il valore è = ");
         Serial.println(ValoreIrc);
         Serial.println(" ");
      } else {
         Serial.print("è entrato nell'else!! perchè ");
         Serial.print("else il valore è = ");
         Serial.println(ValoreIrc);
      }
   }
   while (1) {
      ;
   }
}

Parte del problema stava proprio li if(ValoreIrc == 16753245 || 3810010651) al posto di if((ValoreIrc==16753245) || (ValoreIrc==3810010651))", probabilmente lo avevo escluso causa altri problemi.

Comunque ora funziona :smiley: :smiley: :smiley:

#include <IRremote.h>

const byte Irc(30);
IRrecv irrecv(Irc);
decode_results results;

unsigned long ValoreIrc=0;
unsigned long Time_T=millis();
unsigned long Time_Tasti=millis();

boolean Acceso=0;

byte Tasto_0=0;
byte T_Numero=0;
byte TT_Numero=0;

byte T_Vol=0;

byte T_Dx_Sx=0;
byte T_Func_Stop=0;
byte T_Su_Giu=0;
byte T_Play_Pause=0;
byte T_Eq=0;
byte T_St_rept=0;

boolean TastoPremuto=0;

boolean Scrivi_T=0;

/*..............................................................*/
void SETTAGGIO_IRC()
{ 
 if(irrecv.decode(&results))                                      //SE ricevi un segnale
   {
    ValoreIrc=results.value;
    if(millis()-Time_T>=250)
     {      
      TELECOMANDO();       
     }
    Time_T=millis();     
                                                                    
    if(Scrivi_T=1)                                                //scrivi valore sul monitor 
      {
       Serial.print("");
       Serial.println(ValoreIrc);
      } 
    irrecv.resume();            
   }
}

/*..............................................................*/ 
void TELECOMANDO() 
{
 T_SPENTO_ACCESO();
 if(Acceso==1)
   {   
    T_PROGRAMMI();
   }
}
  
/*..............................................................*/
void T_SPENTO_ACCESO()
{
 if((ValoreIrc==16753245UL)||(ValoreIrc==3810010651UL))
   {
    Acceso=!Acceso;
   }
 if(Scrivi_T==1)
   {
    Serial.print("");
    Serial.print("Acceso  ");
    Serial.println(Acceso);     
   } 
 }
 
/*..............................................................*/ 
void T_NUMERO()
{
 if((ValoreIrc==16724175UL)||(ValoreIrc==2534850111UL)){T_Numero=1;}                      //TASTO_NUMERO
 if((ValoreIrc==16718055UL)||(ValoreIrc==1033561079UL)){T_Numero=2;}
 if((ValoreIrc==16743045UL)||(ValoreIrc==1635910171UL)){T_Numero=3;}
 if((ValoreIrc==16716015UL)||(ValoreIrc==2351064443UL)){T_Numero=4;}
 if((ValoreIrc==16726215UL)||(ValoreIrc==1217346747UL)){T_Numero=5;}
 if((ValoreIrc==16734885UL)||(ValoreIrc==71952287UL))  {T_Numero=6;}
 if((ValoreIrc==16728765UL)||(ValoreIrc==851901943UL)) {T_Numero=7;}
 if((ValoreIrc==16730805UL)||(ValoreIrc==465573243UL)) {T_Numero=8;}
 if((ValoreIrc==16732845UL)||(ValoreIrc==1053031451UL)){T_Numero=9;}
}
 
/*..............................................................*/

Adesso sto perfezionando questa parte per i numeri da 10 a 99

Manca ancora qualcosa ma ci sono quasi

void T_PROGRAMMI()
{
 T_NUMERO();   
 if(millis()-Time_Tasti>=3000)
   {      
    TT_Numero=T_Numero;
    T_NUMERO();
    TT_Numero=TT_Numero*10+T_Numero;
    if((ValoreIrc==16738455)||(ValoreIrc==3238126971))
      {
       TT_Numero=T_Numero*10;                      
      }
    T_Numero=TT_Numero;              
   }
   else{T_Numero=T_Numero;}
 Time_Tasti=millis(); 
    
 if(Scrivi_T==1)
   {
    Serial.print("");
    Serial.print("Tasto_Numero  ");
    Serial.println(T_Numero);
   }   
}


void setup()
{
 Serial.begin(9600);
  
 //RUOTE
 for(byte i=0;i<6;i++)
    {
     pinMode(Ruote[i],OUTPUT);
    }
    
 //TELECOMANDO
 irrecv.enableIRIn(); 
   
 //ULTRASUONO
 pinMode(Echo,INPUT);
 pinMode(Trig,OUTPUT);
  
}

 void loop() 
{
 SETTAGGIO_IRC(); 
 Scrivi_T=1;
}

Al momento grazie a tutti