Far fare più cose ad arduino con un solo pulsante

Ciao a tutti,
sto usando con buoni risultati il codice sotto per far fare ad arduino azioni diverse tenendo premuto per tot secondi un pulsante. dico solo buoni risultati perchè spesso capita che anche conteggiando i lampeggi del led installato appositamente per calcolare quanti secondi sono passati dall'inizio della pressione del pulsante che il risultato che ottengo non rispecchia quello che dovrebbe essere...(per esempio faccio 15 lampeggi ma me ne conta meno) il problema si presenta solo sui tempi lunghi...

qualche consiglio o cmq qualche errore che sto commettendo di cui non mi sto rendendo conto!?

il codice completo è lo stesso che si trova in questo topic(se non per la parte di gestione della pioggia... ma questo centra poco con il problema)

codice completo nel post #7

 buttonPICCOLA = digitalRead(BUTTONPICCOLA);
  if (buttonPICCOLA == LOW && cambiopulsantePICCOLA == 0 ) {
    cambiopulsantePICCOLA = 1;
    conteggioseconditendapiccola = millis();
  }
  if (buttonPICCOLA == LOW && cambiopulsantePICCOLA == 1) {
    if (((millis() - conteggioseconditendapiccola) < 30000) && accensionespegnimentoLEDpiccola == false) {
      accensioneLEDpiccola = millis();
      digitalWrite (LED, HIGH );
      accensionespegnimentoLEDpiccola = true;
    }
    if ((millis() - accensioneLEDpiccola) > 1000) {
      if ((digitalRead(LED) == HIGH ) && accensionespegnimentoLEDpiccola == true) {
        digitalWrite (LED, LOW );
        accensionespegnimentoLEDpiccola = false;
      }
    }
  }
  if (buttonPICCOLA == HIGH && cambiopulsantePICCOLA == 1 && (((millis() - conteggioseconditendapiccola) >= 1000) && ((millis() - conteggioseconditendapiccola) <= 1999)) ) {
    stato_pulsantePICCOLA = 1;
    digitalWrite (LED, LOW );
    accensionespegnimentoLEDpiccola = false;
    cambiopulsantePICCOLA = 0;
  }
  if (buttonPICCOLA == HIGH && cambiopulsantePICCOLA == 1 && (((millis() - conteggioseconditendapiccola) >= 2000) && ((millis() - conteggioseconditendapiccola) <= 2999))) {
    stato_pulsantePICCOLA = 0;
    digitalWrite (LED, LOW );
    accensionespegnimentoLEDpiccola = false;
    cambiopulsantePICCOLA = 0;
  }
  if (buttonPICCOLA == HIGH && cambiopulsantePICCOLA == 1 && (((millis() - conteggioseconditendapiccola) >= 3000) && ((millis() - conteggioseconditendapiccola) <= 4999))) {
    count_chiusureSX = 0;
    count_chiusureCENTRO = 0;
    count_chiusurePICCOLA = 0;
    verificariavvioWD = true;
    count_problemibme = 0;
    lcd.setCursor(13, 1); campovuoto();
    lcd.setCursor(12, 1); campovuoto();
    digitalWrite (LED, LOW );
    accensionespegnimentoLEDpiccola = false;
    cambiopulsantePICCOLA = 0;

  }
  if (buttonPICCOLA == HIGH && cambiopulsantePICCOLA == 1 && (((millis() - conteggioseconditendapiccola) >= 5000) && ((millis() - conteggioseconditendapiccola) <= 7999))) {
    ricordavalorestatopioggia = 0;
    attiva_ricordavalorestatopioggia = false;
    digitalWrite (LED, LOW );
    accensionespegnimentoLEDpiccola = false;
    cambiopulsantePICCOLA = 0;
  }

  if (buttonPICCOLA == HIGH && cambiopulsantePICCOLA == 1 && (((millis() - conteggioseconditendapiccola) >= 8000) && ((millis() - conteggioseconditendapiccola) <= 10999))) {
    CHIUDITENDAGRANDESX = true;
    CHIUDITENDAGRANDECENTRO = true;
    digitalWrite (LED, LOW );
    accensionespegnimentoLEDpiccola = false;
    cambiopulsantePICCOLA = 0;
  }
  if (buttonPICCOLA == HIGH && cambiopulsantePICCOLA == 1 && (((millis() - conteggioseconditendapiccola) >= 11000) && ((millis() - conteggioseconditendapiccola) <= 13999))) {
    CHIUDITENDAGRANDEPICCOLA = true;
    digitalWrite (LED, LOW );
    accensionespegnimentoLEDpiccola = false;
    cambiopulsantePICCOLA = 0;
  }
  if (buttonPICCOLA == HIGH && cambiopulsantePICCOLA == 1 && (((millis() - conteggioseconditendapiccola) >= 14000) && ((millis() - conteggioseconditendapiccola) <= 16999))) {
    stapiovendo = true;
    Rotations = 50;
    digitalWrite (LED, LOW );
    accensionespegnimentoLEDpiccola = false;
    cambiopulsantePICCOLA = 0;
  }
  if (buttonPICCOLA == HIGH && cambiopulsantePICCOLA == 1 && (((millis() - conteggioseconditendapiccola) >= 17000) && ((millis() - conteggioseconditendapiccola) <= 21999))) {
    wdt_disable();
    connessioneinternet();
    digitalWrite (LED, LOW );
    accensionespegnimentoLEDpiccola = false;
    cambiopulsantePICCOLA = 0;
    wdt_enable(WDTO_8S);
  }
  if (buttonPICCOLA == HIGH && cambiopulsantePICCOLA == 1 && ((millis() - conteggioseconditendapiccola) >= 22000)) {
    avvio_ventola_per_check = true;
    digitalWrite (LED, LOW );
    accensionespegnimentoLEDpiccola = false;
    cambiopulsantePICCOLA = 0;
  }

Mi sembra più semplice, veloce (e pratico da usare) contare i click ripetuti, e dopo un secondo senza pressioni avviare la funzione voluta a seconda del numero di click effettuati. La logica è tutta qui, quando 'conferma' diventa 1 'var' contiene il numero di click effettuati:

in = digitalRead(ecc ecc...
onPress = (LIVELLO_PREMUTO == in   &&   inPrec != in)
inPrec = in
conferma = 0
SE non inconteggio  E  onPress:
  var = 1
  inconteggio = 1
  t = millis()
ALTRIMENTI SE inconteggio  E  onPress:
  var++
  t = millis()
ALTRIMENTI SE inconteggio  E  timeout:
  conferma = 1
  inconteggio = 0

Claudio_FF:
Mi sembra più semplice, veloce (e pratico da usare) contare i click ripetuti, e dopo un secondo senza pressioni avviare la funzione voluta a seconda del numero di click effettuati.

ci avevo pensato anche io, ma non il dilspaly vicino, quindi non posso vedere se la pressione dei click del bottone siano poi quelli corretti o no... per quello ho messo il led..

ripensandoci un pò sopra, potrei cmq lasciare il led come segnalatore di avvenuto incremento variabile e ragionare come consigliato da Claudio... quello che però non capisco è dove sbaglio con il codice che sto usando ora... nessuno ?