from machine import Pin, ADC, PWM
import time
import math
# Configuración de pines
temp_sensor = ADC(Pin(27)) # Sensor de temperatura
lux_sensor = ADC(Pin(28)) # Sensor LUX interior
lux_exterior = ADC(Pin(26)) # Sensor LDR exterior (para cortinas)
pir_sensor = Pin(21, Pin.IN) # Sensor de presencia
# Sensor ultrasónico para puerta
ultrasonic_trigger = Pin(1, Pin.OUT)
ultrasonic_echo = Pin(0, Pin.IN)
# LEDs de alerta
led_temp_alerta = Pin(4, Pin.OUT)
led_lux_alerta = Pin(8, Pin.OUT)
led_luz_interior = Pin(11, Pin.OUT)
# Servos
servo_cortinas = PWM(Pin(16))
servo_puerta = PWM(Pin(15))
servo_cortinas.freq(50)
servo_puerta.freq(50)
# Parámetros de los sensores
BETA = 3950
T0 = 298.15
K_TO_C = 273.15
GAMMA = 0.7
RL10 = 50
# Umbrales del sistema
TEMP_MIN = 18
TEMP_MAX = 26
LUX_MIN = 300
LUX_MAX = 500
UMBRAL_OSCURO = 70 # Valor bajo = oscuro (cerrar cortinas)
DISTANCIA_APERTURA = 50 # Distancia en cm para abrir puerta
# Estados
cortina_abierta = False
puerta_abierta = False
def leer_temperatura():
"""Lee la temperatura en grados Celsius"""
raw_value = temp_sensor.read_u16()
val_10bit = raw_value >> 6
if val_10bit <= 0:
val_10bit = 1
if val_10bit >= 1023:
val_10bit = 1022
celsius = 1 / (math.log(1 / (1023.0 / val_10bit - 1)) / BETA + 1.0 / T0) - K_TO_C
return round(celsius, 2)
def leer_lux_interior():
"""Lee la luminosidad interior en lux"""
raw_value = lux_sensor.read_u16()
val_10bit = raw_value >> 6
voltage = val_10bit / 1024.0 * 5.0
resistance = 2000 * voltage / (1 - voltage / 5.0)
lux = math.pow(RL10 * 1000 * math.pow(10, GAMMA) / resistance, (1 / GAMMA))
return round(lux, 2)
def leer_lux_exterior():
"""Lee la luminosidad exterior en lux"""
raw_value = lux_exterior.read_u16()
val_10bit = raw_value >> 6
voltage = val_10bit / 1024.0 * 5.0
resistance = 2000 * voltage / (1 - voltage / 5.0)
lux = math.pow(RL10 * 1000 * math.pow(10, GAMMA) / resistance, (1 / GAMMA))
return round(lux, 2)
def leer_distancia():
"""Lee la distancia del sensor ultrasónico en cm"""
# Generar pulso de trigger
ultrasonic_trigger.low()
time.sleep_us(2)
ultrasonic_trigger.high()
time.sleep_us(10)
ultrasonic_trigger.low()
# Medir el tiempo de eco
while ultrasonic_echo.value() == 0:
pass
start_time = time.ticks_us()
while ultrasonic_echo.value() == 1:
pass
end_time = time.ticks_us()
# Calcular distancia en cm
duracion = time.ticks_diff(end_time, start_time)
distancia = (duracion * 0.0343) / 2
return round(distancia, 1)
def controlar_servo(servo, angulo):
"""Controla un servo en el ángulo especificado"""
duty_us = 1000 + (angulo * 1000 // 180)
duty_ns = duty_us * 1000
servo.duty_ns(duty_ns)
time.sleep(0.5)
def abrir_cortinas():
"""Abre las cortinas completamente"""
global cortina_abierta
if not cortina_abierta:
print("Abriendo cortinas...")
controlar_servo(servo_cortinas, 180)
cortina_abierta = True
print("Cortinas abiertas")
def cerrar_cortinas():
"""Cierra las cortinas completamente"""
global cortina_abierta
if cortina_abierta:
print("Cerrando cortinas...")
controlar_servo(servo_cortinas, 0)
cortina_abierta = False
print("Cortinas cerradas")
def abrir_puerta():
"""Abre la puerta completamente"""
global puerta_abierta
if not puerta_abierta:
print("Abriendo puerta...")
controlar_servo(servo_puerta, 90) # 90° para puerta abierta
puerta_abierta = True
print("Puerta abierta")
def cerrar_puerta():
"""Cierra la puerta completamente"""
global puerta_abierta
if puerta_abierta:
print("Cerrando puerta...")
controlar_servo(servo_puerta, 0) # 0° para puerta cerrada
puerta_abierta = False
print("Puerta cerrada")
def controlar_cortinas_automatico(luminosidad):
"""Controla las cortinas basado en la luminosidad exterior"""
print(f"Luminosidad exterior: {luminosidad} lux")
if luminosidad < UMBRAL_OSCURO:
print("Está oscuro - Cerrando cortinas")
cerrar_cortinas()
else:
print("Está luminoso - Abriendo cortinas")
abrir_cortinas()
def controlar_puerta_automatico(distancia):
"""Controla la puerta basado en la distancia del sensor ultrasónico"""
print(f"Distancia: {distancia} cm")
if distancia < DISTANCIA_APERTURA:
print("Persona detectada - Abriendo puerta")
abrir_puerta()
else:
print("Nadie detectado - Cerrando puerta")
cerrar_puerta()
# Programa principal
print("Sistema de Control Domótico Iniciado")
print("====================================")
print(f"Umbral cortinas: {UMBRAL_OSCURO} lux")
print(f"Distancia puerta: {DISTANCIA_APERTURA} cm")
print("-" * 50)
try:
while True:
# Leer todos los sensores
temperatura = leer_temperatura()
lux_int = leer_lux_interior()
lux_ext = leer_lux_exterior()
presencia = pir_sensor.value()
distancia = leer_distancia()
# Mostrar lecturas
print("\n" + "-" * 50)
print(f"Temperatura: {temperatura}°C")
print(f"Luz interior: {lux_int} lux")
print(f"Luz exterior: {lux_ext} lux")
print(f"Presencia: {'Sí' if presencia else 'No'}")
print(f"Distancia: {distancia} cm")
print(f"Cortinas: {'Abiertas' if cortina_abierta else 'Cerradas'}")
print(f"Puerta: {'Abierta' if puerta_abierta else 'Cerrada'}")
print("-" * 50)
# Control de temperatura
if temperatura < TEMP_MIN or temperatura > TEMP_MAX:
led_temp_alerta.value(1)
print("Alerta de temperatura!")
else:
led_temp_alerta.value(0)
# Control de luminosidad interior
if lux_int < LUX_MIN or lux_int > LUX_MAX:
led_lux_alerta.value(1)
print("Alerta de luminosidad!")
else:
led_lux_alerta.value(0)
# Control de luz interior (con presencia)
if presencia and lux_int < LUX_MIN:
led_luz_interior.value(1)
print("Luz interior encendida")
else:
led_luz_interior.value(0)
# Control automático de cortinas
controlar_cortinas_automatico(lux_ext)
# Control automático de puerta
controlar_puerta_automatico(distancia)
# Esperar 2 segundos antes de la siguiente lectura
time.sleep(2)
except KeyboardInterrupt:
print("\nSistema detenido por el usuario")
Sensor de temperatura
Sensor de presencia
Sensor de luz interior
Sensor de luz exterior
Servo - apertura cortinas
Servo - apertura puerta
Sensor ultrasónico acercamiento
led - temperatura fuera rango
led - luz interior fuera rango
luz detección persona