// Pines del joystick y LEDs
const int JOYSTICK_X_PIN = 34;  // Entrada analógica del joystick (Eje X)
const int LED_LEFT_PIN = 25;     // LED izquierdo
const int LED_MIDDLE_PIN = 26;   // LED central
const int LED_RIGHT_PIN = 27;    // LED derecho

// Rango de entrada del ESP32 (ADC de 12 bits)
const int ADC_MIN = 0;
const int ADC_MAX = 4095;

// Rango de salida PWM (0-255)
const int PWM_MIN = 0;
const int PWM_MAX = 255;

// Variables para suavizar transiciones
float smoothLeft = 0;
float smoothMiddle = 0;
float smoothRight = 0;
const float smoothFactor = 0.1; // Cuanto más bajo, más suave la transición

// Función para suavizar transiciones usando un filtro exponencial
float smoothTransition(float currentValue, float targetValue) {
    return currentValue + smoothFactor * (targetValue - currentValue);
}

void setup() {
    pinMode(LED_LEFT_PIN, OUTPUT);
    pinMode(LED_MIDDLE_PIN, OUTPUT);
    pinMode(LED_RIGHT_PIN, OUTPUT);
}

void loop() {
    // Leer la posición del joystick en el eje X
    int joyX = analogRead(JOYSTICK_X_PIN);
    
    // Convertir el valor del joystick a un rango de -1.0 (izquierda) a 1.0 (derecha)
    float position = map(joyX, ADC_MIN, ADC_MAX, -100, 100) / 100.0;

    // Determinar los valores objetivo para los LEDs según la posición del joystick
    int targetLeft   = map(position * 100, -100, 100, PWM_MAX, PWM_MIN);  // Izquierda fuerte
    int targetMiddle = map(abs(position * 100), 0, 100, PWM_MIN + 100, PWM_MAX); // Medio fuerte en centro
    int targetRight  = map(position * 100, -100, 100, PWM_MIN, PWM_MAX); // Derecha fuerte

    // Aplicar los valores correctos según las posiciones requeridas
    if (position < -0.5) {  // Joystick a la izquierda
        targetLeft = PWM_MAX;  // 100%
        targetMiddle = PWM_MAX * 0.3;  // 40%
        targetRight = PWM_MAX * 0.1;  // 10%
    } 
    else if (position > 0.5) {  // Joystick a la derecha
        targetLeft = PWM_MAX * 0.1;  // 10%
        targetMiddle = PWM_MAX * 0.3;  // 40%
        targetRight = PWM_MAX;  // 100%
    } 
    else {  // Joystick en el centro
        targetLeft = PWM_MAX * 0.3;  // 40%
        targetMiddle = PWM_MAX;  // 100%
        targetRight = PWM_MAX * 0.3;  // 40%
    }

    // Suavizar la transición de los LEDs
    smoothLeft = smoothTransition(smoothLeft, targetLeft);
    smoothMiddle = smoothTransition(smoothMiddle, targetMiddle);
    smoothRight = smoothTransition(smoothRight, targetRight);

    // Aplicar valores PWM a los LEDs
    analogWrite(LED_LEFT_PIN, (int)smoothLeft);
    analogWrite(LED_MIDDLE_PIN, (int)smoothMiddle);
    analogWrite(LED_RIGHT_PIN, (int)smoothRight);

    // Pequeño retraso para estabilidad
    delay(10);
}
$abcdeabcde151015202530fghijfghij
esp:0
esp:2
esp:4
esp:5
esp:12
esp:13
esp:14
esp:15
esp:16
esp:17
esp:18
esp:19
esp:21
esp:22
esp:23
esp:25
esp:26
esp:27
esp:32
esp:33
esp:34
esp:35
esp:3V3
esp:EN
esp:VP
esp:VN
esp:GND.1
esp:D2
esp:D3
esp:CMD
esp:5V
esp:GND.2
esp:TX
esp:RX
esp:GND.3
esp:D1
esp:D0
esp:CLK
joystick1:VCC
joystick1:VERT
joystick1:HORZ
joystick1:SEL
joystick1:GND
r1:1
r1:2
led1:A
led1:C
r2:1
r2:2
led2:A
led2:C
r3:1
r3:2
led3:A
led3:C