[RISOLTO] Usare un telecomando IR come se fosse una tastiera numerica

Salve a tutti,
ho visitato molti post cercando un consiglio per risolvere un piccolo problema ma sembra che nessuno lo abbia trattato.

Volevo usare la libreria irremote per creare una tastiera numerica+funzioni in modo di sostituire la classica tastiera tipo telefono.
Con le info trovate si riesce facilmente ad abbinare un valore numerico ad un tasto premuto.
Se devo invece editare una variabile composta da un numero di 2 o più cifre (es impostare temperatura termostato) non riesco a trovare il modo corretto di fare.
Ho cercato vari modi senza successo, vero è che non ho grandi conoscenze di programmazione....
Avete qualche suggerimento o qualche link dove la cosa è già stata trattata?

Grazie

Posta il codice che hai provato, magari non è del tutto sbagliato e possiamo aiutarti!
Comunque teoricamente si tratta di fare un ciclo for (ad esempio per 5 numeri) che cicla ogni volta che hai premuto un tasto. Il numero scelto lo concateni ad una stringa!
Poi se vuoi perfezionare ci dovresti mettere pure un timeout in modo da non attendere più di un tot per l'input..

non so se il codice è tutto sbagliato...ma sicuramente non è giusto, comunque eccolo:

#include <IRremote.h>
#define Tasto_0 16726215
#define Tasto_1 16769055
#define Tasto_2 16754775
#define Tasto_3 16748655
#define Tasto_4 16738455
#define Tasto_5 16750695
#define Tasto_6 16756815
#define Tasto_7 16724175
#define Tasto_8 16718055
#define Tasto_9 16743045
#define Tasto_11 16732845 //tasto che richiama la funzione

int RECV_PIN = 14;

IRrecv irrecv(RECV_PIN);
decode_results results;

int count=0;
int Decina = 0;
int Unita = 0;
int Totale = 0;

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

void loop()
{
if (irrecv.decode(&results))
{
if (results.value = Tasto_11)
{
LeggiComando ();
Serial.println("Numero Digitato");
Serial.println(Totale);
delay (500);
}
}
}

int LeggiComando ()
{
irrecv.resume();
if (irrecv.decode(&results))
{
if ((results.value == Tasto_0) && (count == 0)) {count = 1; Decina = 0;}
else if ((results.value == Tasto_1) && (count == 0)) {count = 1; Decina = 1;}
else if ((results.value == Tasto_2) && (count == 0)) {count = 1; Decina = 2;}
else if ((results.value == Tasto_3) && (count == 0)) {count = 1; Decina = 3;}
else if ((results.value == Tasto_4) && (count == 0)) {count = 1; Decina = 4;}
else if ((results.value == Tasto_5) && (count == 0)) {count = 1; Decina = 5;}
else if ((results.value == Tasto_6) && (count == 0)) {count = 1; Decina = 6;}
else if ((results.value == Tasto_7) && (count == 0)) {count = 1; Decina = 7;}
else if ((results.value == Tasto_8) && (count == 0)) {count = 1; Decina = 8;}
else if ((results.value == Tasto_9) && (count == 0)) {count = 1; Decina = 9;}
}
Decina = Decina * 10 ;
irrecv.resume();

if (irrecv.decode(&results))
{
if ((results.value == Tasto_0) && (count == 1)) { Unita = 0;}
else if ((results.value == Tasto_1) && (count == 1)) { Unita = 1;}
else if ((results.value == Tasto_2) && (count == 1)) { Unita = 2;}
else if ((results.value == Tasto_3) && (count == 1)) { Unita = 3;}
else if ((results.value == Tasto_4) && (count == 1)) { Unita = 4;}
else if ((results.value == Tasto_5) && (count == 1)) { Unita = 5;}
else if ((results.value == Tasto_6) && (count == 1)) { Unita = 6;}
else if ((results.value == Tasto_7) && (count == 1)) { Unita = 7;}
else if ((results.value == Tasto_8) && (count == 1)) { Unita = 8;}
else if ((results.value == Tasto_9) && (count == 1)) { Unita = 9;}
}
count = 0 ;
Totale = Decina + Unita;
return Totale;
}

Magari mi sbaglio ma non è che il codice della.funzione leggiComando esegue a dritto e t non fa in tempo a leggerti i comandi? Non ho esperienza con la libreria IR, pero un possibile problema potrebbe essere questo.

E' anche la mia sensazione, o meglio, il programma secondo me si dovrebbe comportare in questo modo:

una volta che entra in LeggiComando, Arduino rimane in attesa che venga premuto un primo tasto, lo memorizza , poi aspetta per il secondo input e quindi crea il valore complessivo della variabile.
Purtroppo non so come fare per creare questa attesa di input e credo che il problema più grosso sia proprio lì.

