Salve a tutti,
ho implementato un antibounce per 5 switch ma molte volte, quando faccio il long press per selezionare una voce del menu, scorre invece di sezionare (prendendo quindi uno short press). Quindi penso di aver sbagliato qualche cosa nel codice, potete aiutarmi?
Premetto che distinguo i pulsanti per voltaggio, e quindi per valore analogico.
Incollerò solo le parti di codice che interessano la questione.
// Costanti globali per i pulsanti
#define buttonPin 0 // input analogico
#define debounce 10 // in ms: periodo di debounce (tra una pressione e un'altra)
#define tolleranza 2000 //(500)in ms: periodo di tolleranza di pressione azione/non azione
#define holdTime 5000 // in ms: tempo che bisogna aspettare per andare all'evento press+hold
// variabili pulsanti
int buttonVal = 0; // valore letto dal pulsante
int buttonLast = 0; // valore dello stato dell'ultimo pulsante premuto (se è zero vuol dire che è passato del tempo da una pressione all'altra)
unsigned long btnDnTime; // tempo in cui il pulsante è premuto
unsigned long btnUpTime; // tempo in cui il pulsante è rilasciato
boolean ignoreUp = false; // whether to ignore the button release because the click+hold was triggered
int last_Pressed = 6; //ultimo pulsante premuto: serve per riconoscere quando si cambiano i pulsanti in modo da saltare da una parte del menu all'INIZIO di un'altra
int current_Pressed = 6;
int i; // indice del menù
void loop()
{
Serial.write(0x13); // Accende la retroilluminazione del display seriale
Serial.write(0x04); // Nascondi cursore
clockDisplay();
manualClock();
buttonVal = analogRead(buttonPin); // Leggi il valore del pulsante
switchPulsanti();
scorriCode();
webServer();
}
//Funzione per il riconoscimento dei pulsanti premuti attraverso il loro valore analogico
void switchPulsanti(){
if (buttonVal == 0 && buttonLast != 0 && (millis() - btnUpTime) > long(debounce))
{
btnDnTime = millis();
}
// Pulsante P1 (SHORT): scorrimento
if (buttonVal > 950 && buttonLast == 0 && (millis() - btnDnTime) > long(debounce) && (millis() - btnDnTime) < tolleranza)
{
current_Pressed=0; // setto il pulsante che premo
if (last_Pressed != current_Pressed) i=0; // controllo se il pulsante premuto prima di quello attuale: nel caso resetto l'indice del menu in modo da riniziare dalla prima voce quando cambio menu presa
if (ignoreUp == false) scorri(0); //SCORRIMENTO
else ignoreUp = false;
btnUpTime = millis();
last_Pressed=0; // setto il pulsante che ho appena premuto per il prossimo confronto
}
// Pulsante P1 (LONG): selezione
if (buttonVal > 950 && last_Pressed==0 && (millis() - btnDnTime) > long(holdTime) && current_Pressed==last_Pressed)
{
seleziona(0); //SELEZIONE
scorrimento_orizzontale(0); //riconosco che ho premuto il pulsante 0 e vado a scorrere le voci del menu
ignoreUp = true;
btnDnTime = millis();
}
// Pulsante P2 (SHORT): scorrimento
if (buttonVal > 670 && buttonVal < 820 && buttonLast == 0 && (millis() - btnDnTime) > long(debounce) && (millis() - btnDnTime) < tolleranza)
{
current_Pressed=1;
if (last_Pressed != current_Pressed) i=0;
if (ignoreUp == false) scorri(1);
else ignoreUp = false;
btnUpTime = millis();
last_Pressed=1;
}
// Pulsante P2 (LONG): selezione
if (buttonVal > 670 && buttonVal < 820 && (millis() - btnDnTime) > long(holdTime) && current_Pressed==last_Pressed)
{
seleziona(1);
scorrimento_orizzontale(1); //riconosco che ho premuto il pulsante e vado a scorrere le voci del menu
ignoreUp = true;
btnDnTime = millis();
}
// Pulsante P3 (SHORT): scorrimento
if (buttonVal > 430 && buttonVal < 600 && buttonLast == 0 && (millis() - btnDnTime) > long(debounce) && (millis() - btnDnTime) < tolleranza)
{
current_Pressed=2;
if (last_Pressed != current_Pressed) i=0;
if (ignoreUp == false) scorri(2);
else ignoreUp = false;
btnUpTime = millis();
last_Pressed=2;
}
// Pulsante P3 (LONG): selezione
if (buttonVal > 430 && buttonVal < 600 && (millis() - btnDnTime) > long(holdTime) && current_Pressed==last_Pressed)
{
seleziona(2);
scorrimento_orizzontale(2); //riconosco che ho premuto il pulsante e vado a scorrere le voci del menu
ignoreUp = true;
btnDnTime = millis();
}
// Pulsante P4 (SHORT): scorrimento
if (buttonVal > 330 && buttonVal < 400 && buttonLast == 0 && (millis() - btnDnTime) > long(debounce) && (millis() - btnDnTime) < tolleranza)
{
current_Pressed=3;
if (last_Pressed != current_Pressed) i=0;
if (ignoreUp == false) scorri(3);
else ignoreUp = false;
btnUpTime = millis();
last_Pressed=3;
}
// Pulsante P4 (LONG): selezione
if (buttonVal > 330 && buttonVal < 400 && (millis() - btnDnTime) > long(holdTime) && current_Pressed==last_Pressed)
{
seleziona(3);
scorrimento_orizzontale(3); //riconosco che ho premuto il pulsante e vado a scorrere le voci del menu
ignoreUp = true;
btnDnTime = millis();
}
// Pulsante P5 (SHORT): setta l'ora
if (buttonVal > 230 && buttonVal < 320 && buttonLast == 0 && (millis() - btnDnTime) > long(debounce) && (millis() - btnDnTime) < tolleranza)
{
setManualClock();
}
// Pulsante P5 (LONG): ritorna
if (buttonVal > 230 && buttonVal < 320 && (millis() - btnDnTime) > long(holdTime) && current_Pressed==last_Pressed)
{
ignoreUp = true;
btnDnTime = millis();
if (inModifica==true){
step++;
setManualClock();
}
else setManualClock();
}
buttonLast = buttonVal;
}