from machine import ADC, Pin, PWM, time_pulse_us
import time
import utime
import math
# Definición de pines para sensor de intensidad luminica interna
ldr_interna = ADC(27) # Sensor LDR conectado a GP27
led_luz = Pin(17, Pin.OUT) # LED conectado a GP17
# Definición de pines para sensor de temperatura interna
ntc = ADC(28) # Sensor NTC conectado a GP28
led_tem = Pin(1, Pin.OUT) # LED conectado a GP1
# Definición de pines para sensor de movimiento
pin_sensor = Pin(20, Pin.IN) # Sensor de movimiento PIR (Passive Infrared) conectado a GP20
led_mov = Pin(2, Pin.OUT) # LED conectado a GP2
# Definición de pines para activar servomotor de cortinas segun señal de intensidad luminica externa
ldr_externa = ADC(26) # Sensor LDR conectado a GP26
servo_vent = PWM(Pin(16)) # Señal del servomotor conectada a GP16
servo_vent.freq(50) # Frecuencia estandar de servomotor
# Definición de pines para activar servomotor de puerta segun señal de proximidad
PIN_TRIG = Pin(22, Pin.OUT) # Señal TRIG conectada a GP22
PIN_ECHO = Pin(21, Pin.IN) # Señal ECHO conectada a GP21
servo = PWM(Pin(19)) # Señal del servomotor conectada a GP19
servo.freq(50) # Frecuencia estandar de servomotor
# Definición depin para bocina segun sensor de movimeinto
buzzer_pin = Pin(18, Pin.OUT) # Bocina conectada a GP18
# Asignación de valores constantes utilizadas
VREF = 3.3 # Voltaje Raspberry Pi Pico
ADC_RESOLUTION = 65535 #Parametro de conversion para señal de NTC
NTC_BETA = 3950 #Parametro de conversion para señal de NTC
T0 = 298.15 # 25°C en Kelvin
R0 = 10000 # Resistencia NTC a 25 °C (10k ohms)
R_SERIE = 10000 # Resistencia el NTC (10k ohms)
TEMP_UMBRAL = 30 # Umbral de temperatura para encender el LED (°C)
LUZ_UMBRAL_INTERNA = 50 # Umbral de luz para encender el LED
# DEFINICIÓN DE FUNCIONES
def setup():
# Configuración inicial
PIN_TRIG.off()
time.sleep(2)
def tone(frequency, duration, volume):
for i in range(int(duration * frequency)):
# Ajustar el ciclo de trabajo según el volumen (0-255)
buzzer_pin.value(int(volume/255))
time.sleep(1 / (frequency * 2))
buzzer_pin.value(0)
time.sleep(1 / (frequency * 2))
def distance():
# Iniciar una nueva medición
PIN_TRIG.on()
time.sleep_us(10)
PIN_TRIG.off()
# Leer el resultado
duration = time_pulse_us(PIN_ECHO, 1)
distance_cm = duration / 59.0
return distance_cm
def set_servo_angle(angle):
# Configurar el ángulo del servomotor usando duty_u16
duty = int((angle / 180) * 65535 / 20 + 3276.5)
servo.duty_u16(duty)
def set_servo_vent_angle(angle):
# Configurar el ángulo del servomotor usando duty_u16
duty_vent = int((angle / 180) * 65535 / 20 + 3276.5)
servo_vent.duty_u16(duty_vent)
def leer_temperatura_ntc():
"""Lee la temperatura del sensor NTC en grados Celsius."""
valor_adc = ntc.read_u16()
# Evitar división por cero en caso de voltaje cercano a VREF
if valor_adc == 0 or valor_adc == ADC_RESOLUTION:
return None # Indica un error de lectura
voltaje = (valor_adc / ADC_RESOLUTION) * VREF
resistencia_ntc = R_SERIE * (voltaje / (VREF - voltaje))
# Calcular la temperatura en Kelvin usando la ecuación Beta
temp_k = 1 / ((1 / T0) + (1 / NTC_BETA) * math.log(resistencia_ntc / R0))
temp_c = temp_k - 273.15 # Convertir a grados Celsius
return temp_c
def leer_luz_ldr_interna():
"""Lee la intensidad lumínica del sensor LDR como un porcentaje."""
valor_adc = ldr_interna.read_u16()
porcentaje_luz_interna = (valor_adc / ADC_RESOLUTION) * 100
return porcentaje_luz_interna
def leer_luz_ldr_externa():
"""Lee la intensidad lumínica del sensor LDR como un porcentaje."""
valor_adc = ldr_externa.read_u16()
porcentaje_luz_externa = (valor_adc / ADC_RESOLUTION) * 100
return porcentaje_luz_externa
# Bucle principal
try:
while True:
temperatura = leer_temperatura_ntc()
luz_interna = leer_luz_ldr_interna()
luz_externa = leer_luz_ldr_externa()
dist = distance()
# Control del LED LUZ INTERNA segun señal de LDR
if luz_interna >= LUZ_UMBRAL_INTERNA:
led_luz.value(1) # Encender LED
else:
led_luz.value(0) # Apagar LED
# Control del LED TEMPERATURA
if (temperatura is not None and temperatura > TEMP_UMBRAL):
led_tem.value(1) # Encender LED
else:
led_tem.value(0) # Apagar LED
# Impresión de temperatura entregada por sensor NTC
if temperatura is not None:
print(f"Temperatura: {temperatura:.1f} °C")
else:
print("Error al leer la temperatura del NTC.")
# Impresión de intensidad luminica interna en % segun señal LDR
print(f"Intensidad lumínica interna: {luz_interna:.2f} %")
# Control del LED MOVIMIENTO segun señal de sensor PIR
if pin_sensor.value() == 1:
# Sensor detecta movimiento, enciende el LED
led_mov.value(1) # Encender LED
tone(100, 1, 255) # Reproducir un tono de 440 Hz durante 1 segundo al 100% del volumen
time.sleep(5) # Mantén el LED encendido por 5 segundos
else:
# No hay movimiento, apaga el LED
led_mov.value(0)
# Controlar el servomotor de la puerta basado en la distancia medida
if dist > 100 : # Servo motor entra en funcionamiento
set_servo_angle(90) # Cerrar puerta
print(f"Distancia:{dist:.2f} cm, Puerta Cerrada")
else:
set_servo_angle(-90) # Abrir la puerta
print(f"Distancia:{dist:.2f} cm, Puerta Abierta")
# Controlar el servomotor de la cortina basado en la luz medida
if luz_externa > 30 : # Servo motor entra en funcionamiento
set_servo_vent_angle(90) # Cortina abierta
print(f"Intensidad lumínica externa:{luz_externa:.2f} %, Cortina Abierta")
else:
set_servo_vent_angle(-90) # Cortina cerrada
print(f"Intensidad lumínica externa:{luz_externa:.2f} %, Cortina Cerrada")
print("\n")
time.sleep(1)
except KeyboardInterrupt:
print("Programa detenido")