/*
* Sistema automático de temperatura (técnica del semáforo) + luz automática
* Placa: ESP32 DevKit V1 (Wokwi)
* Librería: "DHT sensor library" (Adafruit) -> libraries.txt
*
* RANGOS FIJOS (sin histéresis, el LED depende SOLO del valor actual)
*
* Temperatura (DHT22):
* menos de 20 °C -> LED VERDE (frío)
* de 20 °C a 30 °C -> LED AMARILLO (medio)
* más de 30 °C -> LED ROJO (caliente)
*
* Luz (LDR simulado):
* menos de 50 lux -> LED BLANCO ENCENDIDO (oscuridad)
* 50 lux o más -> LED BLANCO APAGADO (hay luz)
*/
#include <DHT.h>
// ---------- Pines ----------
#define PIN_DHT 15
#define PIN_LED_VERDE 25
#define PIN_LED_AMARILLO 26
#define PIN_LED_ROJO 27
#define PIN_LED_BLANCO 33
#define PIN_LDR 34 // entrada analógica (ADC1)
#define TIPO_DHT DHT22
DHT dht(PIN_DHT, TIPO_DHT);
// ---------- Rangos de temperatura (°C) ----------
const float T_FRIO = 20.0; // menor a este valor = frío
const float T_CALOR = 30.0; // mayor a este valor = caliente
// ---------- Rango de luz (lux) ----------
const float LUX_OSCURO = 50.0; // menor a este valor = oscuridad
// ---------- Constantes del LDR de Wokwi ----------
const float GAMMA = 0.7;
const float RL10 = 50;
unsigned long ultimaLectura = 0;
const unsigned long INTERVALO_MS = 500;
// ---------- Funciones ----------
void apagarTemperatura() {
digitalWrite(PIN_LED_VERDE, LOW);
digitalWrite(PIN_LED_AMARILLO, LOW);
digitalWrite(PIN_LED_ROJO, LOW);
}
// Devuelve el nombre del rango y enciende SOLO un LED
const char* semaforoTemperatura(float t) {
apagarTemperatura();
if (t < T_FRIO) {
digitalWrite(PIN_LED_VERDE, HIGH);
return "FRIO (verde)";
} else if (t <= T_CALOR) {
digitalWrite(PIN_LED_AMARILLO, HIGH);
return "MEDIO (amarillo)";
} else {
digitalWrite(PIN_LED_ROJO, HIGH);
return "CALIENTE (rojo)";
}
}
// Convierte la lectura ADC del módulo LDR de Wokwi a lux
float leerLux(int valorAdc) {
float voltaje = valorAdc / 4095.0 * 3.3;
if (voltaje >= 3.29) return 0.1; // oscuridad total
float resistencia = 2000 * voltaje / (1 - voltaje / 3.3);
if (resistencia < 1) return 100000.0; // luz máxima
return pow(RL10 * 1e3 * pow(10, GAMMA) / resistencia, (1 / GAMMA));
}
void setup() {
Serial.begin(115200);
pinMode(PIN_LED_VERDE, OUTPUT);
pinMode(PIN_LED_AMARILLO, OUTPUT);
pinMode(PIN_LED_ROJO, OUTPUT);
pinMode(PIN_LED_BLANCO, OUTPUT);
pinMode(PIN_LDR, INPUT);
analogReadResolution(12);
dht.begin();
Serial.println("Sistema automatico de temperatura y luz iniciado");
}
void loop() {
if (millis() - ultimaLectura < INTERVALO_MS) return;
ultimaLectura = millis();
// --- Temperatura ---
float t = dht.readTemperature();
const char* estado = "sin lectura";
if (isnan(t)) {
Serial.println("Error leyendo el DHT22");
} else {
estado = semaforoTemperatura(t);
}
// --- Luz ---
int adc = analogRead(PIN_LDR);
float lux = leerLux(adc);
bool oscuro = (lux < LUX_OSCURO);
digitalWrite(PIN_LED_BLANCO, oscuro ? HIGH : LOW);
// --- Monitor serie ---
Serial.printf("Temp: %.1f C -> %s | Luz: %.1f lux -> %s\n",
t, estado, lux,
oscuro ? "OSCURO, luz BLANCA ON" : "CLARO, luz BLANCA OFF");
}