from machine import ADC, Pin, PWM
from math import log, pow
import utime
# Configuración de pines
led_temp = Pin(15, Pin.OUT)
led_luz_movimiento = Pin(14, Pin.OUT)
led_luz_interior = Pin(17, Pin.OUT)
sensor_temp = ADC(Pin(26))
sensor_luz_int = ADC(Pin(28))
sensor_luz_ext = ADC(Pin(27))
pir = Pin(16, Pin.IN)
servo_cortina = PWM(Pin(18))
servo_puerta = PWM(Pin(19))
disparador = Pin(20, Pin.OUT)
echo = Pin(21, Pin.IN)
# Configuración de servomotores
servo_cortina.freq(50)
servo_puerta.freq(50)
# Constantes
TEMP_UMBRAL = 25.00 # Temperatura en grados Celsius
LUZ_UMBRAL = 500 # Umbral de luz en lux
DISTANCIA_ACTIVACION = 50 # Distancia apertura puerta en cm
GAMMA = 0.7
RL10 = 50
Rfijo = 10000
def leer_temperatura():
voltaje_temp = sensor_temp.read_u16()*(3.3/65535)
resistencia = (3.3 - voltaje_temp) / voltaje_temp * 10000
temperatura = 1 / (1 / 298.15 + 1 / 3950 * log(10000 / resistencia)) - 273.15
return temperatura
def leer_resistencialuzinterna():
valoradcint = sensor_luz_int.read_u16()
voltaje_luzint = valoradcint / 65535 * 3.3
if voltaje_luzint == 0:
return float('inf')
else:
return Rfijo * (voltaje_luzint / (3.3 - voltaje_luzint))
def entregarluxint(resistenciaint):
luxint = pow (RL10 / resistenciaint, (1 / GAMMA) )*10;
return luxint
def leerluxint():
resistenciaint = leer_resistencialuzinterna()
return entregarluxint (resistenciaint)
def leer_resistencialuzexterna():
valoradcext = sensor_luz_ext.read_u16()
voltaje_luzext = valoradcext / 65535 * 3.3
if voltaje_luzext == 0:
return float('inf')
else:
return Rfijo * (voltaje_luzext / (3.3 - voltaje_luzext))
def entregarluxext(resistenciaext):
luxext = pow (RL10 / resistenciaext, (1 / GAMMA) )*10;
return luxext
def leerluxext():
resistenciaext = leer_resistencialuzexterna()
return entregarluxext (resistenciaext)
def mover_servo(servo, angulo):
duty = int(angulo*(7800-1950)/180+1950)
servo.duty_u16(duty)
def medir_distancia():
disparador.low()
utime.sleep_us(2)
disparador.high()
utime.sleep_us(5)
disparador.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
return distancia
while True:
#Monitoreo de temperatura
temp = leer_temperatura()
if temp > TEMP_UMBRAL:
led_temp.value(1) # Enciende led rojo si T > 25 °C
else:
led_temp.value(0) # Apaga led rojo si T < 25°C
# Monitoreo de luz
luz_interior = leerluxint()
if luz_interior < LUZ_UMBRAL:
led_luz_interior.value(1) # Enciende led interior si nivel de luz interior no es óptimo
else:
led_luz_interior.value(0) # Apaga led interior si nivel de luz interior es adecuado
led_luz_movimiento.value(luz_interior < LUZ_UMBRAL)
# Control de luces interiores
if pir.value():
led_luz_movimiento.on()
else:
led_luz_movimiento.off()
# Control de cortinas
luz_exterior = leerluxext()
if luz_exterior > LUZ_UMBRAL and luz_interior < LUZ_UMBRAL:
mover_servo(servo_cortina, 0) # Abrir cortinas
elif luz_exterior < LUZ_UMBRAL:
mover_servo(servo_cortina, 90) # Cerrar cortinas
# Control de puerta
distancia = medir_distancia()
if distancia < DISTANCIA_ACTIVACION:
mover_servo(servo_puerta, 90) # Abrir puerta
else:
mover_servo(servo_puerta, 0) # Cerrar puerta
print(f"Temperatura: {temp:.2f}°C", f"Luz Interior: {luz_interior}", f"PIR Value: {pir.value()}", f"Distancia: {distancia:.2f} cm")
utime.sleep(0.1) # Pequeña pausa para evitar sobrecarga del sistema