# 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
from lucesAlarma import LucesAlarma # Importar la clase LucesAlarma
# Instancia de objetos a utilizar, con la declaración de sus pines
boton = Pin(2, Pin.IN) # Botón
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
# 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")
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")
# Su la humedad esta al 100% y la llave esta abierta
elif hum == 100 and angle == 90:
print("Humedad al maximo, cerrar llave de agua")
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 tempertaura es baja se considera norma menor a 25 grados
elif temp < 25:
print("Temperatura normal")
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")
# si la temperatura es alta pero se ha completado el riego al 100%.
elif temp > 25 and hum == 100:
print("Temperatura caliente / Plantas humedecidas..")
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")
# Declaración de variables para el estado del sistema y el botón
estado_sistema = False # Sistema apagado inicialmente
ultimo_estado_boton = 0 # Último estado leído del botón
while True:
# Lee el estado actual del botón
estado_boton = boton.value()
# Detecta cambio en el estado del botón
if estado_boton == 1 and ultimo_estado_boton == 0: # Botón presionado
estado_sistema = not estado_sistema # Alterna el estado del sistema
print("Cambio de estado, sistema encendido" if estado_sistema else "Cambio de estado, sistema apagado")
sleep(0.2) # Pequeña espera para evitar rebotes
# Guarda el último estado del botón
ultimo_estado_boton = estado_boton
lcd.clear() # Limpia el texto para evitar rastros al actualizar datos
if estado_sistema: # Sistema encendido
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)
# Control del servomotor con el potenciómetro en tiempo real (llave de agua)
pot_valor = potenciometro.read()
angle = mapear_pot_angulo(pot_valor)
my_servo.write_angle(angle)
if angle == 90:
print("\nLlave abierta")
else:
print("\nLlave cerrada")
else:
print("Sistema de riego apagado...")
lcd.display_off()
lcd.backlight_off()
my_servo.write_angle(0) # Cierra la válvula de agua
sleep(0.9)