Uso de millis() y Serial.

Muy buenas todos. Soy un poco nuevo en Arduino. Actualmente estoy trabajando en un proyecto con unas electroválvulas, pero de momento, y para familiarizarme con Arduino, estoy desarrollando tareas más simples.
Mi problema es el siguiente: Me gustaría que, al recibir por el puerto serie una 'a', se encendiera un led y a los 5 segundos se apagara. Estoy tratando de realizarlo con millis() para evitar 'delay', ya que un futuro quiero trabajar con Timers e Interrupciones. El hecho es que, tras probar muchas alternativas, no se me ocurre cómo actuar para una vez recibida una 'a', un contador se ponga a contar hasta 5 (led ON), y una vez pasados esos 5 segundos apagarlo.

Gracias de antemano y perdonad cualquier molestia, es mi primera vez en el foro de Arduino.

unsigned long tiempo1=0;
unsigned long tiempo2=0;
int seg=0;
char disp;
int ledPin1=19;


void setup() {
  Serial.begin(9600);
  pinMode(ledPin1,OUTPUT);
  pinMode(ledPin2,OUTPUT);

}


void loop() {
 if(Serial.available()>0){
    if(Serial.read()=='a'){
      tiempo1=millis();
      digitalWrite(ledPin1,HIGH);
      
      if(tiempo1>=(tiempo2+1000)){
        tiempo2=tiempo1;
        seg=tiempo1/1000;
     
        if(seg<5 && led1==true){
          digitalWrite(ledPin1,LOW);
        }else if(seg>=5){
          digitalWrite(ledPin1,LOW);
        }
      
      }
    }
  }
  
}

sketch_dec05a.ino (621 Bytes)

Hola y bienvenido al foro.

Te invito a que te leas las NORMAS para que aprendas a postear código, imagenes, errores, enlaces, etc correctamente.

En tu caso además advertirte que la zona de proyectos es para presentar tu proyecto acabado, o si no lo está, con solo alguna duda puntual.

Para resolver tu problema puedes usar una variable de control para indicar que has "iniciado" el proceso. Así cuando recibes el caracter por el puerto serie, ademas de guardar el tiempo pones la variable iniciado a cierto.
Una vez que haya transcurrido el tiempo debes poner la variable a falso para no volver a ejecutar.

Un ejemplo:

/*
 * Este código espera a recibir un caracter 'a' por el puerto serie. Cuando este
 * se recibe enciende el led de la placa del Arduino durante 5 segundos.
 */
unsigned long tinicio;  // En esta variable indicamos el tiempo cuando se inicia.
bool          iniciado; // En esta otra indicamos que se inicia el proceso.
void setup() {
  Serial.begin(9600); 
  pinMode(13,OUTPUT);
  iniciado=false;
}

void loop() {
  // Comprobamos si ha sido iniciado.
  if ( iniciado ) {
    // Si lo ha sido comprobamos que el tiempo transcurrido es mayor del tiempo
    // que queremos.
    if ( millis() - tinicio > 5000 ) {
      iniciado=false; // El tiempo ha transcurrido con lo que iniciado es falso
      digitalWrite(13, LOW); // Apagamos el led.
    }
  }

  // Comprobamos si hay datos en el puerto serie.
  if ( Serial.available() ) {
    // Leemos un caracter.
    char c = Serial.read();
    // Si el caracter es 'a' iniciamos el contador tinicio e indicamos que ya
    // se ha iniciado. Además encendemos el led.
    if ( c=='a' ) {
      tinicio=millis();
      iniciado=true;
      digitalWrite(13,HIGH);
    }
  }
}

Muy buenas victorjam y muchísimas gracias por tu tiempo. Me has sido de mucha utilidad con el código.
Trataré de seguir tus consejos para usar el foro en futuras ocasiones.

/*
 * Este código espera a recibir un caracter 'a' por el puerto serie. Cuando este
 * se recibe enciende el led de la placa del Arduino durante 5 segundos.
 */

unsigned long tinicio;  // En esta variable indicamos el tiempo cuando se inicia. Si es 0,  no esta iniciado

void setup() {
  Serial.begin(9600); 
  pinMode(13,OUTPUT);
  iniciado=false;
}

void loop() {
  // Comprobamos si ha sido iniciado y han pasado 5 segundos 
    if (tinicio && ( millis() - tinicio > 5000 )) {
      tinicio =0; // El tiempo ha transcurrido con lo que iniciado es falso
      digitalWrite(13, LOW); // Apagamos el led.
    }
  

  // Comprobamos si hay datos en el puerto serie.
  if ( Serial.available() ) {
    // Leemos un caracter.
    char c = Serial.read();
    // Si el caracter es 'a' iniciamos el contador tinicio e indicamos que ya
    // se ha iniciado. Además encendemos el led.
    if ( c=='a' ) {
      tinicio=millis();
      digitalWrite(13,HIGH);
    }
  }
}

Lo mismo, pero sin variable iniciado

Editado: sobraba un }

Gracias ElEspanol por la ayuda. Me ha sido de gran utilidad.

Les recomiendo que vean este post ¿Cual es la probabilidad de recibir un evento justo cuando millis() se desborda? de @victorjan. En donde él hace la misma propuesta que @ElEspanol y plantea el debate de la posibilidad del fallo cuando millis() se desborda y retorna cero. También se comenta la posible solución al desbordamiento.

Pero si de acá surgió ese hilo, propuesto por el propio @victorjam.

surbyte:
Pero si de acá surgió ese hilo, propuesto por el propio @victorjam.

Por eso mismo sugiero que vean ese post. No todo el mundo se mira todos los post de todas las secciones. Y así queda "enlazado".