Non si può inserire niente nel tuo listato, va ripensato da zero/riscritto grosso modo come l'esempio che ho riportato.
La prima parte di lavoro consiste quindi nello stabilire (cioè elencare chiaramente su carta) quali sono le fasi di funzionamento in cui ti puoi trovare e gli eventi/condizioni a cui prestare attenzione in ciascuna di esse (cosa fare se), si tratta di disegnare una logica che non mi è chiara, io tra tutti quegli if nidificati (scritti tra l'altro in modo poco ortodosso) mi perdo.
In particolare, anche se eliminiamo un po' di nidificazione al loop rendendolo molto più flat:
void loop(void)
{
if (digitalRead(5) == HIGH) // procedura reset
{
contatore = 0;
lcd.begin(16, 2);
lcd.print(" RESET");
lcd.setCursor(0, 6);
lcd.print (" CONTAMETRI");
delay(1500); //QUI IL DELAY NON DA FASTIDIO ESSENDO IL PRIMO AVVIO
return;
}
if (digitalRead(2) && digitalRead(3)) { attivo = 1; return; } // sensori 2 e 3 attivati
if (digitalRead(2) && (attivo == 1)) { attivo = 2; } // attivato solo sensore 2
if (digitalRead(3) && (attivo == 1)) { attivo = 3; } // attivo solo sensore 3
if (digitalRead(2) || digitalRead(3)) { return; } // almeno un sensore attivato
if (attivo == 2) // attivo primo sensore
{
contatore--;
attivo = 0;
digitalWrite (led, HIGH);
digitalWrite (led2, LOW);
lcd.clear();
lcd.print("RISALITA ANCORA --");
lcd.setCursor(0, 6);
lcd.print (" Prof.Mt.");
lcd.print(contatore);
digitalWrite (led, LOW);
if (contatore == 7)
{
digitalWrite(led2, HIGH);
lcd.clear();
lcd.print(" ANCORA METRI 7");
lcd.setCursor(0, 6);
lcd.print (" STOP MOTORE");
delay(2000); //QUI DELAY() VA SOSTITUITO CON MILLIS()
}
}
if (attivo == 3) // oppure attivato il secondo sensore
{
contatore++;
attivo = 0;
digitalWrite (led2, HIGH);
digitalWrite (led, LOW);
lcd.clear();
lcd.print(" DISCESA ANCORA ++");
lcd.setCursor(0, 6);
lcd.print (" Prof.Mt.");
lcd.print(contatore);
digitalWrite (led2, LOW);
if (contatore == 10)
{
digitalWrite(led2, HIGH);
lcd.clear();
lcd.print("ANCORA METRI 10");
lcd.setCursor(0, 6);
lcd.print ("ASSIST. MOTORE");
delay(2000); //QUI DELAY() VA SOSTITUITO CON MILLIS()
}
}
}
e sorvolando sulla logica dei sensori che do per scontato che abbia senso (le quattro righe di if digitalRead dopo la procedura di reset), ancora non individuo bene "le fasi" temporizzate che ti servono.
Per far avanzare i contatori intanto li farei uscire dalle parti che si occupano di visualizzare:
if (attivo == 2) // attivo primo sensore
{
contatore--;
attivo = 0;
}
if (attivo == 3) // oppure attivato il secondo sensore
{
contatore++;
attivo = 0;
}
Dopo di che rimane la parte che deve visualizzare/temporizzare. Boh, avrà due distinte fasi, una in cui aggiorna i valori, e una in cui li mantiene. È così? Se è così allora si può usare una logica come la seguente:
se fase 1 e attivo==2
se contatore == 7
scrivi la roba da mantenere
memorizza tempo millis
fase = 2
altrimenti
scrivi quello che serve
altrimenti se fase 1 e attivo==3
se contatore == 10
scrivi la roba da mantenere
memorizza tempo millis
fase = 2
altrimenti
scrivi quello che serve
altrimenti se fase 2 e trascorsi 2 sec
fase = 1
Il delay è sostituito con il tempo in cui in fase 2 rimane falsa l'ultima condizione, e non c'è più niente che blocca