// Definición de los estados
enum Estados {
E0,
E1,
E2,
E3
};
// 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
// Salidas
int salidaA = 0;
int salidaB = 0;
// Tablas de transición de estados y salidas
const Estados transicionNormal[] = {E1, E2, E3, E0};
const Estados transicionInverso[] = {E3, E0, E1, E2};
const int salidaATabla[] = {0, 0, 1, 1};
const int salidaBTabla[] = {0, 1, 0, 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
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];
// Configurar las salidas
digitalWrite(salidaAPin, salidaA);
digitalWrite(salidaBPin, salidaB);
// 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);
// Pequeña demora para evitar transiciones muy rápidas
delay(1000);
}