programacion de iluminacion de escalera con millis

Buen día.

Soy usuario nuevo en el foro, solicitando ayuda sobre un ejercicio consultado en el mismo foro sobre el coche fantástico utilizando millis() y que publico victorjam en ejercicios con millis() y botones

Actualmente estoy trabajando con un ejercicio de control de luces led para escaleras, el cual es funcional usando for() y delay(), he tratado de adaptar el código del coche fantástico pero no he dado con la solución

El programa debe encender todos los led con cierto tiempo programado, esperar un tiempo y comenzar a apagar de forma secuencial, cosa que no consigo que funcione, alguien tiene idea de como
hacerlo, todo esto con millis() ya que pienso utilizar un arduino mega para aprovechar todas sus salidas y conectarlo en dos escaleras y que puedan funcionar simultáneamente.

Espero haberme explicado correctamente y no haber violado alguna regla del foro

int ledsA;
int ledsB;

int MatrizA [] = {5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19};
int MatrizB [] = {23, 25, 27 , 29 , 31, 33, 35, 37 , 39, 41 , 43, 45, 47, 49};

//SENSORES DE PRESENCIA
int SENSOR1 = 51;
int SENSOR2 = 53;
int SENSOR4 = 54;
int SENSOR3 = 55;

//Variables de tiempo
int Tiempo1 = 1000;
int Tiempo2 = 5000;
int Tiempo3 = 500;

void setup() {

  for ( ledsA = 0; ledsA < 15; ledsA++) { 
    pinMode (MatrizA[ledsA], OUTPUT); 
    digitalWrite (MatrizA[ledsA], 0); 
  }
  for ( ledsB = 0; ledsB < 14; ledsB++) { 
    pinMode (MatrizB[ledsB], OUTPUT); 
    digitalWrite (MatrizB[ledsB], 0);
  }  
  pinMode(SENSOR1, INPUT);
  pinMode(SENSOR2, INPUT);
  pinMode(SENSOR3, INPUT);
  pinMode(SENSOR4, INPUT);  
}
void loop () {
  ///////////////////////////////////////////PLANTA BAJA////////////////////////////////////
  //SUBIR
  if (digitalRead(SENSOR1) == HIGH) {
       for ( ledsB = 0; ledsB < 14; ledsB = ledsB + 1) { 
      digitalWrite (MatrizB[ledsB], 1);
      delay (Tiempo1);
    }
    delay (Tiempo2);
      for ( ledsB = 13; ledsB > -1; ledsB = ledsB - 1) { 
      digitalWrite (MatrizB[ledsB], 0);
      delay (Tiempo3);
    }
  }
  //BAJAR
  if (digitalRead(SENSOR2) == HIGH) {
       for ( ledsB = 13; ledsB > -1; ledsB = ledsB - 1) { 
      digitalWrite (MatrizB[ledsB], 1);
      delay (Tiempo1);
    }
    delay (Tiempo2);  
    for ( ledsB = 0; ledsB < 14; ledsB = ledsB + 1) { 
      digitalWrite (MatrizB[ledsB], 0);
      delay (Tiempo3);
    }
  }

  ///////////////////////////////////////////PLANTA ALTA//////////////////////////////////////

  //SUBIR
  if (digitalRead(SENSOR3) == HIGH) {
       for ( ledsA = 0; ledsA < 15; ledsA = ledsA + 1) { 
      digitalWrite (MatrizA[ledsA], 1);
      delay (Tiempo1);
    }
    delay (Tiempo2);
       for ( ledsA = 14; ledsA > -1; ledsA = ledsA - 1) { 
      digitalWrite (MatrizA[ledsA], 0);
      delay (Tiempo3);
    }
  }

  //BAJAR
  if (digitalRead(SENSOR4) == HIGH) {  
    for ( ledsA = 14; ledsA > -1; ledsA = ledsA - 1) { 
      digitalWrite (MatrizA[ledsA], 1);
      delay (Tiempo1);
    }
    delay (Tiempo2);   
    for ( ledsA = 0; ledsA < 15; ledsA = ledsA + 1) { 
      digitalWrite (MatrizA[ledsA], 0);
      delay (Tiempo3);
    }
  }
}

CONTROL_LED_ESCALERA.ino (2.29 KB)

Lee también el tutorial: Una forma sencilla de programar secuencias, y adáptalo a tus necesidades.

Gracias por la ayuda victorjam, he adaptado el código a mis necesidades tal y como me recomendaste, por lo pronto lo he simulado en proteus y ha funcionado a la perfección.

Se me ha ocurrido integrar una display 16x2, para visualizar algunos mensajes, pero a la hora de incluir el código para controlarla ya no lo simula ,se traba, no ejecuta la instrucción y me manda de vez en cuando un error. (invalid opcode) incluso solo con declarar la librería y sin inicializar el display.

Espero le puedas hechar un vistazo a ver si te funciona pensando que es mi equipo el que ande mal, o algo he programado de forma errónea

Saludos, y gracias de nueva cuenta.

CONTROL_LED_MEGA_2.0.ino (20.7 KB)

PRUEBA MEGA2.zip (28.3 KB)