import time
from machine import Pin, ADC, I2C
from pico_i2c_lcd import I2cLcd
# ============================================================
# LCD 20x4
# ============================================================
i2c = I2C(0, sda=Pin(0), scl=Pin(1), freq=400000)
lcd = I2cLcd(i2c, 0x27, 4, 20)
# ============================================================
# SENSORES DE NIVEL
# ============================================================
N2T1 = Pin(2, Pin.IN, Pin.PULL_UP)
N1T1 = Pin(3, Pin.IN, Pin.PULL_UP)
N2T2 = Pin(4, Pin.IN, Pin.PULL_UP)
N1T2 = Pin(5, Pin.IN, Pin.PULL_UP)
# ============================================================
# BOTONES
# ============================================================
btn_ant = Pin(10, Pin.IN, Pin.PULL_UP)
btn_sig = Pin(11, Pin.IN, Pin.PULL_UP)
btn_ok = Pin(12, Pin.IN, Pin.PULL_UP)
btn_back = Pin(13, Pin.IN, Pin.PULL_UP)
def press(b):
return b.value() == 0
# ============================================================
# BOMBAS
# ============================================================
bomba1 = Pin(14, Pin.OUT)
bomba2 = Pin(15, Pin.OUT)
# ============================================================
# SENSORES ANALÓGICOS
# ============================================================
hum_adc = ADC(26)
tmp_adc = ADC(27)
def leer_humedad():
return int((hum_adc.read_u16() / 65535) * 100)
def leer_temp():
return int((tmp_adc.read_u16() / 65535) * 50 + 10)
# ============================================================
# VARIABLES GLOBALES
# ============================================================
pantalla = 0 # P0-P3
modo = 0 # 0 = Temporizado, 1 = Control
hora = [15,30,0] # HH:MM:SS
def actualizar_hora():
hora[2] += 1
if hora[2] >= 60:
hora[2] = 0
hora[1] += 1
if hora[1] >= 60:
hora[1] = 0
hora[0] += 1
if hora[0] >= 24:
hora[0] = 0
# ============================================================
# PANTALLAS
# ============================================================
def mostrar_menu_principal():
lcd.clear()
lcd.move_to(0,0)
lcd.putstr("[P0] MENU")
lcd.move_to(0,1)
lcd.putstr("Hora: {:02}:{:02}:{:02}".format(*hora))
lcd.move_to(0,2)
lcd.putstr("Modo: " + ("Temporizado" if modo==0 else "Control"))
lcd.move_to(0,3)
lcd.putstr("OK=Cambiar modo")
def mostrar_variables():
lcd.clear()
lcd.move_to(0,0)
lcd.putstr("[P1] VARIABLES")
lcd.move_to(0,1)
lcd.putstr("H:{}% T:{}C".format(leer_humedad(), leer_temp()))
lcd.move_to(0,2)
lcd.putstr("T1 N1:{} N2:{}".format(N1T1.value(), N2T1.value()))
lcd.move_to(0,3)
lcd.putstr("T2 N1:{} N2:{}".format(N1T2.value(), N2T2.value()))
# Variables temporizado
hora_inicio = [15,31,0]
hora_fin = [15,32,0]
editando = 0
campo = 0
bomba_activa = 1
def mostrar_temporizado():
lcd.clear()
lcd.move_to(0,0)
lcd.putstr("[P3] TEMPORIZADO")
lcd.move_to(0,1)
lcd.putstr("Ini:{:02}:{:02}:{:02}".format(*hora_inicio))
lcd.move_to(0,2)
lcd.putstr("Fin:{:02}:{:02}:{:02}".format(*hora_fin))
lcd.move_to(0,3)
if bomba1.value() or bomba2.value():
lcd.putstr("Riego: ON B{}".format(1 if bomba1.value() else 2))
else:
lcd.putstr("Riego: OFF")
# ============================================================
# FUNCIONES DE COMPARACIÓN DE HORAS
# ============================================================
def hora_mayor_igual(a,b):
return (a[0],a[1],a[2]) >= (b[0],b[1],b[2])
def hora_menor_igual(a,b):
return (a[0],a[1],a[2]) <= (b[0],b[1],b[2])
# ============================================================
# LOOP PRINCIPAL
# ============================================================
ok_prev = 1
while True:
actualizar_hora()
# -----------------------------------
# BOTÓN OK
# -----------------------------------
ok_now = btn_ok.value()
if ok_prev == 1 and ok_now == 0:
if pantalla == 0:
modo = 1 - modo # cambiar modo
elif pantalla == 3:
editando = (editando + 1) % 3
campo = 0
time.sleep(0.25)
ok_prev = ok_now
# -----------------------------------
# BOTÓN SIGUIENTE
# -----------------------------------
if press(btn_sig):
pantalla = (pantalla + 1) % 4
time.sleep(0.25)
# -----------------------------------
# BOTÓN ANTERIOR
# -----------------------------------
if press(btn_ant):
pantalla = (pantalla - 1) % 4
time.sleep(0.25)
# -----------------------------------
# BOTÓN BACK
# -----------------------------------
if press(btn_back):
if editando != 0:
campo = (campo + 1) % 3
else:
pantalla = 0
time.sleep(0.25)
# -----------------------------------
# MOSTRAR PANTALLA CORRESPONDIENTE
# -----------------------------------
if pantalla == 0:
mostrar_menu_principal()
elif pantalla == 1:
mostrar_variables()
elif pantalla == 2:
lcd.clear()
lcd.move_to(0,0)
lcd.putstr("[P2] BOMBAS")
lcd.move_to(0,1)
lcd.putstr("B1:" + ("ON" if bomba1.value() else "OFF"))
lcd.move_to(0,2)
lcd.putstr("B2:" + ("ON" if bomba2.value() else "OFF"))
elif pantalla == 3:
mostrar_temporizado()
# -----------------------------------
# EDICIÓN HORAS TEMPORIZADO
# -----------------------------------
if editando != 0:
objetivo = hora_inicio if editando == 1 else hora_fin
if press(btn_sig):
objetivo[campo] += 1
if campo == 0 and objetivo[campo] >= 24: objetivo[campo] = 0
if campo > 0 and objetivo[campo] >= 60: objetivo[campo] = 0
time.sleep(0.25)
if press(btn_ant):
objetivo[campo] -= 1
if campo == 0 and objetivo[campo] < 0: objetivo[campo] = 23
if campo > 0 and objetivo[campo] < 0: objetivo[campo] = 59
time.sleep(0.25)
# -----------------------------------
# MODO TEMPORIZADO
# -----------------------------------
hora_actual = hora[:]
if modo == 0:
if hora_mayor_igual(hora_actual, hora_inicio) and hora_menor_igual(hora_actual, hora_fin):
if bomba_activa == 1 and N1T1.value() == 1:
bomba1.off()
bomba2.on()
bomba_activa = 2
elif bomba_activa == 2 and N1T2.value() == 1:
bomba2.off()
bomba1.on()
bomba_activa = 1
else:
if bomba_activa == 1:
bomba1.on()
bomba2.off()
else:
bomba2.on()
bomba1.off()
else:
bomba1.off()
bomba2.off()
# -----------------------------------
# MODO CONTROL
# -----------------------------------
else:
humedad = leer_humedad()
temp = leer_temp()
humedad_baja = humedad < 30
temp_alta = temp > 30
if humedad_baja or temp_alta:
if N1T1.value() == 0:
bomba1.on()
bomba2.off()
elif N1T2.value() == 0:
bomba2.on()
bomba1.off()
else:
bomba1.off()
bomba2.off()
else:
bomba1.off()
bomba2.off()
# -----------------------------------
# RETARDO GENERAL
# -----------------------------------
time.sleep(1)
Siguiente
OK
Regresar
Anterior
Temperatura
Simulan Humedad
Bomba 1 (B_1)
Bomba 2 (B_2)
Nivel Alto T1 (N2T1)
Nivel Bajo T1 (N1T1)
Nivel Alto T2 (N2T2)
Nivel Bajo T2 (N1T2)