keypad.h gestire una pressione temporizzata

Salve, mi sto cimentando con la libreria keypad. L'hardware funziona perfettamente con il file di prova che stampa in seriale.
Ora mi trovo a dovere creare un loop, anche bloccante, che mi permetta quando premo il tasto # per piu di 10 secondi di cambiare una variabile booleana, in modo da cambiare pagina in un menu. Non capisco molto bene come potrei usare il getKeyState(). Qualche idea su una possibile soluzione ? grazie :slight_smile:

non sarebbe preferibile operare all'esterno della lib ed usare la millis per iniziare un conteggio temporale ogni volta che si preme il carattere #? se superi i 10 secondi richiami una routine, se non li superi scrivi # e basta.

Ciao, non ho mai usato quella libreria, ma dandogli un'occhiata veloce (Arduino Playground - HomePage) vedo che ha una funzione chiamata "setHoldTime(unsigned int time)" in cui puoi programmare dopo quanto tempo, un tasto che venga mantenuto permuto, venga considerato in stato di HOLD ... stato di HOLD che la "KeyState getState()" ti ritorna se un tasto verifica la condizione ...

Non ti va bene ?

Guglielmo

mi spiego meglio:
l'apparecchietto che sto facendo ha un display e gestisce poi tramite pid delle temperature.
Ha due modalità di funzionamento, con due schermate principali diverse. Io voglio che in stato di riposo / standby si possibile cambiare tra i due modi tramite la pressione di un tasto del keypad per 10 secondi.
Il sethold time è un filtro, per elimiare spurie o pressioni troppo corte.

Io voglio sia possibile cambiare tra i due modi tramite la pressione di un tasto del keypad per 10 secondi.
per elimiare spurie o pressioni troppo corte.

quello che ti ha detto Menniti fa proprio quello

mordor:
...
Il sethold time è un filtro, per elimiare spurie o pressioni troppo corte.

Mmm ... non credo, per quello c'è una apposita funzione "setDebounceTime(unsigned int time)" che implementa appunto la tecnica di debounce per eliminare rimbalzi e quant'altro ... la "setHoldTime(unsigned int time)" fa invece esattamente quello che cerchi tu : "Set the amount of milliseconds the user will have to hold a button until the HOLD state is triggered." ... poi ... fai come vuoi :wink:

Guglielmo

appunto... è un filtro... tu imposti dopo quandi msec un pulsante diventa in stato HOLD.
tu devi usare il getKeyState() per poi elaborare questo dato. Il problema è che non capivo come....

Ti ripeto, non ho usato quella libreria e non ho a disposizione una tastiera per fare le prove, però ... leggendo il codice sorgente della libreria, il tipo KeyState che ritorna la getState() altro non è che un :

typedef enum{ IDLE, PRESSED, HOLD, RELEASED } KeyState;

e la funzione getState() altro non fa che :

KeyState Keypad::getState() {
	return key[0].kstate;
}

... quindi, a naso, direi che quando la richiami ti da lo stato del tasto premuto. Per sapere quale tasto, sempre leggendo il codice, ho idea che devi usare la getKey() :wink:

Nel tuo codice verifichi che un tasto sia premuto ? Se subito dopo chiami la getState(), cosa ti ritorna ?

Guglielmo