Desidero scegliere se accendere il led in modo manuale tramite un pulsante o
se accendere il led tramite un timer (automatico)
Ovviamente se scelgo la funzione manuale, la funzione auto deve essere esclusa e disabilitata
e se scelgo auto la funzione manuale deve esser esclusa e disabilitata
Ma per selezionare il modo usi un pulsante o un selettore?
Nel caso del pulsante, la situazione si complica.
Se usi un pulsante, che è monostabile, l'unico modo che mi viene in mente per rendere i due modi, manuale/automatico, mutualmente esclusivi è di commutarli a seguito della premuta/ripremuta del pulsante.
Quinsi si intercetta il fronte di salita della premuta e si cambia il modo per mezzo di un'operazione di inversione logica.
Qua sotto trovi uno pseudocodice che fa quello che richiedi, non ti rimane che adattarlo al "linguaggio di Arduino" ossia tradurlo in C.
Nello pseudocodice ipotizzo che il pulsante è normalmente aperto, se così non fosse bisogna invertire la logica.
Un altro svantaggio è che alla riaccensione della scheda perdi il modo che avevi scelto, a meno che non lo memorizzi nella EEPROM di Arduino, quindi la cosa più logica è settare il manuale come modo predefinito all'accensione. Inoltre la funzione antirimbalzo (debounce in inglese) diventa fondamentale, visto che un ingresso oscillante provocherebbe centinaia di cambi di modo a casaccio :D.
Se usassi un interruttore, che è bistabile, la gestione sarebbe molto più semplice. L'intercettazione del fronte di salita sarebbe superflua, la posizione dell'interruttore determinerebbe direttamente i modi manuale/automatico.
#define MAN 0
#define AUTO 1
bool pulsanteSelezioneModo = LOW;
bool fronteSalita = LOW;
bool statoPrec = LOW
bool pulsanteLED = LOW;
bool modo = MAN;
void setup() {
...
}
void loop() {
pulsanteSelezioneModo = leggi(indirizzo_pin_pulsanteSelezioneModo)
pulsanteLED = leggi(indirizzo_pin_pulsanteLED)
fronteSalita = pulsanteSelezioneModo AND NOT statoPrec
statoPrec = pulsanteSelezioneModo;
IF fronteSalita THEN modo = !modo
IF modo vale MAN THEN scrivi(indirizzo_pin_LED) = pulsanteLED
ELSE IF modo vale AUTO THEN accensione temporizzata del LED
}