ricki158:
... se tengo premuto un tasto i valori non mi schizzano velocemente ...
Mi auto-quoto da un'altro post (:D)
Etemenanki:
...
SE pulsante premuto E flag a zero, metti variabile = millis, e metti flag ad 1
SE pulsante premuto, E flag ad uno, E tempo trascorso (da controllare con millis), esegui comandi e metti flag a due
SE pulsante rilasciato E flag diversa da zero, metti flag a zero
...
In pratica, usa una flag ed una unsigned long, che gestisci con tre if consecutivi ...
il primo if (ma solo se il pulsante prima non era premuto) controlla se hai premuto il tasto, se si, imposta la variabile unsigned long uguale a millis (per poterla poi controllare con il secondo if) e mette la flag da 0 ad 1 ... da qui in poi non verra' piu eseguito finche' il pulsante non verra' rilasciato e la flag tornera' a 0 ...
il secondo if (che agisce solo dopo che il primo ha impostato variabile a millis e flag ad 1), controlla che il pulsante sia premuto, che la flag sia ancora ad 1 (pulsante ancora premuto, non e' stato rilasciato nel frattempo), e che il tempo di attesa (quello minimo in cui devi tenere il pulsante premuto) sia trascorso, se no non fa nulla, se si, esegue i comandi relativi (nel momento in cui il tempo scade, non quando rilasci il pulsante), e mette la flag a 2 (in modo da non rieseguire di nuovo il tutto al prossimo ciclo di loop) ...
Il terzo if si limita a resettare la flag, che sia o meno trascorso il tempo minimo non importa ...
E' perfino possibile inserire un quarto if che esegua dei comandi se il tempo minimo di pressione NON sia stato raggiunto (differenziare fra pressione lunga e pressione breve), ma in questo caso i relativi comandi (quelli del tempo breve) verranno eseguiti per forza dopo il rilascio del tasto ... pero' la cosa non ha molta importanza, dato che se uno imposta, tipo, un tempo minimo di 1 secondo, e le pressioni brevi sono piu corte, il ritardo sarebbe al massimo dei pochi decimi di secondo in cui il tasto rimane premuto per il tempo breve ...
Una cosa del genere, nel tuo caso, molto a spanne (pseudocodice, da correggere ovviamente)
...
if ((varKeyboard<127)&&(miaflag==0))
{
variabileul=millis();
miaflag=1;
}
if ((varKeyboard<127)&&(miaflag==1)&&(millis()-variabileul>1000)) \\un secondo, come esempio
{
(... codice da eseguire una volta, se il tasto e' rimasto premuto piu di un secondo ...)
miaflag=2;
}
if ((varKeyboard=0)&&(miaflag==1) \\tasto rilasciato prima che passasse un secondo
{
(... codice da eseguire una volta, se il tasto e' rimasto premuto meno di un secondo ...)
miaflag=2;
}
if ((varKeyboard=0)&&(miaflag==2) \\tasto rilasciato ed operazioni gia eseguite
{
(... nulla ... oppure codice da eseguire sempre al rilascio del tasto, se necessario ...)
miaflag=0;
}
In questo caso, il terzo if viene eseguito solo nel momento in cui rilasci il pulsante, solo se il secondo if non ha gia messo la flag a 2 (quindi se il secondo di tempo non era ancora trascorso, mentre invece se trascorre, il secondo if esegue i suoi comandi alla scadenza del tempo ed imposta la flag a 2 lui, impedendo l'esecuzione del terzo) ... mentre il quarto resetta la flag al rilascio solo se uno dei precedenti ha messo la flag a 2, segno che o uno o l'altro hanno eseguito i rispettivi comandi ... (sarebbe perfino possibile inserire un'ulteriore if che restituisca un'errore se il pulsante viene rilasciato ma nessuno dei due precedenti if ha messo la flag a 2, segno che non e' stato eseguito qualcosa che invece doveva essere eseguito, ma qui andiamo nelle cose inutili per il tuo scopo, mi sa
EDIT: nel quarto if, puoi mettere anche li un codice, ma solo se serve, che verra' eseguito in ogni caso al rilascio del tasto ... potrebbe essere, che so, una tone per fare il bip, o qualsiasi cosa dovesse essere necessaria da fare "sempre" al rilascio del tasto (sempre, nel senso sia che il tasto sia rimasto premuto poco o molto ... e' facoltativo, semplicemente una possibilita' in piu ;))
Come dicevo di la, a logica sembrerebbe perfino che possa funzionare ... resta da provarlo