/*
* PROYECTO: Genios Solucionadores - Grado 8 GBCMC
* OBJETIVO: Sistema de Control Automático de Luz (Lazo Cerrado)
* EXPLICACIÓN: El ESP32 actúa como un "cerebro" que ajusta un LED
* dependiendo de cuánta luz detecta su "ojo" (el sensor LDR).
*/
// --- PINES (¿Dónde conectamos las cosas?) ---
const int PIN_FOTORESISTENCIA = 34; // Pin donde el sensor envía su información
const int PIN_LED_PWM = 33; // Pin donde enviamos energía al LED
// --- PARÁMETROS DE CONTROL (Las reglas del juego) ---
const int SETPOINT = 2000; // La cantidad de luz ideal que queremos tener
const float reactionStrength = 0.3; // Qué tan rápido reacciona el sistema (como el acelerador)
// --- VARIABLES ---
float ledBrillo = 0; // Aquí guardamos el nivel de brillo actual (0 a 1023)
// Configuración de la "señal de energía" para el LED
const int freq = 5000; // Qué tan rápido parpadea la señal (imperceptible al ojo)
const int resolution = 10; // Precisión del brillo (10 bits = 1024 niveles de brillo)
void setup() {
Serial.begin(115200); // Iniciamos el monitor para "leerle la mente" al ESP32
pinMode(PIN_FOTORESISTENCIA, INPUT); // Decimos que el sensor es una ENTRADA de datos
// Conectamos el pin del LED a la función de control de brillo (PWM)
ledcAttach(PIN_LED_PWM, freq, resolution);
}
void loop() {
// 1. SENTIR: Leemos cuánta luz hay en la habitación (0 a 4095)
int lectura = analogRead(PIN_FOTORESISTENCIA);
// 2. PENSAR: Calculamos la diferencia entre lo que queremos y lo que hay
// Si el resultado es positivo, falta luz. Si es negativo, sobra.
int error = SETPOINT- lectura;
// 3. AJUSTAR: El brillo actual cambia un poco según el error
// Multiplicamos por 0.3 para que el cambio sea suave y no de saltos locos
ledBrillo = ledBrillo + (reactionStrength * error);
// 4. SEGURIDAD: El LED solo entiende números entre 0 y 1023
// Si el cálculo da 1100, lo obligamos a quedarse en 1023. Si da -5, a 0.
if (ledBrillo > 1023) ledBrillo = 1023;
if (ledBrillo < 0) ledBrillo = 0;
// 5. ACTUAR: Le ordenamos al LED que brille con la potencia calculada
ledcWrite(PIN_LED_PWM, (int)ledBrillo);
// 6. MOSTRAR: Enviamos los datos a la computadora para revisar que todo esté bien
Serial.print("Luz Ambiente: ");
Serial.print(lectura);
Serial.print(" | Brillo enviado al LED: ");
Serial.println((int)ledBrillo);
delay(100); // Esperamos un poquito antes de volver a medir (10 veces por segundo)
}