from machine import Pin, ADC, PWM
import time
import math
# Configuración de pines
ntc_temp = ADC(Pin(28)) # Sensor de temperatura
ldr_luz_int = ADC(Pin(27)) # Sensor de luz interior
ldr_luz_ext = ADC(Pin(26)) # Sensor de luz exterior
led_temp = Pin(15, Pin.OUT) # LED de alerta de temperatura
led_luz_int = Pin(14, Pin.OUT) # LED de alerta de luz interior
servo_cortina = PWM(Pin(22), freq=50) # Servo para cortinas
servo_puerta = PWM(Pin(2), freq=50) # Servo para la puerta
sensor_prox = Pin(21, Pin.IN) # Sensor de proximidad PIR
led_luz_prox = Pin(13, Pin.OUT) # LED de proximidad
trig = Pin(19, Pin.OUT) # Trigger del sensor ultrasónico
eco = Pin(18, Pin.IN) # Echo del sensor ultrasónico
# Parámetros de control
parametro_temp_min = 20
parametro_temp_max = 30
parametro_luz_int = 450
parametro_luz_ext = 600
parametro_dist_pue = 100
# Función para leer la temperatura
def temp_interior():
valor_adc_ntc = ntc_temp.read_u16()
BETA = 3950
temperatura = 1 / (math.log(1 / (65535 / valor_adc_ntc - 1)) / BETA + 1.0 / 298.15) - 273.15
return temperatura
# Función para leer luz interior
def luz_interior():
GAMA = 0.7
RL10 = 50
valor_adc_luz = ldr_luz_int.read_u16()
voltaje = valor_adc_luz / 65535 * 3.3
resistencia = 2000 * (3.3 - voltaje) / voltaje
luz = math.pow(RL10 * 1e3 / resistencia, 1 / GAMA)
return luz
# Función para leer luz exterior
def luz_exterior():
GAMA = 0.7
RL10 = 50
valor_adc_luz = ldr_luz_ext.read_u16()
voltaje = valor_adc_luz / 65535 * 3.3
resistencia = 2000 * (3.3 - voltaje) / voltaje
luz_e = math.pow(RL10 * 1e3 / resistencia, 1 / GAMA)
return luz_e
# Función para controlar servos
def movimiento_servo(angulo, servo):
max_deber = 7864
min_deber = 1802
deber = min_deber + (max_deber - min_deber) * (angulo / 180)
servo.duty_u16(int(deber))
# Función para medir distancia con sensor ultrasónico
def distancia_sensor():
trig.value(0)
time.sleep_us(2)
trig.value(1)
time.sleep_us(10)
trig.value(0)
while eco.value() == 0:
inicio = time.ticks_us()
while eco.value() == 1:
final = time.ticks_us()
duracion = time.ticks_diff(final, inicio)
distancia = (duracion * 0.0343) / 2
return distancia
# Función para abrir y cerrar la puerta
def apertura_puerta():
if distancia_sensor() < parametro_dist_pue:
movimiento_servo(180, servo_puerta) # Abrir la puerta
else:
movimiento_servo(90, servo_puerta) # Cerrar la puerta
# Función para detectar movimiento con PIR
def sensor_movimiento():
if sensor_prox.value() == 1: # Detecta presencia
led_luz_prox.value(1) # Encender LED de proximidad
else:
led_luz_prox.value(0)
# Función para abrir/cerrar cortinas según luz exterior
def apertura_cortinas():
if luz_exterior() > parametro_luz_ext:
movimiento_servo(0, servo_cortina) # Abrir cortinas
else:
movimiento_servo(180, servo_cortina) # Cerrar cortinas
# Función para encender LEDs de alerta
def encendido_led():
if temp_interior() < parametro_temp_min or temp_interior() > parametro_temp_max:
led_temp.value(1) # Encender LED de alerta de temperatura
else:
led_temp.value(0)
if luz_interior() < parametro_luz_int:
led_luz_int.value(1) # Encender LED de alerta de luz baja
else:
led_luz_int.value(0)
# Bucle principal
while True:
dist = distancia_sensor()
apertura_puerta()
sensor_movimiento()
apertura_cortinas()
temp = temp_interior()
luz_int = luz_interior()
luz_ext = luz_exterior()
encendido_led()
# Imprimir valores de sensores con formato claro y legible
print(f"Temperatura: {temp:.2f}°C, Luz Interior: {luz_int:.2f}, Luz Exterior: {luz_ext:.2f}, Distancia: {dist:.2f} cm")
time.sleep(2) # Aumentar el tiempo de espera entre impresiones