# Proyecto María Teresa Mora II Cuatrimestre 2025.
# Asistente tecnológico para personas discapacitadas.
# Aquí importamos las librerías
from machine import Pin, I2C, PWM, ADC
from time import sleep
import dht
from neopixel import NeoPixel
from i2c_lcd import I2cLcd
from hcsr04 import HCSR04
from servo import Servo
# 2 Clases creadas (Clase neopixels para las luces y buzzer para la alarma sonora)
from neopixels import Neopixels
from buzzer import Buzzer
#-------------- Instancias de las clases de los objetos a utilizar -------------------
piezo = Buzzer(pin=18) # Zumbador para emitir sonido
sensor = dht.DHT22(Pin(15)) # Sensor de temperatura/humedad
Ultra = HCSR04(13, 12, 10000) # Sensor ultrasónico mide distancias
potenciometro = ADC(Pin(14)) # Potenciómetro
luces = Neopixels(pin=0, num_pixels=3) # Instancia para la clase creada
Address_LCD = 0x27 # Dirección de pantalla LCD.
i2c = I2C(scl=Pin(22), sda=Pin(21), freq=400000) # Configuración del bus I2C
lcd = I2cLcd(i2c, Address_LCD, 2, 16) # Pantalla de 2 filas y 16 columnas
# Instancia del servomotor
servo_pin = Pin(4) # Pin asociado al servo
my_servo = Servo(servo_pin)
#----------------------------------------------------------------------------------------------
# Métodos del "Sistema de monitoreo para la Asistencia de personas discapacitadas"
def Leer_Temp():
"""Método 1 para medir la temperatura desde el sensor DHT22"""
sensor.measure()
return int(sensor.temperature())
def Leer_Hum():
"""Método 2 para medir la humedad desde el sensor DHT22"""
sensor.measure()
return int(sensor.humidity())
def Leer_Dist():
"""Método 3 para medir la distancia desde el sensor HCSR04 (Sensor ultrasónico)"""
return int(Ultra.distance_cm())
def Mapear_Angulo_Potenci(value):
"""Método 4 que calcula el valor del potenciómetro de 0 a 4095 a un rango de 0 a 90 grados"""
return int(value * 90 / 4095)
#_______________________________________________________________________________________________
# Código principal del proyecto
while True:
try:
# Lecturas de sensores por llamado a 3 funciones.
temp = Leer_Temp()
hum = Leer_Hum()
dist = Leer_Dist()
# Limpiar pantalla
lcd.clear()
lcd.display_on()
lcd.backlight_on()
# Línea 1: Mostrar temperatura y humedad
lcd.move_to(0, 0)
lcd.putstr("Tem:{}C Hum:{} %".format(temp, hum))
# Línea 2: Mostrar distancia
lcd.move_to(4, 1)
lcd.putstr("Dist:{} cm".format(dist))
# Pausa para lectura inicial
sleep(2)
# Comprobaciones y advertencias
if temp > 35:
lcd.clear()
lcd.move_to(2, 0)
lcd.putstr("Temp ALTA!")
lcd.move_to(1, 1)
lcd.putstr("Ventilador ON")
my_servo.write_angle(90) # Modo automático: abre totalmente la rejilla
piezo.sonar_intermitente(veces=4) # Emite 4 pitidos
sleep(2)
else:
# Funciona solo para temperaturas frías o regulares.
piezo.detener() # Detiene la alarma sonora si no hay temperaturas calientes.
# Modo manual: controlar rejilla de ventilación con potenciómetro cuando no está caliente (si el usuario lo desea)
pot_val = potenciometro.read() # Valor entre 0 y 4095
angulo = Mapear_Angulo_Potenci(pot_val) # Convierte a 0–90 grados a través de la función 4.
my_servo.write_angle(angulo) # Coloca la posición de la perilla según el angulo.
if hum > 60: # Avisar que va a llover y que debe de abrigarse.
lcd.clear()
lcd.move_to(1, 0)
lcd.putstr("Humedad ALTA!")
lcd.move_to(2, 1)
lcd.putstr("Abriguese..")
sleep(2)
if dist <= 100: # Advertencia para avisar del avistamiento de personas a 1 metro o menos de distancia.
lcd.clear()
lcd.move_to(2, 0)
lcd.putstr("Persona Aprox")
lcd.move_to(0, 1)
lcd.putstr("a {}cm de puerta".format(dist))
luces.encender_secuencial() # Encendido secuencial de 6 luces neopixels
sleep(1)
else:
luces.apagar_todos() # Apaga los Neopixels si ya no hay nadie cerca de la puerta
except Exception as e:
lcd.clear()
lcd.putstr("Error de sensor")
print("Error:", e)
sleep(2)