from machine import Pin, ADC, PWM, I2C, time_pulse_us
from utime import sleep
import dht
import utime
# --- 1. CONFIGURACIÓN DE SENSORES Y PINES ---
# Digitales
sensor_dht = dht.DHT22(Pin(14)) # 1. Temperatura y Humedad
sensor_pir = Pin(27, Pin.IN) # 2. Sensor de Movimiento
sensor_trig = Pin(5, Pin.OUT) # 3. Sensor Ultrasónico (Trig)
sensor_echo = Pin(18, Pin.IN) # 3. Sensor Ultrasónico (Echo)
# Analógicos (Lectura de 0 a 4095)
sensor_ldr = ADC(Pin(34)) # 4. Sensor de Luz
sensor_gas = ADC(Pin(35)) # 5. Sensor de Gas/Humo
sensor_suelo = ADC(Pin(32)) # 6. Humedad de Suelo
# Actuadores de respuesta
servo = PWM(Pin(15), freq=50) # Ventilación/Puerta
led_alerta = Pin(2, Pin.OUT) # LED indicador de sistema
led_luz = Pin (25, Pin.OUT) #luz prendida del sensor de luz
led1 = Pin(19, Pin.OUT)
led2 = Pin(21, Pin.OUT)
led3 = Pin(22, Pin.OUT)
led4 = Pin(23, Pin.OUT)
# --- 2. FUNCIONES DE APOYO ---
def leer_distancia():
sensor_trig.value(0)
utime.sleep_us(2)
sensor_trig.value(1)
utime.sleep_us(10)
sensor_trig.value(0)
duracion = time_pulse_us(sensor_echo, 1, 30000)
return (duracion * 0.0343) / 2 if duracion > 0 else 0
def mapear_valor(valor, in_min, in_max, out_min, out_max):
return int((valor - in_min) * (out_max - out_min) / (in_max - in_min) + out_min)
# --- 3. BUCLE PRINCIPAL DE AUTOMATIZACIÓN ---
print("--- Iniciando Smart House ESP32 ---")
while True:
try:
# Lectura de Sensores
sensor_dht.measure()
temp = sensor_dht.temperature()
hum = sensor_dht.humidity()
luz = sensor_ldr.read()
gas = sensor_gas.read()
hum_suelo = sensor_suelo.read()
distancia = leer_distancia()
movimiento = sensor_pir.value()
# --- LÓGICA DE AUTOMATIZACIÓN ---
# Alerta de Humo o Gas
if gas > 1500:
print("¡ALERTA!: Humo detectado")
led1.on()
led2.off()
led3.off()
led4.off()
sleep(0.5)
led1.on()
led2.on()
led3.off()
led4.off()
sleep(0.5)
led1.on()
led2.on()
led3.on()
led4.off()
sleep(0.5)
led1.on()
led2.on()
led3.on()
led4.on()
sleep(0.5)
led1.on()
led2.on()
led3.on()
led4.on()
sleep(0.5)
led1.on()
led2.on()
led3.on()
led4.on()
sleep(0.5)
led1.on()
led2.on()
led3.on()
led4.off()
sleep(0.5)
led1.on()
led2.on()
led3.off()
led4.off()
sleep(0.5)
led1.on()
led2.on()
led3.off()
led4.off()
sleep(0.5)
led1.on()
led2.off()
led3.off()
led4.off()
sleep(0.5)
led_alerta.value(1)
else:
led1.off()
led2.off()
led3.off()
led4.off()
sleep(0.5)
led_alerta.value(0)
# Control de Ventana/Ventilador por Temperatura
if temp > 30:
servo.duty(120) # Abre ventana
else:
servo.duty(26) # Cierra ventana
# Led de luz en caso de ausencia del sol
if luz < 1500: # Oscuridad
led_luz.on()
else:
led_luz.off()
# Monitor de Consola (Simulando Dashboard)
print("-" * 30)
print("Clima: {}C | Humedad: {}%".format(temp, hum))
print("Luz (LDR): {} | Gas: {}".format(luz, gas))
print("Suelo: {} | Distancia: {:.1f}cm".format(hum_suelo, distancia))
if movimiento: print("--> ¡MOVIMIENTO DETECTADO!")
utime.sleep(2) # Intervalo de actualización
except OSError as e:
print("Error leyendo sensores.")