# 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
# Instancia de objetos a utilizar, con la declaración de sus pines
boton = Pin(2, Pin.IN, Pin.PULL_UP) # Botón
sensor = dht.DHT22(Pin(15)) # temperatura/humedad
#pixeles = Luces(pin=0, num_pixels=3) # Crear instancia de Luces
Ultra = HCSR04(13, 12, 10000) # Sensor ultrasónico
potenciometro = ADC(Pin(14)) # Potenciómetro
Address_LCD = 0x27 # Dirección de pantalla LCD.
i2c = I2C(scl=Pin(22), sda=Pin(21), freq=400000) # Configuración del bus I2C con pines de conexión y frecuencia
lcd = I2cLcd(i2c, Address_LCD, 2, 16) # Número de filas y columnas de la pantalla utilizada.
# Instancia del servomotor
servo_pin = Pin(4) # Pin asociado al servo
my_servo = Servo(servo_pin)
#------------------------------------------------------------------------------------
# función para capturar mediciones de la temp (dht22)
def leer_temperatura():
sensor.measure()
temp = sensor.temperature()
return temp
# Función para capturar mediciones de le hum (dht22)
def leer_humedad():
sensor.measure()
hum = sensor.humidity()
return hum
# Función para sensor ultrasónico que mide en centímetros.
def leer_distancia():
return 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)
estadoBoton = 0 # 0: apagado, 1: mostrar temperatura, 2: mostrar humedad, 3: mostrar distancia.
while True:
if not boton.value():
estadoBoton = (estadoBoton + 1) % 5 # Alternar entre 0, 1, 2, 3, 4 (pulsaciones)
while not boton.value(): # Espera hasta que se suelte el botón
pass
sleep(0.5) # Pequeña pausa para evitar rebotes
lcd.clear() # Limpia el texto para no dejar rastros cuando se genera nuevo texto.
if estadoBoton == 1:
lcd.display_on()
lcd.backlight_on()
lcd.move_to(1, 0)
lcd.putstr("Press button")
lcd.move_to(0, 1) # Mover el cursor a la segunda fila
lcd.putstr("to see operation")
# visualizar datos de humedad
elif estadoBoton == 2:
hum = leer_humedad() # Función creada
print("Sistema encendido")
lcd.display_on()
lcd.backlight_on()
lcd.move_to(1, 0)
lcd.putstr("-- Humedad --")
lcd.move_to(6, 1) # Mover el cursor a la segunda fila
lcd.putstr(str(hum) + " %")
# Control del servomotor con el potenciómetro en tiempo real
pot_valor = potenciometro.read() # Lee el valor del potenciómetro
angle = mapear_pot_angulo(pot_valor) # Mapea a un ángulo entre 0 y 180 grados
my_servo.write_angle(angle) # Mueve el servo al ángulo correspondiente
# visualizar datos de temperatura
elif estadoBoton == 3:
temp = leer_temperatura() # Función creada
print("Sistema encendido")
lcd.display_on()
lcd.backlight_on()
lcd.move_to(0, 0)
lcd.putstr("--Temperatura --")
lcd.move_to(4, 1) # Mover el cursor a la segunda fila
lcd.putstr(str(temp))
# Control del servomotor con el potenciómetro en tiempo real
pot_valor = potenciometro.read() # Lee el valor del potenciómetro
angle = mapear_pot_angulo(pot_valor) # Mapea a un ángulo entre 0 y 180 grados
my_servo.write_angle(angle) # Mueve el servo al ángulo correspondiente
# visualizar datos de distancia
elif estadoBoton == 4:
distancia = leer_distancia() # Función creada
distancia_redondeada = round(distancia, 1) # redondea a solo un decimal
print("Sistema encendido")
lcd.display_on()
lcd.move_to(0, 0)
lcd.putstr("-- Distancia --")
lcd.move_to(4, 1) # Mover el cursor a la segunda fila
lcd.putstr(str(distancia_redondeada)+ " cm")
# Control del servomotor con el potenciómetro en tiempo real
pot_valor = potenciometro.read() # Lee el valor del potenciómetro
angle = mapear_pot_angulo(pot_valor) # Mapea a un ángulo entre 0 y 180 grados
my_servo.write_angle(angle) # Mueve el servo al ángulo correspondiente
else:
print("Sistema de riego apagado...")
lcd.display_off() # Apaga la pantalla.
lcd.backlight_off() # Apaga la iluminación de pantalla.
my_servo.write_angle(0) # Cierra la válvula de agua al ángulo 0
sleep(0.5)