Aquí tienes un boceto de máquina de estados que hace la secuencia que has puesto. Es para que te hagas una idea. Se podría optimizar y no tener tantos estados, teniendo objetos (con sus propias máquinas de estados y variables auxiliares) que se encarguen de las secuencias que quieres mostrar.
int LED1 = 2;
int LED2 = 3;
int LED3 = 4;
int LED4 = 5;
int LED5 = 6;
int LED6 = 7;
int LED7 = 8;
int LED8 = 9;
int LED9 = 10;
const int KEY_1 = ;
const int KEY_2 = ;
const int KEY_3 = ;
const int KEY_4 = ;
const int KEY_5 = ;
const int KEY_6 = ;
const int KEY_7 = ;
const int KEY_8 = ;
const int KEY_9 = ;
const int KEY_0 = ;
const int RECV_PIN = 1;
IRrecv irrecv (RECV_PIN);
decode_results results;
enum estado_t {
ESTADO_ESPERANDO_IR,
ESTADO_KEY_1_PASO_1,
ESTADO_KEY_1_PASO_2,
ESTADO_KEY_1_PASO_3,
ESTADO_KEY_1_PASO_4,
ESTADO_KEY_1_PASO_5,
ESTADO_KEY_1_PASO_6,
ESTADO_KEY_1_PASO_7,
// Aquí falta por "declarar" todos los estados que necesites
}
estado_t estado = ESTADO_ESPERANDO_IR; // <-- para saber en qué estado está la máquina de estados (por defecto está esperando un comando IR)
unsigned long instanteCambio; // <-- para saber cuando se cambió de estado por última vez
void setEstado(estado_t nuevoEstado) { // Función para cambiar de estado y actualizar el instante del cambio
estado = nuevoEstado;
instanteCambio = millis();
}
void setup() {
Serial.begin (9600);
irrecv.enableIRIn();
pinMode (LED1 , OUTPUT);
pinMode (LED2 , OUTPUT);
pinMode (LED3 , OUTPUT);
pinMode (LED4 , OUTPUT);
pinMode (LED5 , OUTPUT);
pinMode (LED6 , OUTPUT);
pinMode (LED7 , OUTPUT);
pinMode (LED8 , OUTPUT);
pinMode (LED9 , OUTPUT);
}
void loop() {
unsigned long transcurrido = millis() - instanteCambio; // Calculamos cuanto tiempo ha trascurrido desde el último cambio
if (irrecv.decode(&results));
{
if (estado == ESTADO_ESPERANDO_IR) { // Sólo si está esperando un comando IR pasamos ha hacer algo, si no es así, lo descartamos
switch (results.value)
{
case KEY_1: // En caso de ser el comando adecuado
setEstado(ESTADO_KEY_1_PASO_1); // Pasamos al estado del primer paso del comando
break;
case KEY_2:
setEstado(ESTADO_KEY_2_PASO_1);
break;
case KEY_3:
setEstado(ESTADO_KEY_3_PASO_1);
break;
case KEY_4:
setEstado(ESTADO_KEY_4_PASO_1);
break;
case KEY_5:
setEstado(ESTADO_KEY_5_PASO_1);
break;
case KEY_6:
setEstado(ESTADO_KEY_6_PASO_1);
break;
case KEY_7:
setEstado(ESTADO_KEY_7_PASO_1);
break;
case KEY_8:
setEstado(ESTADO_KEY_8_PASO_1);
break;
case KEY_9:
setEstado(ESTADO_KEY_9_PASO_1);
break;
case KEY_0:
setEstado(ESTADO_KEY_0_PASO_1);
break;
}
}
irrecv.resume();
}
switch (estado) // Procesamos el estado actual
{
case ESTADO_ESPERANDO_IR: // Si está esperando a recibir algo, no hace nada
break;
case ESTADO_KEY_1_PASO_1: // Encender el LED1 y pasar a esperar a que pase el tiempo para apagar el LED1
digitalWrite (LED1 , HIGH);
setEstado(ESTADO_KEY_1_PASO_2); // Pasa al estado de esperar a apagar el LED1
break;
case ESTADO_KEY_1_PASO_2: // Esperamos a que pase el tiempo y entonces apagamos el LED1 y esperamos para encender el LED2
if (transcurrido >= 200) {
digitalWrite (LED1 , LOW);
setEstado(ESTADO_KEY_1_PASO_3); // Pasa al estado de esperar a encender el LED2
}
break;
case ESTADO_KEY_1_PASO_3: // Esperamos a que pase el tiempo y entonces encendemos el LED2 y esperamos para apagarlo
if (transcurrido >= 200) {
digitalWrite (LED2 , HIGH);
setEstado(ESTADO_KEY_1_PASO_4); // Pasa al estado de esperar a apagar el LED2
}
break;
case ESTADO_KEY_1_PASO_4: // Esperamos a que pase el tiempo y entonces apagamos el LED2 y esperamos para encender el LED3
if (transcurrido >= 200) {
digitalWrite (LED2 , LOW);
setEstado(ESTADO_KEY_1_PASO_5); // Pasa al estado de esperar a encender el LED3
}
break;
case ESTADO_KEY_1_PASO_5: // Esperamos a que pase el tiempo y entonces encendemos el LED2 y esperamos para apagarlo
if (transcurrido >= 200) {
digitalWrite (LED3 , HIGH);
setEstado(ESTADO_KEY_1_PASO_6); // Pasa al estado de esperar a apagar el LED3
}
break;
case ESTADO_KEY_1_PASO_6: // Esperamos a que pase el tiempo y entonces apagamos el LED3 y esperamos para encender el LED4
if (transcurrido >= 200) {
digitalWrite (LED3 , LOW);
setEstado(ESTADO_KEY_1_PASO_7); // Pasa al estado de esperar a encender el LED4
}
break;
case ESTADO_KEY_1_PASO_7: // Esperamos a que pase el tiempo y entonces encendemos el LED2 y esperamos para apagarlo
if (transcurrido >= 200) {
digitalWrite (LED4 , HIGH);
setEstado(ESTADO_KEY_1_PASO_8); // Pasa al estado de esperar a apagar el LED4
}
break;
case ESTADO_KEY_1_PASO_8: // Esperamos a que pase el tiempo y entonces apagamos el LED4 y esperamos para encender el LED5
if (transcurrido >= 200) {
digitalWrite (LED4 , LOW);
setEstado(ESTADO_KEY_1_PASO_9); // Pasa al estado de esperar a encender el LED5
}
break;
case ESTADO_KEY_1_PASO_9: // Esperamos a que pase el tiempo y entonces encendemos el LED2 y esperamos para apagarlo
if (transcurrido >= 200) {
digitalWrite (LED5 , HIGH);
setEstado(ESTADO_KEY_1_PASO_10); // Pasa al estado de esperar a apagar el LED5
}
break;
case ESTADO_KEY_1_PASO_10: // Esperamos a que pase el tiempo y entonces apagamos el LED5 y esperamos para encender el LED6
if (transcurrido >= 200) {
digitalWrite (LED5 , LOW);
setEstado(ESTADO_KEY_1_PASO_11); // Pasa al estado de esperar a encender el LED6
}
break;
case ESTADO_KEY_1_PASO_11: // Esperamos a que pase el tiempo y entonces encendemos el LED2 y esperamos para apagarlo
if (transcurrido >= 200) {
digitalWrite (LED6 , HIGH);
setEstado(ESTADO_KEY_1_PASO_12); // Pasa al estado de esperar a apagar el LED6
}
break;
case ESTADO_KEY_1_PASO_12: // Esperamos a que pase el tiempo y entonces apagamos el LED6 y esperamos para encender el LED7
if (transcurrido >= 200) {
digitalWrite (LED6 , LOW);
setEstado(ESTADO_KEY_1_PASO_13); // Pasa al estado de esperar a encender el LED7
}
break;
case ESTADO_KEY_1_PASO_13: // Esperamos a que pase el tiempo y entonces encendemos el LED2 y esperamos para apagarlo
if (transcurrido >= 200) {
digitalWrite (LED7 , HIGH);
setEstado(ESTADO_KEY_1_PASO_14); // Pasa al estado de esperar a apagar el LED7
}
break;
case ESTADO_KEY_1_PASO_14: // Esperamos a que pase el tiempo y entonces apagamos el LED7 y esperamos para encender el LED8
if (transcurrido >= 200) {
digitalWrite (LED7 , LOW);
setEstado(ESTADO_KEY_1_PASO_15); // Pasa al estado de esperar a encender el LED8
}
break;
case ESTADO_KEY_1_PASO_15: // Esperamos a que pase el tiempo y entonces encendemos el LED2 y esperamos para apagarlo
if (transcurrido >= 200) {
digitalWrite (LED8 , HIGH);
setEstado(ESTADO_KEY_1_PASO_16); // Pasa al estado de esperar a apagar el LED8
}
break;
case ESTADO_KEY_1_PASO_16: // Esperamos a que pase el tiempo y entonces apagamos el LED8 y esperamos para encender el LED9
if (transcurrido >= 200) {
digitalWrite (LED8 , LOW);
setEstado(ESTADO_KEY_1_PASO_17); // Pasa al estado de esperar a encender el LED9
}
break;
case ESTADO_KEY_1_PASO_17: // Esperamos a que pase el tiempo y entonces encendemos el LED2 y esperamos para apagarlo
if (transcurrido >= 200) {
digitalWrite (LED9 , HIGH);
setEstado(ESTADO_KEY_1_PASO_18); // Pasa al estado de esperar a apagar el LED9
}
break;
case ESTADO_KEY_1_PASO_18: // Esperamos a que pase el tiempo y entonces apagamos el LED9 y como es el último, pasamos al estado de espera
if (transcurrido >= 200) {
digitalWrite (LED9 , LOW);
setEstado(ESTADO_ESPERANDO_IR); // Pasa al estado de esperar a recibir un nuevo comando de IR
}
break;
// Aquí van más estados a tratar
}
}