from machine import Pin, I2C
from time import sleep, localtime
import dht
from i2c_lcd import I2cLcd
# Configuración de la pantalla LCD
I2C_ADDR = 0x27
i2c = I2C(0, sda=Pin(0), scl=Pin(1), freq=400000)
lcd = I2cLcd(i2c, I2C_ADDR, 4, 20)
# Sensores de nivel de los tanques
N1_T1 = Pin(11, Pin.IN, Pin.PULL_UP)
N2_T1 = Pin(12, Pin.IN, Pin.PULL_UP)
N1_T2 = Pin(13, Pin.IN, Pin.PULL_UP)
N2_T2 = Pin(14, Pin.IN, Pin.PULL_UP)
Bomba_T1 = Pin(15, Pin.OUT)
Bomba_T2 = Pin(16, Pin.OUT)
# Sensor DHT22 (Temperatura y Humedad)
sensor_dht = dht.DHT22(Pin(6))
# Configuración del teclado matricial
filas = [Pin(pin, Pin.OUT) for pin in [2, 3, 4, 5]]
columnas = [Pin(pin, Pin.IN, Pin.PULL_UP) for pin in [7, 8, 9, 10]]
# Mapeo de teclas del teclado 4x4
teclas = [
["1", "2", "3", "A"],
["4", "5", "6", "B"],
["7", "8", "9", "C"],
["*", "0", "#", "D"]
]
# Variables globales
modo_operacion = "Automático"
hora_inicio = [15, 35, 0] # Hora de inicio
hora_fin = [15, 40, 0] # Hora de fin
temp_ref = 23 # Temperatura de referencia
humedad_ref = 50 # Humedad de referencia
estado_riego = "En espera"
Area = 10 # Área en m^2
Prof = 0.2 # Profundidad de infiltración en metros
Caudal_bomba = 5 # Caudal de las bombas en litros/seg
pantalla_actual = 1 # Pantalla inicial
modo_edicion = False # Estado de edición (activado por la tecla 'C')
# Función para leer los sensores de temperatura y humedad
def leer_sensores():
sensor_dht.measure()
temp = sensor_dht.temperature()
humedad = sensor_dht.humidity()
return temp, humedad
# Función para leer el estado de los tanques
def estado_tanques():
estado = {
"T1": "Lleno" if N2_T1.value() else "Bajo",
"T2": "Lleno" if N2_T2.value() else "Bajo"
}
if estado["T1"] == "Bajo" and estado["T2"] == "Bajo":
estado["Advertencia"] = "Tanques bajos!"
else:
estado["Advertencia"] = ""
return estado
# Función para obtener la hora actual
def reloj():
tiempo = localtime()
return f"{tiempo[3]:02}:{tiempo[4]:02}:{tiempo[5]:02}"
# Función para actualizar la pantalla LCD
def mostrar_pantalla():
lcd.clear()
if pantalla_actual == 1:
lcd.putstr(f"Hora: {reloj()}\nModo: {modo_operacion}")
elif pantalla_actual == 2:
lcd.putstr(f"Inicio: {hora_inicio[0]:02}:{hora_inicio[1]:02}:{hora_inicio[2]:02}\n")
lcd.putstr(f"Fin: {hora_fin[0]:02}:{hora_fin[1]:02}:{hora_fin[2]:02}")
elif pantalla_actual == 3:
temp, humedad = leer_sensores()
niveles = estado_tanques()
lcd.putstr(f"T:{temp}C H:{humedad}%\n")
lcd.putstr(f"T1:{niveles['T1']} T2:{niveles['T2']}")
if niveles["Advertencia"]:
sleep(2)
lcd.clear()
lcd.putstr(niveles["Advertencia"])
elif pantalla_actual == 4:
lcd.putstr(f"Temp Ref: {temp_ref}C\nHumedad Ref: {humedad_ref}%")
elif pantalla_actual == 5:
temp, humedad = leer_sensores()
volumen_agua = calcular_volumen_agua(humedad, temp)
tiempo_riego = calcular_tiempo_riego(volumen_agua)
lcd.putstr(f"Estado: {estado_riego}\n")
lcd.putstr(f"Vol:{volumen_agua:.1f}L {tiempo_riego:.1f}s")
sleep(2)
# Función para leer el teclado (detección de botones)
def leer_teclado():
for i, fila in enumerate(filas):
fila.low()
for j, columna in enumerate(columnas):
if not columna.value():
fila.high()
return teclas[i][j]
fila.high()
return None
# Función para editar valores
def editar_valores():
global modo_edicion, hora_inicio, hora_fin, temp_ref, humedad_ref
if modo_edicion:
if pantalla_actual == 2: # Edición de hora_inicio y hora_fin
# Aquí podemos permitir al usuario cambiar hora_inicio y hora_fin
# Podemos agregar una interfaz de edición con las teclas numéricas
tecla = leer_teclado()
if tecla == "1":
hora_inicio[0] = (hora_inicio[0] + 1) % 24
elif tecla == "2":
hora_inicio[1] = (hora_inicio[1] + 1) % 60
elif tecla == "3":
hora_inicio[2] = (hora_inicio[2] + 1) % 60
elif tecla == "4":
hora_fin[0] = (hora_fin[0] + 1) % 24
elif tecla == "5":
hora_fin[1] = (hora_fin[1] + 1) % 60
elif tecla == "6":
hora_fin[2] = (hora_fin[2] + 1) % 60
elif tecla == "*":
modo_edicion = False # Salir de la edición
# Función de navegación entre pantallas
while True:
tecla = leer_teclado()
if tecla in ["1", "2", "3", "4", "5"]:
pantalla_actual = int(tecla) # Cambiar entre las pantallas con las teclas numéricas
elif tecla == "C":
modo_edicion = True # Activar el modo de edición
elif tecla == "*":
modo_edicion = False # Confirmar la edición
editar_valores() # Ejecutar la edición si es necesario
mostrar_pantalla() # Mostrar la pantalla actual
sleep(1)