Ziostep:
guarda nel mio primo post ho caricato già lo sketch riferito al gonfiare/sgonfiare considerando la posizione dello switch. E' semplice come codice ma son partito da li.
Manca la lettura dello switch.
Non ho capito bene cosa intendi per suddividere per stati tutto il processo. Penso tu ti stia riferendo ad:
1 stato: riposo
Verificare la posizione dello switch
2 stato: Se lo switch si trova in alto
Allora attiva la pompa e gonfia
Ti riferisci ad un suddivisione degli eventi di questo tipo?
Quasi, il tuo codice è stateless e reattivo, quello che fa dipende direttamente e solo dall'ingresso, e non ha memoria di quello che eventualmente è stato fatto prima (le situazioni attraversate).
Per me gli stati che hai elencato nella descrizione sono:
- IDLE (attesa comando)
- INFLATE (gonfiaggio, attesa pressione alta)
- PAUSE (pausa tot secondi, non so se serve fare anche un REFILL se la pressione scende)
- DEFLATE (sgonfiaggio, attesa pressione bassa)
ed eventualmente un ulteriore stato di attesa WAIT_NO_COMMAND per aspettare che lo switch sia riportato in posizione disattiva e non ripartire subito con un nuovo gonfiaggio.
Si possono definire delle etichette di comodo:
#define IDLE 0
#define INFLATE 1
#define PAUSE 2
#define DEFLATE 3
#define WAIT_NO_COMMAND 4
Una variabile globale per memorizzare lo stato, che parte da IDLE
byte state = IDLE;
E nel loop una struttura decisionale che elabora solo lo stato attivo in quel momento. È come avere diversi programmi (i casi) di cui uno solo alla volta viene eseguito, quello corrispondente alla situazione attuale del sistema indicata dalla variabile 'state':
switch(state)
{
case IDLE:
break;
case INFLATE:
break;
case PAUSE:
break;
case DEFLATE:
break;
case WAIT_NO_COMMAND:
break;
}
Quando siamo in IDLE l'unica cosa che interessa è sentire il comando di avvio:
case IDLE:
if(...lettura pin switch... == ...livello attivo...) {
...avvia gonfiaggio...
state = INFLATE; // <--- nuovo stato attivo
}
break;
eccetera...