// Definición de los estados
enum Estados {
E0,
E1,
E2,
E3,
E4
};
// Variables de estado actual y entrada
Estados estadoActual = E0;
bool sentidoNormal = true; // Variable para controlar el sentido
// Pines de entrada y salida
const int botonPin = 2; // Pin para el botón
const int salidaAPin = 3; // Salida A
const int salidaBPin = 4; // Salida B
const int salidaCPin = 5; // Salida C
// Salidas
int salidaA = 0;
int salidaB = 0;
int salidaC = 0;
// Tablas de transición de estados y salidas
const Estados transicionNormal[] = {E1, E2, E3, E4, E0};
const Estados transicionInverso[] = {E4, E0, E1, E2, E3};
const int salidaATabla[] = {0, 0, 1, 1};
const int salidaBTabla[] = {0, 1, 0, 1};
const int salidaCTabla[] = {0, 1, 1, 1};
void setup() {
// Configuración de los pines de entrada y salida
pinMode(botonPin, INPUT_PULLUP); // Configurar botón con resistencia interna
pinMode(salidaAPin, OUTPUT); // Salida A
pinMode(salidaBPin, OUTPUT); // Salida B
pinMode(salidaCPin, OUTPUT); // Salida C
Serial.begin(9600);
}
void loop() {
// Leer el estado del botón y cambiar el sentido
sentidoNormal = digitalRead(botonPin) == HIGH;
// Determinar el siguiente estado basándose en el sentido
estadoActual = sentidoNormal ? transicionNormal[estadoActual] : transicionInverso[estadoActual];
// Determinar las salidas a partir del estado actual
salidaA = salidaATabla[estadoActual];
salidaB = salidaBTabla[estadoActual];
salidaC = salidaCTabla[estadoActual];
// Configurar las salidas
digitalWrite(salidaAPin, salidaA);
digitalWrite(salidaBPin, salidaB);
digitalWrite(salidaCPin, salidaC);
// Imprimir el estado actual y las salidas en el monitor serial
Serial.print("Estado: ");
Serial.print(estadoActual);
Serial.print(" | Salida A: ");
Serial.print(salidaA);
Serial.print(" | Salida B: ");
Serial.println(salidaB);
Serial.print(" | Salida C: ");
Serial.println(salidaC);
// Pequeña demora para evitar transiciones muy rápidas
delay(1000);
}