#include <Servo.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <LedControl.h> // Librería para controlar la matriz LED MAX7219
// Pinout
const int pinX = A0; // Eje X del joystick
const int pinLED_R = 9; // Pin del LED RGB (Rojo)
const int pinLED_G = 10; // Pin del LED RGB (Verde)
const int pinLED_B = 11; // Pin del LED RGB (Azul)
const int pinServo = 3; // Pin del servomotor
// Matriz LED MAX7219 (DIN = 4, CS = 5, CLK = 6)
LedControl lc = LedControl(4, 5, 6, 1); // Nuevos pines para la matriz LED
// Variables
int valorX;
Servo servo; // Objeto para el servomotor
LiquidCrystal_I2C lcd(0x27, 16, 2); // Configura el LCD en la dirección 0x27
// Definición de patrones para las flechas
byte flechaIzquierda[8] = {B00011000, B00111100, B01111110, B11111111, B11111111, B01111110, B00111100, B00011000};
byte flechaDerecha[8] = {B00011000, B00111100, B01111110, B11111111, B11111111, B01111110, B00111100, B00011000};
byte flechaCentro[8] = {B00000000, B00111100, B00100100, B00100100, B00100100, B00100100, B00111100, B00000000};
void setup() {
pinMode(pinLED_R, OUTPUT);
pinMode(pinLED_G, OUTPUT);
pinMode(pinLED_B, OUTPUT);
servo.attach(pinServo); // Conectar el servomotor
lcd.init(); // Inicializa el display LCD
lcd.backlight(); // Enciende la luz de fondo del LCD
lc.shutdown(0, false); // Despierta la matriz
lc.setIntensity(0, 8); // Ajusta el brillo (0-15)
lc.clearDisplay(0); // Limpia la matriz
}
void loop() {
valorX = analogRead(pinX); // Leer el valor del joystick en el eje X
int angulo = map(valorX, 0, 1023, 0, 180); // Convertir el valor del joystick en ángulo del servomotor
servo.write(angulo); // Mover el servomotor según el ángulo
lcd.clear();
if (valorX < 450) {
lcd.setCursor(0, 0);
lcd.print("Izquierda");
encenderLED(0, 255, 0); // Encender el LED en verde (Izquierda)
mostrarFlecha(flechaIzquierda); // Mostrar flecha hacia la izquierda
} else if (valorX > 570) {
lcd.setCursor(0, 0);
lcd.print("Derecha");
encenderLED(0, 0, 255); // Encender el LED en azul (Derecha)
mostrarFlecha(flechaDerecha); // Mostrar flecha hacia la derecha
} else {
lcd.setCursor(0, 0);
lcd.print("Centro");
encenderLED(0, 0, 0); // Apagar el LED (Centro)
mostrarFlecha(flechaCentro); // Mostrar un símbolo de centro (círculo)
}
delay(200); // Pequeña pausa para evitar parpadeos en el LCD
}
// Función para controlar el color del LED RGB
void encenderLED(int rojo, int verde, int azul) {
analogWrite(pinLED_R, rojo);
analogWrite(pinLED_G, verde);
analogWrite(pinLED_B, azul);
}
// Función para mostrar una flecha en la matriz LED
void mostrarFlecha(byte flecha[8]) {
for (int i = 0; i < 8; i++) {
lc.setRow(0, i, flecha[i]); // Mostrar cada fila de la matriz
}
}