Controllo antibounce

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;

}

Dovresti togliere i #define e i casting e usare const unsigned long.
Sarà il compilatore ad ottimizzare il codice.

da così

#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

a così

const unsigned long debounce = 10; // in ms: periodo di debounce (tra una pressione e un'altra)
const unsigned long  tolleranza = 2000; //(500)in ms: periodo di tolleranza di pressione azione/non azione
const unsigned long  holdTime = 5000; // in ms: tempo che bisogna aspettare per andare all'evento press+hold

La funzione creata è molto complessa. Dovresti dividerla per prima cosa in due casi: pressione lunga e pressione corta e poi passare il valore del pulsante premuto che regola l'azione.

Forse sbaglio (non sono un softwarista), ma se esegui due if consecutivi in cui controlli se il ritardo e' maggiore di due tempi diversi, mentre il pulsante e' premuto, se il tempo e' corto esegue solo le istruzioni dell'if con il tempo corto, ma se e' piu lungo, nell'if che ha il tempo minore (short press) il ritardo finira' per essere comunque sempre maggiore della soglia, tenendo il pulsante premuto ... quindi ad ogni controllo, avrai la condizione eseguita sia che la pressione sia lunga, sia che sia corta ... dovresti condizionare il controllo al rilascio del pulsante, controllando solo dopo che il pulsante e' stato rilasciato, se il tempo per cui era rimasto premuto era lungo o corto ...

... o sbaglio ? ...

Quegli if sono annidati e articolati, è facile perdere il filo, poi la logica salta per un nonnulla.