# Proyecto Angie (02199) III cuatrimestre 2024
from machine import Pin, I2C, ADC, PWM
from neopixel import NeoPixel
from servo import Servo
from hcsr04 import HCSR04
from i2c_lcd import I2cLcd
import dht
from time import sleep
# Configuración del buzzer
buzzer = PWM(Pin(18))
# Configuración del sensor DHT22 (Temperatura y Humedad)
sensor_dht = dht.DHT22(Pin(15))
# Configuración del LCD I2C
Address_LCD = 0x27 # Dirección de pantalla LCD.
i2c = I2C(0, scl=Pin(22), sda=Pin(21))
lcd = I2cLcd(i2c, Address_LCD, 2, 16)
# Configuración del Servo Motor
servo_pin = Pin(16)
my_servo = Servo(servo_pin)
# Configuración del Sensor Ultrasónico
sensor_ultrasonico = HCSR04(13, 12, 10000)
# Configuración de los Neopixels
np = NeoPixel(Pin(17), 3)
# Configuración del Potenciómetro
pot = ADC(Pin(14))
pot.atten(ADC.ATTN_11DB)
# Configuración del Botón Pulsador
button = Pin(5, Pin.IN, Pin.PULL_UP)
# Funciones del sistema
# Ajusta el tono del sonido de alarma con potenciometro.
def ajustar_frecuencia_buzzer():
# Leer el valor del potenciómetro (de 0 a 4095)
valor_pot = pot.read()
# Mapea el valor de 0-4095 a un rango de frecuencias adecuado para el buzzer
# Suponiendo que quieres una frecuencia entre 500Hz y 5000Hz
frecuencia = 500 + (valor_pot / 4095) * (5000 - 500)
return int(frecuencia)
def controlar_buzzer(activar):
# Activa o desactiva el sonido del buzzer.
if activar:
# Ajusta la frecuencia según el valor del potenciómetro
frecuencia = ajustar_frecuencia_buzzer()
buzzer.freq(frecuencia) # Cambia la frecuencia del buzzer
buzzer.duty_u16(32768) # 50% de ciclo de trabajo para generar sonido
else:
buzzer.duty_u16(0) # Apaga el sonido
def leer_dht22():
sensor_dht.measure()
temp = sensor_dht.temperature()
hum = sensor_dht.humidity()
print(f"Temperatura: {temp}°C, Humedad: {hum}%")
return temp, hum
def ajustar_ventilacion(temp):
if temp > 30: # Umbral de temperatura para ventilación
my_servo.write_angle(90) # Abre la ventilación
print("\nAbriendo ventilacion...")
else:
my_servo.write_angle(0) # Cierra la ventilación
def detectar_intruso():
try:
distancia = sensor_ultrasonico.distance_cm()
print(f"Distancia detectada: {distancia:.2f} cm")
return distancia < 50 # Activar alerta si hay un objeto a menos de 50 cm
except OSError as e:
print("Error leyendo el sensor ultrasónico:", e)
return False
def cambiar_estado_luces(temp, intruso):
if intruso:
distancia = sensor_ultrasonico.distance_cm()
np[0] = (255, 0, 0) # Rojo - Intruso detectado
np[1] = (0, 0, 0) # Apagar el segundo Neopixel
np[2] = (0, 0, 0) # Apagar el tercer Neopixel
lcd.clear()
lcd.backlight_on()
lcd.move_to(0, 0)
lcd.putstr("Person detectada")
lcd.move_to(0, 1)
lcd.putstr("Dist: "+str(distancia))
controlar_buzzer(True) # Apaga el buzzer
print("\nAcercandose a: "+str(distancia) + " cm")
elif temp > 30:
np[0] = (0, 0, 0) # Apagar el primer Neopixel
np[1] = (255, 255, 0) # Amarillo - Alta temperatura
np[2] = (0, 0, 0) # Apagar el tercer Neopixel
lcd.clear()
lcd.backlight_on()
lcd.move_to(2, 0)
lcd.putstr("Temp: " +str(temp))
lcd.move_to(0, 1)
lcd.putstr("Alta temperatura")
controlar_buzzer(False) # Apaga el buzzer
else:
np.fill((0, 255, 0)) # Verde - Condiciones seguras todos en verde
lcd.clear()
lcd.backlight_on()
lcd.move_to(0, 0)
lcd.putstr("Estado seguro")
lcd.move_to(4, 1)
lcd.putstr("Normal")
controlar_buzzer(False) # Apaga el buzzer
np.write()
def activar_sistema():
temp, hum = leer_dht22()
intruso = detectar_intruso()
ajustar_ventilacion(temp)
cambiar_estado_luces(temp, intruso)
# Mostrar en la LCD (implementación dependerá de la librería en uso)
# Estado del sistema
sistema_encendido = False # Inicia apagado
# Bucle principal
while True:
if button.value() == 0: # Botón presionado
sleep(0.2) # Debounce
sistema_encendido = not sistema_encendido # Cambiar estado del sistema
if not sistema_encendido: # Si se apaga el sistema
lcd.clear()
lcd.display_on()
lcd.backlight_off()
lcd.move_to(1, 0)
lcd.putstr("-- Sistema --")
lcd.move_to(4, 1)
lcd.putstr("Apagado")
np.fill((0, 0, 0)) # Apagar luces
np.write()
my_servo.write_angle(0) # Apagar ventilación
controlar_buzzer(False)
if sistema_encendido:
activar_sistema()
sleep(1) # Actualizar cada segundo