Programa coche fantastico

Hola compañeros, me encuentro haciendo varios programillas con leds, y me surgen algunas dudas en este programa, he de decir que llevo poquito tiempo en esto. Espero que podais ayudarme.

int led[6] = {13,12,11,10,9,8};
int ta, tn;
int i=-1;
void setup() 
{
  for (int i=0; i<=5; i++)
    {
      pinMode(led[i], OUTPUT);
      digitalWrite(led[i], LOW);
    }
}

void loop() 
{
  tn = millis();
  if ((ta-tn)>100);
  {
    i++;
      switch(i)
      {   
          case 0:
          digitalWrite(led[i],HIGH);
          break;
    
          case 1:
          digitalWrite(led[i],HIGH);
          break;
    
          case 2:
          digitalWrite(led[i],HIGH);
          break;
    
          case 3:
          digitalWrite(led[i],HIGH);
          break;
    
          case 4:
          digitalWrite(led[i],HIGH);
          break;
    
          case 5:
          digitalWrite(led[i],HIGH);
          i=-1;
          break;
      }
   }
}

Ese es el codigo que tengo hecho hasta ahora del programa que quiero hacer, 6 leds que simulen el coche fantastico. Hasta ahora solo he conseguido que se me encienda uno detras de otro, pero no que se apaguen sucesivamente (al igual que se van encendiendo). Si me podeis explicar algo mas sobre el temas, os lo agredeceria bastante, ya que he probado varias maneras y no saco nada mas a partir de eso, de todas formas voy a seguir probando y si consigo algo lo voy poniendo aqui hasta que consiga finalizar el programa. espero vuestra ayuda. Mil gracias de antemano

Tu código, empieza bien, pero se complica con el uso de switch-case y millis. Si el código solo tienen que encender y apagar leds, es factible usar delay. Para el movimiento de los leds, tienes que pensar en encender secuencialmente, pero tambien apagar el que encendiste anteriormente.

Esto, se puede solucionar rápidamente, usando dos bucles for, eliminando todo el código del switch-case.

Si empezamos con un for asi:

  for (i = 0; i < 5; i++)
  {
    digitalWrite(led[i + 1], HIGH);
    digitalWrite(led[i], LOW);
    delay (100);
  }

Tenemos solucionada la "ida". Piensa ahora, ¿cómo harías la "vuelta" con otro bucle for?

Por cierto, no te preocupes por que el primer led no se encienda a la "ida", ya lo encenderás a la "vuelta".

Esta es mi versión, no la probé asi que espero funcione

int led[6] = {13,12,11,10,9,8};
int ta, tn;
int i      = -1;
bool asciende = true;

void setup() {

  for (int i=0; i<=5; i++)  {
      pinMode(led[i], OUTPUT);
      digitalWrite(led[i], LOW);
    }
}

void loop() {

  tn = millis();
  if ((ta-tn)>100) {
      if (asciende) {
         if(i++>5)
            asciende = false;
      }
      else {
         if (i-- == 0)
            asciende = true;  
      }
      
      switch(i)  {   
          case 0:
                  if (!asciende)
                     digitalWrite(led[i+1],LOW);
                  digitalWrite(led[i],HIGH);
                  break;
          case 1: 
          case 2: 
          case 3:  
          case 4: 
                  if (asciende)
                     digitalWrite(led[i-1],LOW);
                  else
                     digitalWrite(led[i+1],LOW);
                  digitalWrite(led[i], HIGH);
                  break;
            
          case 5:
                  if (asciende) 
                      digitalWrite(led[i-1], LOW);
                  digitalWrite(led[i], HIGH);
                  break;
          case 6: 
      }
   }
}

Muchas gracias por contestar, es obvio que se me a olvidado poner que el programa no queria que tuviese delay, por eso lo de la funcion millis. Muchisimas gracias por contestar, y surbyte, ahora mismo te comento. Mil gracias a los 2

y que os parece usar la propiedad de que el 6 y abs (-6) es lo mismo?

int led[6] = {13,12,11,10,9,8};
int i = 0, a=0;
long tn=0;


void setup()
{
 for (a = 0; a < 6; a++) pinMode(led[i], OUTPUT); 
//  for (a = 0; a < 6; a++) {digitalWrite(led[i], HIGH); delay(500);}
}

void loop() 
{


if (millis()-tn>=1000)
{
 tn=millis();
for (a = 0; a < 6; a++) digitalWrite(led[a], LOW); //apagarlos todos

digitalWrite(led[abs(i)], HIGH); //encender el que toque

i++;

if (i==5)  i=-5;

}

//resto de códigos a ejecutar

}