Interrompere accensione LED tramite comando da seriale

Ciao a tutti. Ho scritto un piccolo sketch che mi permette di accendere un led per 9 secondi all'invio di '0' da seriale, il tutto senza delay ma con la funzione millis().

const int buttonPin = 4;     // the number of the pushbutton pin
const int ledPin =  13;      // the number of the LED pin
unsigned long off_time;
boolean ledState=false;

int buttonState = 0;         // variable for reading the pushbutton status


void setup() {
 // initialize the LED pin as an output:
 pinMode(ledPin, OUTPUT);      
 // initialize the pushbutton pin as an input:
 pinMode(buttonPin, INPUT);   
 digitalWrite(ledPin, LOW); 
 Serial.begin(9600);

}

void loop(){
if ((ledState) && (millis()>=off_time)) /* is it on and is it later or equal to off_time */
{
   digitalWrite(ledPin,LOW);
   ledState = false;
}
else if (!ledState) /* is it off? */
{
   buttonState = Serial.read();
   if(buttonState == '0')
   {
       digitalWrite(ledPin, HIGH);
       ledState = true;
       off_time = millis() + 9000;
       
       }
       else digitalWrite(ledPin, LOW);

}
}

Il programma funziona perfettamente, però ho intenzione di implementare la possibilità di spegnere improvvisamente il led se ad esempio mando il carattere '1'. Ho provato diverse vie, ma nessuna mi ha dato dei risultati soddisfacenti. Da quanto ho capito, la seriale non legge nulla fino a quando non termina i 9 secondi di accensione del led.
Ho provato a inserire una semplice funzione if/else leggendo lo stato logico di un pin di ingresso e solo in questo caso riesco effettivamente a bloccare il led acceso. Come devo comportarmi per poter ottenere questo risultato ma da seriale? Grazie

la seriale non legge nulla fino a quando non termina i 9 secondi di accensione del led

non va perchè hai messo un else if vincolato a quello che legge il tempo trascorso

Prima di tutto, essendo il tuo primo post, ti consiglio di presentarti QUI (spiegando quali conoscenze hai di elettronica e di programmazione) e di leggere con attenzione il REGOLAMENTO ...

... poi, come ti ha detto Pablos, hai sbagliato la logica del codice condizionando la lettura della seriale.

Guglielmo

P.S: : Se poi metti in ordine le indentature con l'apposito comando dell'IDE ... il codice sarà ancora più leggibile :wink:

Scusate il ritardo ma gli impegni universitari mi hanno tenuto lontano dal pc. Mi sono appena presentato all'interno del forum. Per quanto riguarda il problema sul led e l'invio del carattere da seriale, l'ho risolto proprio come da voi consigliato. Ho semplicemente tolto buttonState = Serial.read() dal ciclo else if e l'ho posizionato all'interno del void loop() ( quindi risulta essere non più vincolato ).
Grazie mille.