# Proyecto Emmanuel Picado Mata 2024.
# Sistema de riego automatizado.
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
from lucesAlarma import LucesAlarma # Importar la clase LucesAlarma
from sonidoAlarma import SonidoAlarma # Importar la clase SonidoAlarma
# Instancia de objetos a utilizar, con la declaración de sus pines
boton = Pin(2, Pin.IN) # Botón
Buzzer = SonidoAlarma(pin=18) # Zumbador
sensor = dht.DHT22(Pin(15)) # Sensor de temperatura/humedad
Ultra = HCSR04(13, 12, 10000) # Sensor ultrasónico
potenciometro = ADC(Pin(14)) # Potenciómetro
neopixels = LucesAlarma(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)
# Variable global para el ángulo
angle = 0
#-----------------------------------------------------------------------
# Función para capturar mediciones de temperatura
def leer_temperatura():
sensor.measure()
return int(sensor.temperature())
# Función para capturar mediciones de humedad
def leer_humedad():
sensor.measure()
return int(sensor.humidity())
# Función para sensor ultrasónico que mide en centímetros
def leer_distancia():
return int(Ultra.distance_cm())
# Mapea el valor del potenciómetro de 0 a 4095 a un rango de 0 a 90 grados
def mapear_pot_angulo(value):
return int(value * 90 / 4095)
# Procedimiento para manejar el control del sistema de riego
def EvaluarCondicionesAmbiente(temp, hum, distancia_redondeada):
global angle # Variable global para conocer el ángulo del servomotor
# Si la temperatura es muy caliente y la humedad es muy baja
if temp >= 25 and hum < 100:
print("Alerta!!!")
lcd.display_on()
lcd.backlight_on()
lcd.clear()
lcd.move_to(2, 0)
lcd.putstr("Temp Maxima")
lcd.move_to(2, 1)
lcd.putstr("Humedad baja")
Buzzer.activar_alarma() # Activa los cuatro pitidos de alarma
neopixels.encender_apagar_secuencial() #Llamar a método de la clase creada.
if angle == 0:
lcd.move_to(2, 1)
lcd.putstr("Abrir llave")
print("Abrir llave agua")
else:
lcd.move_to(2, 1)
lcd.putstr("Regando.....")
print("Regando plantas")
# Si la humedad esta al 100% y la llave esta abierta
elif hum == 100 and angle == 90:
print("Humedad al maximo, cerrar llave de agua")
Buzzer.detener_alarma()
lcd.display_on()
lcd.backlight_on()
lcd.clear()
lcd.move_to(2, 0)
lcd.putstr("Humedad Max")
lcd.move_to(2, 1)
lcd.putstr("Cerrar llave")
# si la temperatura es alta pero se ha completado el riego al 100%.
elif temp > 25 and hum == 100:
print("Temperatura caliente / Plantas humedecidas..")
Buzzer.detener_alarma()
neopixels.estado_normal_todos_azul()
lcd.display_on()
lcd.backlight_on()
lcd.clear()
lcd.move_to(0, 0)
lcd.putstr("Humedad Completa")
if angle == 90:
lcd.move_to(2, 1)
lcd.putstr("Cierra llave")
print("Cierra llave")
else:
lcd.move_to(2, 1)
lcd.putstr("No abrir agua")
print("No abrir agua")
# Si la tempertaura es baja se considera normal menor a 25 grados
elif temp < 25:
print("Temperatura normal")
Buzzer.detener_alarma()
neopixels.estado_normal_todos_azul()
lcd.display_on()
lcd.backlight_on()
lcd.clear()
lcd.move_to(2, 0)
lcd.putstr("Temp Normal")
if angle == 90:
lcd.move_to(2, 1)
lcd.putstr("Cierra llave")
print("Cierra llave")
else:
lcd.move_to(2, 1)
lcd.putstr("No abrir agua")
print("No abrir agua")
while True:
lcd.clear() # Limpia el texto para evitar rastros al actualizar datos
print("Sistema encendido")
# Llamada a funciones
hum = leer_humedad()
temp = leer_temperatura()
distancia_redondeada = leer_distancia()
# Salida de datos de los sensores (Temperatura, Humedad, Distancia)
lcd.display_on()
lcd.backlight_on()
lcd.move_to(0, 0)
lcd.putstr("Temp " + str(temp))
lcd.move_to(9, 0)
lcd.putstr("Hum " + str(hum))
lcd.move_to(2, 1)
lcd.putstr("Dist " + str(distancia_redondeada) + " cm")
sleep(1.5)
# Llama a procedimiento que monitorea el ambiente
EvaluarCondicionesAmbiente(temp, hum, distancia_redondeada)
if distancia_redondeada < 100:
print("----- Persona aproximandose -----")
else:
print("***** No hay presencias detectadas *****")
# Control del servomotor con el potenciómetro en tiempo real (llave de agua)
pot_valor = potenciometro.read() # Obtiene el valor actual del potenciómetro (rango analógico)
angle = mapear_pot_angulo(pot_valor) # Mapea el valor del potenciómetro a un ángulo (0 a 90 grados)
my_servo.write_angle(angle) # Envía el ángulo calculado al servomotor para moverlo
# Verifica si el ángulo es de 90 grados, interpretado como "llave abierta"
if angle == 90:
print("\nLlave abierta")
else:
print("\nLlave cerrada")
sleep(0.9)