viernes, 20 de febrero de 2026

OPEN LOOP SYSTEM

 /*

 * 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)
}

No hay comentarios:

Publicar un comentario