Grazie ancora ragazzi, capisco che per degli esperti sarà una cosa ovvia, ma per me è avvilente non riuscirci.

Potresti provare con un while a vuoto finchè non ricevi, ti faccio un esempio

while( irRX == false ){}
// codice che gestisce le letture

Dove irRX è il pin del ricevitore ir.

metodo tipo

//dichiarazione variabili
unsigned long interval_a = 10000; //timeout di 10 sec


unsigned long previousMillis_a = 0; //azzeri con questo il timer quando viene rilevata la pressione di un tasto valido



           //qui parte il conteggio da quando è stato premuto un tasto
           unsigned long currentMillis_a = millis();
           if(currentMillis_a - previousMillis_a > interval_a) 
           { 
        
              //qui scade il timeout
              //azzeri la sequenza digitata e incompleta
  
           }

Potresti provare con un while a vuoto finchè non ricevi, ti faccio un esempio
Code:
while( irRX == false ){}
// codice che gestisce le letture
Dove irRX è il pin del ricevitore ir.

Ho provato, ma qualcosa non funziona. Se metto un ciclo while come mi hai indicato, la lettura dell' IR non si ferma. L'ho verificato semplificando tutto a questo code "minimal"

#include <IRremote.h>

#define Tasto_11 16732845

int RECV_PIN = 14;

IRrecv irrecv(RECV_PIN);
decode_results results;

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

void loop()
{
Serial.println("sono in loop");
delay (500);
while( RECV_PIN == false ){delay (50);Serial.println("in attesa del tasto");}
if (irrecv.decode(&results))
{
if (results.value == Tasto_11)
{
Serial.println("Tasto_11 premuto");
delay (500);
irrecv.resume();
}
}
}

se non ho sbagliato qualcosa dovrebbe stamparmi "in attesa di tasto" finchè non lo premo, invece non succede mai

E ti stampa invece "sono in loop"?
Hai provato ad invertire la condizione nel while con RECV_PIN == TRUE?

"sono in loop" lo stampa sempre...quando premo il tasto mi dice "tasto 11 premuto", ma tra le due cose non si mette mai in pausa e non mi dice "in attesa del tasto"

anche con la condizione "true" non cambia nulla

Grazie a chi mi ha aiutato..e anche ad un buon libro sull'argomento... HO TROVATO LA SOLUZIONE!!! :grin:

Allego il code:

#include <IRremote.h>

#define Tasto_0 16726215
#define Tasto_1 16769055
#define Tasto_2 16754775
#define Tasto_3 16748655
#define Tasto_4 16738455
#define Tasto_5 16750695
#define Tasto_6 16756815
#define Tasto_7 16724175
#define Tasto_8 16718055
#define Tasto_9 16743045

#define Tasto_11 16732845 // tasto funzione

int RECV_PIN = 14;
int Decina;
int Unita;
int Totale;

IRrecv irrecv(RECV_PIN);
decode_results results;

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

void loop()
{
Serial.println("sono in loop");
delay (500);
if (irrecv.decode(&results) == true)
{
if (results.value == Tasto_11)
{
Serial.println("Passo a LeggiComando");
LeggiComando ();
Serial.println("Totale ");
Serial.println(Totale);
}
irrecv.resume();
}
}

int LeggiComando ()
{
irrecv.resume();
while (irrecv.decode(&results) != true) {} //rimane in "pausa" sino a che non viene premuto un tasto
if (irrecv.decode(&results) == true)
{
if (results.value == Tasto_0) Decina = 0;
if (results.value == Tasto_1) Decina = 10;
if (results.value == Tasto_2) Decina = 20;
if (results.value == Tasto_3) Decina = 30;
if (results.value == Tasto_4) Decina = 40;
if (results.value == Tasto_5) Decina = 50;
if (results.value == Tasto_6) Decina = 60;
if (results.value == Tasto_7) Decina = 70;
if (results.value == Tasto_8) Decina = 80;
if (results.value == Tasto_9) Decina = 90;
}
delay (150);
irrecv.resume();
while (irrecv.decode(&results) != true) {}
if (irrecv.decode(&results) == true)
{
if (results.value == Tasto_0) Unita = 0;
if (results.value == Tasto_1) Unita = 1;
if (results.value == Tasto_2) Unita = 2;
if (results.value == Tasto_3) Unita = 3;
if (results.value == Tasto_4) Unita = 4;
if (results.value == Tasto_5) Unita = 5;
if (results.value == Tasto_6) Unita = 6;
if (results.value == Tasto_7) Unita = 7;
if (results.value == Tasto_8) Unita = 8;
if (results.value == Tasto_9) Unita = 9;
}

Totale = Decina + Unita;
return Totale;
}

in effetti IngHooch hai avuto la giusta intuizione, ed io pian-pianino ho trovato la giusta sintassi.

GRAZIE ANCORA A TUTTI!!!