// Pines del joystick
const int pinJoyX = A0;
const int pinJoyY = A1;
const int pinButton = 9;
// Pines de los LEDs
const int ledArriba = 3;
const int ledAbajo = 4;
const int ledDerecha = 5;
const int ledIzquierda = 2;
// Valores centrales del joystick
const int centro = 512;
const int tolerancia = 100; // Tolerancia para determinar si está en el centro
// Variables para el estado anterior del joystick y botón
int estadoAnteriorX = centro;
int estadoAnteriorY = centro;
bool botonAnterior = HIGH;
int ledEncendidoAnterior = -1; // Almacena cuál LED estaba encendido (-1 = ninguno)
// Variable para controlar si es el primer ciclo
bool primerCiclo = true;
void setup() {
// Configuración de pines de LEDs como salida
pinMode(ledArriba, OUTPUT);
pinMode(ledAbajo, OUTPUT);
pinMode(ledDerecha, OUTPUT);
pinMode(ledIzquierda, OUTPUT);
// Configuración del botón como entrada con resistencia pull-up
pinMode(pinButton, INPUT_PULLUP);
// Inicia comunicación en el monitor serie
Serial.begin(9600);
}
void loop() {
// Leer valores del joystick
int valorX = analogRead(pinJoyX);
int valorY = analogRead(pinJoyY);
bool botonPresionado = digitalRead(pinButton) == LOW; // Botón presionado cuando es LOW
// Evitar mensajes durante el primer ciclo
if (primerCiclo) {
primerCiclo = false;
estadoAnteriorX = valorX;
estadoAnteriorY = valorY;
botonAnterior = !botonPresionado;
return;
}
// Detectar cambios en el botón
if (botonPresionado != botonAnterior) {
botonAnterior = botonPresionado;
if (botonPresionado) {
encenderTodosLosLEDs(); // Enciende todos los LEDs
Serial.println("Botón presionado: ¡Encendiendo todos los LEDs!");
} else {
apagarTodosLosLEDs();
Serial.println("Botón soltado: ¡Todos los LEDs apagados!");
}
}
// Detectar movimientos del joystick
int ledEncendido = -1; // LED que debe encenderse en este ciclo
if (valorY < centro - tolerancia) { // Arriba
if (ledEncendidoAnterior != ledArriba) { // Solo imprime si hay cambio
ledEncendido = ledArriba;
encenderLED(ledEncendido);
Serial.println("Arriba: LED ENCENDIDO");
}
} else if (valorY > centro + tolerancia) { // Abajo
if (ledEncendidoAnterior != ledAbajo) { // Solo imprime si hay cambio
ledEncendido = ledAbajo;
encenderLED(ledEncendido);
Serial.println("Abajo: LED ENCENDIDO");
}
} else if (valorX > centro + tolerancia) { // Derecha
if (ledEncendidoAnterior != ledDerecha) { // Solo imprime si hay cambio
ledEncendido = ledDerecha;
encenderLED(ledEncendido);
Serial.println("Derecha: LED ENCENDIDO");
}
} else if (valorX < centro - tolerancia) { // Izquierda
if (ledEncendidoAnterior != ledIzquierda) { // Solo imprime si hay cambio
ledEncendido = ledIzquierda;
encenderLED(ledEncendido);
Serial.println("Izquierda: LED ENCENDIDO");
}
} else {
if (ledEncendidoAnterior != -1) { // Solo imprime si había un LED encendido
apagarTodosLosLEDs();
Serial.println("LED APAGADO");
ledEncendidoAnterior = -1; // Actualizar estado
}
}
// Actualizar el LED encendido previamente
if (ledEncendido != -1) {
ledEncendidoAnterior = ledEncendido;
}
delay(50); // Pausa para estabilidad
}
// Función para encender un LED y apagar los demás
void encenderLED(int led) {
apagarTodosLosLEDs(); // Apaga todos antes de encender el indicado
digitalWrite(led, HIGH);
}
// Función para apagar todos los LEDs
void apagarTodosLosLEDs() {
digitalWrite(ledArriba, LOW);
digitalWrite(ledAbajo, LOW);
digitalWrite(ledDerecha, LOW);
digitalWrite(ledIzquierda, LOW);
}
// Función para encender todos los LEDs
void encenderTodosLosLEDs() {
digitalWrite(ledArriba, HIGH);
digitalWrite(ledAbajo, HIGH);
digitalWrite(ledDerecha, HIGH);
digitalWrite(ledIzquierda, HIGH);
}