import machine
import utime
import math
from machine import Pin, PWM, ADC
# Definición de pines
PIN_TEMP = 26 # ADC0
PIN_LUZ_INT = 27 # ADC1
PIN_LUZ_EXT = 28 # ADC2
PIN_PIR = 16
PIN_LED_TEMP = 14
PIN_LED_LUZ = 15
PIN_LUZ_INTERIOR = 13
PIN_SERVO_PUERTA = 12
PIN_SERVO_CORTINA = 11
PIN_TRIG = 18
PIN_ECHO = 19
# Rangos aceptables
TEMP_MIN = 18.0
TEMP_MAX = 25.0
LUZ_INT_MIN = 450
LUZ_INT_MAX = 500
LUZ_EXT_SUFICIENTE = 600
# Configuración de pines
temp_sensor = ADC(Pin(PIN_TEMP))
luz_int_sensor = ADC(Pin(PIN_LUZ_INT))
luz_ext_sensor = ADC(Pin(PIN_LUZ_EXT))
pir = Pin(PIN_PIR, Pin.IN)
led_temp = Pin(PIN_LED_TEMP, Pin.OUT)
led_luz = Pin(PIN_LED_LUZ, Pin.OUT)
luz_interior = Pin(PIN_LUZ_INTERIOR, Pin.OUT)
servo_puerta = PWM(Pin(PIN_SERVO_PUERTA))
servo_cortina = PWM(Pin(PIN_SERVO_CORTINA))
trigger = Pin(PIN_TRIG, Pin.OUT)
echo = Pin(PIN_ECHO, Pin.IN)
GAMMA=0.7
RL10=50
BETA=3950
max_duty=7864
min_duty=1802
# Configuración del servo
servo_puerta.freq(50)
servo_cortina.freq(50)
# Bucle principal
while True:
# 1. Monitoreo de temperatura
valor_temp = temp_sensor.read_u16()
voltaje_temp = (valor_temp / 65535) * 3.3
temperatura=1/(math.log(1/(65535./valor_temp-1))/BETA+1.0/298.15)-273.15
#R de euler, tiene valor de 2,71828
# Alerta de temperatura
if temperatura < TEMP_MIN or temperatura > TEMP_MAX:
led_temp.value(1)
else:
led_temp.value(0)
# 2. Monitoreo de luz interior
nivel_luz_int = luz_int_sensor.read_u16()
voltaje_int=nivel_luz_int/65535*3.3
resistencia_int=2000*voltaje_int/(3.3-voltaje_int)
nivel_luz_int=pow(RL10*1e3/resistencia_int,(1/GAMMA))
# Alerta de luz interior
if nivel_luz_int < LUZ_INT_MIN or nivel_luz_int > LUZ_INT_MAX:
led_luz.value(1)
else:
led_luz.value(0)
# 3. Control de luces interiores basado en presencia
if pir.value():
luz_interior.value(1)
else:
luz_interior.value(0)
# 4. Control de cortinas basado en luz exterior
nivel_luz_ext = luz_ext_sensor.read_u16()
voltaje_ext=nivel_luz_ext/65535*3.3
resistencia_ext=2000*voltaje_ext/(3.3-voltaje_ext)
nivel_luz_ext=pow(RL10*1e3/resistencia_ext,(1/GAMMA))
if nivel_luz_ext > LUZ_EXT_SUFICIENTE:
duty=min_duty+(max_duty-min_duty)*(0/180)# Mapeo de ángulo a duty cycle
servo_cortina.duty_u16(int(duty)) # cerrar cortina
print("Luz exterior suficiente, cerrando cortinas")
else:
duty=min_duty+(max_duty-min_duty)*(180/180)# Mapeo de ángulo a duty cycle
servo_cortina.duty_u16(int(duty)) # Abrir cortinas
print("Luz exterior insuficiente, abriendo cortinas")
# 5. Control de puerta
# Medir distancia con sensor ultrasónico
trigger.low()
utime.sleep_us(2)
trigger.high()
utime.sleep_us(5)
trigger.low()
while echo.value() == 0:
signaloff = utime.ticks_us()
while echo.value() == 1:
signalon = utime.ticks_us()
timepassed = signalon - signaloff
distancia = (timepassed * 0.0343) / 2
# Controlar servo de la puerta
if distancia < 100: # Si alguien está a menos de 1 metro
duty=min_duty+(max_duty-min_duty)*(90/180)# Mapeo de ángulo a duty cycle
servo_puerta.duty_u16(int(duty)) # Abrir puerta
print("Persona detectada, abriendo puerta")
else:
duty=min_duty+(max_duty-min_duty)*(0/180)# Mapeo de ángulo a duty cycle
servo_puerta.duty_u16(int(duty)) # Cerrar puerta
print("Nadie cerca, cerrando puerta")
# Imprimir datos para debug
print(f"Temperatura: {temperatura:.2f}°C - Luz Interior: {nivel_luz_int} - Luz Exterior: {nivel_luz_ext} - Distancia: {distancia:.2f}cm")
utime.sleep(1) # Pausa para estabilidad y lectura de datos