Salve a tutti,
vorrei chiedere un aiutino di tipo concettuale più che altro, sull'utilizzo dell'input da comando IR, per fare ciò sto utilizzando questo semplice sketch:
#include <IRremote.h>
int RECV_PIN = 11;
IRrecv irrecv(RECV_PIN);
decode_results results;
int ButtonValue;
void setup()
{
Serial.begin(9600);
irrecv.enableIRIn(); // Start the receiver
}
void loop() {
long trsma;
if (irrecv.decode(&results)) {
trsma=results.value;
if (trsma<4294967295){
ButtonValue = translateIR();
Serial.print(results.value, HEX);
Serial.print(" ");
Serial.println(ButtonValue);
}
irrecv.resume(); // Receive the next value
}
}
int translateIR(){
switch(results.value){
case 0xFF6897://tasto 0
return 0;
break;
case 0xFF30CF://tasto 1
return 1;
break;
case 0xFF18E7://tasto 2
return 2;
break;
case 0xFF7A85://tasto 3
return 3;
break;
case 0xFF10EF://tasto 4
return 4;
break;
case 0xFF38C7://tasto 5
return 5;
break;
case 0xFF5AA5://tasto 6
return 6;
break;
case 0xFF42BD://tasto 7
return 7;
break;
case 0xFF4AB5://tasto 8
return 8;
break;
case 0xFF52AD://tasto 9
return 9;
break;
case 0xFFA25D://tasto spgnimento
return 20;
break;
case 0xFF629D://tasto mode
return 10;
break;
case 0xFFE21D://tasto mute
return 11;
break;
case 0xFF22DD://tasto |<<
return 12;
break;
case 0xFF02FD://tasto >>|
return 13;
break;
case 0xFFC23D://tasto >|| (play pausa)
return 14;
break;
case 0xFFE01F:// tasto -
return 15;
break;
case 0xFFA857: // tasto +
return 16;
break;
case 0xFF906F: // tasto EQ
return 17;
break;
case 0xFFB04F: // tasto indietro <--
return 18;
break;
case 0xFF9867: // tasto +100
return 19;
break;
default:
return 99;
break;
}
}
successivamente vorrei inserire un comando composto da due o più numeri, ad esempio per fare lampeggiare il led da 0 a 9 basta una sola digitazione ma dalla decima volta in poi come devo fare? da due giorni ci provo e non ne sto uscendo fuori, anche un piccolo consiglio è ben accetto. Grazie mille
potresti fare come fanno i telecomandi dei televisori più nuovi. Ogni volta che premi uno dei tasti da 0 a 9 il tv non cambia canale subito ma aspetta un certo tempo la pressione di ulteriori cifre. Trascorso un certo tempo senza che tu prema altro, lui salta al canale corrispondente alle cifre che hai premuto.
Farlo non è difficile, pensaci e se hai bisogno di aiuto, chiedi.
Veramente al momento lo sto implementando con l'incremento o il decremento premendo il tasto + o - la cosa non mi sta entusiasmando perché il codice diventa enorme e non mi sta venendo in mente come poterlo semplificare per riutilizzarlo, vorrei farlo diventare un menù ma così com'è diventerà un groviglio.
Ma poi se lo faccio "aspettare" come fa a prendere il secondo input "if (irrecv.decode(&results))" non si verifica visto che è imbrigliato nel delay, o almeno penso.
#include <IRremote.h>
int RECV_PIN = 11;
IRrecv irrecv(RECV_PIN);
decode_results results;
int InputValue;
int i,x,SET,SETORA, SETMIN, SETSEC, SETGG, SETMM, SETYY;
int ValoreTOT;
int ora, minuti, secondi, giorno, mese, anno;
void setup()
{
Serial.begin(9600);
irrecv.enableIRIn(); // Start the receiver
i=0;
}
void loop(){
if (irrecv.decode(&results)) {
ValoreTOT=PdUno();
if(ValoreTOT==10){
Serial.println("dimmi cosa vuoi inserire");
Serial.println("1 - Ora");
Serial.println("2 - Minuti");
Serial.println("3 - Secondi");
Serial.println("4 - Giorno");
Serial.println("5 - Mese");
Serial.println("6 - Anno");
SET=1;
ValoreTOT=99;
}
if(SET==1 && ValoreTOT==1){
Serial.println("Inserisci l'ora, ");
Serial.println("usa + per incrementare e - per decrementare");
Serial.println("Premi EQ per settare l'ora");
SETORA = 1;
}
if(SET==1 && ValoreTOT==2){
Serial.println("Inserisci i minuti, ");
Serial.println("usa + per incrementare e - per decrementare");
Serial.println("Premi EQ per settare i minuti");
SETMIN = 1;
}
if(ValoreTOT==16){
x+=1;
Serial.println(x);
ValoreTOT=99;
}
if(ValoreTOT==15 && x>0){
x-=1;
Serial.println(x);
ValoreTOT=99;
}
if(x==0 && ValoreTOT==15){
Serial.println("x gia' uguale a zero, impossibile decrementare");
}
if(SETORA==1 && ValoreTOT==17){
ora=x;
ValoreTOT=10;
SETORA=0;
x=0;
SET=0;
Serial.print("Hai settato l'ora a ");
Serial.println(ora);
}
if(SETMIN==1 && ValoreTOT==17){
minuti=x;
ValoreTOT=10;
SETMIN=0;
x=0;
SET=0;
Serial.print("Hai settato i minuti a ");
Serial.println(minuti);
}
}
}
int translateIR(){
switch(results.value){
case 0xFF6897://tasto 0
return 0;
break;
case 0xFF30CF://tasto 1
return 1;
break;
case 0xFF18E7://tasto 2
return 2;
break;
case 0xFF7A85://tasto 3
return 3;
break;
case 0xFF10EF://tasto 4
return 4;
break;
case 0xFF38C7://tasto 5
return 5;
break;
case 0xFF5AA5://tasto 6
return 6;
break;
case 0xFF42BD://tasto 7
return 7;
break;
case 0xFF4AB5://tasto 8
return 8;
break;
case 0xFF52AD://tasto 9
return 9;
break;
case 0xFFA25D://tasto spgnimento
return 20;
break;
case 0xFF629D://tasto mode
return 10;
break;
case 0xFFE21D://tasto mute
return 11;
break;
case 0xFF22DD://tasto |<<
return 12;
break;
case 0xFF02FD://tasto >>|
return 13;
break;
case 0xFFC23D://tasto >|| (play pausa)
return 14;
break;
case 0xFFE01F:// tasto -
return 15;
break;
case 0xFFA857: // tasto +
return 16;
break;
case 0xFF906F: // tasto EQ
return 17;
break;
case 0xFFB04F: // tasto indietro <--
return 18;
break;
case 0xFF9867: // tasto +100
return 19;
break;
default:
return 99;
break;
}
}
int PdUno(){
long trsma;
int RecVal;
trsma=results.value;
if (trsma<4294967295){
RecVal = translateIR();
delay(250);
}
irrecv.resume(); // Receive the next value
return RecVal;
}
Allora ora te lo spiego in grandi linee,tu dai una bozza di codice cosi memorizzi la cosa e se non ci riesci ti do una mano io con la stesura finale del codice ok?
Devi comportarti in questo modo:
ricevi il primo numero
1 e lo memorizza(array,stringa concatenata, quel che ti pare)
parte la mills(millis() - Arduino Reference)
aspetti (2,3,4,5 come ti pare) secondi dal primo input se non arriva altro lo utilizzi altrimenti concateni.
Madwriter hai ragione :), in effetti ho riletto il post e mi sono reso conto che per come l'ho scritto sembra che ad aspettare sia il telecomando e non il televisore.
Naturalmente intendevo il contrario dato che l'ho suggerito come soluzione con l'arduino al posto del televisore (non certo del telecomando). Non per altro programmiamo l'arduino, mica il telecomando.
Per farmi perdonare spendo qualche minuto a descrivere meglio il suggerimento di Madwriter che dice proprio quello che intendevo io.
Ad ogni ciclo della loop():
controlli se è stato premuto un tasto del telecomando. Se sì lo metti in un array e incrementi l'indice dell'array in cui metterai il prossimo tasto
controlli se è passato un certo tempo (millis()) dall'ultimo tasto premuto. Usa un flag per tenere traccia del fatto che è stato premuto almeno un tasto. Se il tempo è scaduto, leggi i tasti premuti nell'array, esegui l'azione ed azzeri l'array
Io dimensionerei l'array staticamente per il numero massimo di cifre che intendo gestire. Penso quindi dovrai anche tenere una variabile che ti dice quanti tasti ci sono realmente nell'array. Infatti il numero massimo potrebbe essere, per esempio, 3 ma io posso aver premuto 1, 11, 111.
adesso ci studio e lo provo, nel frattempo avevo sviluppato un po l'idea degli incrementi, guardate a cosa sono arrivato, testato e perfettamente funzionante. In pratica mi creo dei loop miei che ciclo fino alla fine degli inserimenti, che ne dite? cmq adesso mi metto a lavoro per sviluppare la vs idea.
#include <IRremote.h>
int RECV_PIN = 11;
IRrecv irrecv(RECV_PIN);
decode_results results;
int InputValue;
int i,x,SET,SETORA, SETMIN, SETSEC, SETGG, SETMM, SETYY;
int ValoreTOT;
int ora, minuti, secondi, giorno, mese, anno;
void setup()
{
Serial.begin(9600);
irrecv.enableIRIn(); // Start the receiver
i=0;
}
void loop(){
if (irrecv.decode(&results)) {
ValoreTOT=PdUno();
if(ValoreTOT==10){
Serial.println("dimmi cosa vuoi inserire");
Serial.println("1 - Regola l'ora");
Serial.println("2 - Regola Data");
SET=1;
ValoreTOT==99;
}
if(SET==1 && ValoreTOT==1){
SETORA = 1;
RegolaOrologio();
Serial.print("L'ora inserita e': ");
Serial.print(ora);
Serial.print(":");
Serial.print(minuti);
Serial.print(":");
Serial.println(secondi);
}
if(SET==1 && ValoreTOT==2){
SETGG = 1;
RegolaData();
Serial.print("La data inserita e': ");
Serial.print(giorno);
Serial.print("/");
Serial.print(mese);
Serial.print("/");
Serial.println(anno);
}
}
}
int translateIR(){
switch(results.value){
case 0xFF6897://tasto 0
return 0;
break;
case 0xFF30CF://tasto 1
return 1;
break;
case 0xFF18E7://tasto 2
return 2;
break;
case 0xFF7A85://tasto 3
return 3;
break;
case 0xFF10EF://tasto 4
return 4;
break;
case 0xFF38C7://tasto 5
return 5;
break;
case 0xFF5AA5://tasto 6
return 6;
break;
case 0xFF42BD://tasto 7
return 7;
break;
case 0xFF4AB5://tasto 8
return 8;
break;
case 0xFF52AD://tasto 9
return 9;
break;
case 0xFFA25D://tasto spgnimento
return 20;
break;
case 0xFF629D://tasto mode
return 10;
break;
case 0xFFE21D://tasto mute
return 11;
break;
case 0xFF22DD://tasto |<<
return 12;
break;
case 0xFF02FD://tasto >>|
return 13;
break;
case 0xFFC23D://tasto >|| (play pausa)
return 14;
break;
case 0xFFE01F:// tasto -
return 15;
break;
case 0xFFA857: // tasto +
return 16;
break;
case 0xFF906F: // tasto EQ
return 17;
break;
case 0xFFB04F: // tasto indietro <--
return 18;
break;
case 0xFF9867: // tasto +100
return 19;
break;
default:
return 99;
break;
}
}
int PdUno(){
long trsma;
int RecVal;
trsma=results.value;
if (trsma<4294967295){
RecVal = translateIR();
delay(250);
}
irrecv.resume(); // Receive the next value
return RecVal;
}
void RegolaOrologio(){
x=0;
long trsma;
Serial.println("Inserisci ore, minuti e secondi");
do{
if (irrecv.decode(&results)) {
ValoreTOT=PdUno();
if(ValoreTOT==16){
x+=1;
if(SETORA==1 && x>24){
x=1;
}
if(SETMIN==1 && x>60){
x=1;
}
if(SETSEC==1 && x>60){
x=1;
}
Serial.println(x);
}
if(ValoreTOT==15 && x>0){
x-=1;
Serial.println(x);
}
if(x==0 && ValoreTOT==15){
if(SETORA==1){
x=24;
}
if(SETMIN==1 || SETSEC ==1){
x=60;
}
Serial.println(x);
}
if(SETORA==1 && ValoreTOT==17){
ora=x;
SETORA=0;
SETMIN=1;
ValoreTOT=99;
x=0;
SET=0;
Serial.print("Hai settato l'ora a ");
Serial.println(ora);
Serial.println("Inserisci i minuti");
}
if(SETMIN==1 && ValoreTOT==17){
minuti=x;
SETMIN=0;
SETSEC=1;
ValoreTOT=99;
x=0;
SET=0;
Serial.print("Hai settato i minuti a ");
Serial.println(minuti);
Serial.println("Inserisci i secondi");
}
if(SETSEC==1 && ValoreTOT==17){
secondi=x;
SETSEC=0;
x=0;
SET=0;
Serial.print("Hai settato i secondi a ");
Serial.println(secondi);
Serial.println("Premi invio per confermare");
}
irrecv.resume(); // Receive the next value
}
}
while(ValoreTOT != 18);
}
void RegolaData(){
x=0;
long trsma;
Serial.println("Inserisci giorno, mese e anno");
do{
if (irrecv.decode(&results)) {
ValoreTOT=PdUno();
if(ValoreTOT==16){
x+=1;
if(SETGG==1 && x>31){
x=1;
}
if(SETMM==1 && x>12){
x=1;
}
if(SETYY==1 && x>99){
x=1;
}
Serial.println(x);
}
if(ValoreTOT==15 && x>0){
x-=1;
Serial.println(x);
}
if(x==0 && ValoreTOT==15){
if(SETGG==1){
x=31;
}
if(SETMM==1){
x=12;
}
if(SETYY==1){
x=99;
}
Serial.println(x);
}
if(SETGG==1 && ValoreTOT==17){
giorno=x;
SETGG=0;
SETMM=1;
ValoreTOT=99;
x=0;
SET=0;
Serial.print("Hai settato il giorno a ");
Serial.println(giorno);
Serial.println("Inserisci il mese");
}
if(SETMM==1 && ValoreTOT==17){
mese=x;
SETMM=0;
SETYY=1;
ValoreTOT=99;
x=0;
SET=0;
Serial.print("Hai settato il mese a ");
Serial.println(mese);
Serial.println("Inserisci l'anno");
}
if(SETYY==1 && ValoreTOT==17){
anno=2000+x;
SETYY=0;
x=0;
SET=0;
Serial.print("Hai settato l'anno a ");
Serial.println(anno);
Serial.println("Premi invio per confermare");
}
irrecv.resume(); // Receive the next value
}
}
while(ValoreTOT != 18);
}
Ho mescolato un po le cose, praticamente l'inserimento multiplo di valori con il telecomando funziona facendo un loop mio che esce al verificarsi di determinate condizioni.
Adesso vorrei qualche info sul cast, è possibile che per avere il risultato devo fare tutti i passaggi seguenti?