from machine import Pin, I2C
from lcd_i2c import LCD
import time
# ==============================
# Configuración de Pines
# ==============================
# Entradas
pres_alta = Pin(32, Pin.IN) # presostato de alta
pres_baja = Pin(33, Pin.IN) # presostato de baja
pres_aceite = Pin(25, Pin.IN) # diferencial aceite
arranque = Pin(26, Pin.IN) # señal de arranque
tension_ok = Pin(27, Pin.IN) # tensiones correctas
air_switch = Pin(14, Pin.IN) # flujo de aire
congelamiento= Pin(12, Pin.IN) # sensor congelamiento
# Salidas
solenoide = Pin(23, Pin.OUT)
compresor = Pin(22, Pin.OUT)
forzadores = Pin(21, Pin.OUT)
# Botón para ver fallas
boton_fallas = Pin(34, Pin.IN, Pin.PULL_UP)
# ==============================
# Configuración de LCD I2C
# ==============================
i2c = I2C(0, scl=Pin(19), sda=Pin(18), freq=400000)
lcd = LCD(0x27, 2, 16, i2c) # dirección, filas, columnas, bus I2C
# ==============================
# Manejo de fallas
# ==============================
fallas = [] # lista circular de hasta 5 fallas
def guardar_falla(mensaje):
if len(fallas) >= 5:
fallas.pop(0) # descarto la más vieja
fallas.append(mensaje)
mostrar_en_lcd("Falla:", mensaje)
# ---- FUNCIONES GENERALES ----
def mostrar_en_lcd(linea1, linea2=""):
lcd.clear()
lcd.print(linea1[:16])
lcd.set_cursor(0, 1)
lcd.print(linea2[:16])
def reset_salidas():
solenoide.off()
compresor.off()
forzadores.off()
# ==============================
# Mostrar fallas con botón
# ==============================
def mostrar_fallas():
if not fallas:
mostrar_en_lcd("No hay fallas", "")
time.sleep(2)
return
for mensaje in fallas:
mostrar_en_lcd("Falla:", mensaje)
time.sleep(3)
# ==============================
# Lógica de Control
# ==============================
while True:
# Ver si el botón se presiona para ver fallas
if boton_fallas.value() == 0: # botón presionado
mostrar_fallas()
time.sleep(0.5) # antirrebote
if arranque.value() == 1: # Tengo señal de arranque
mostrar_en_lcd("Chequeo aire")
if air_switch.value() == 0:
guardar_falla("Sin aire")
reset_salidas()
continue
# Paso 1: abrir solenoide
mostrar_en_lcd("Solenoide ON")
solenoide.on()
time.sleep(30)
# Paso 2: verificar baja presión
mostrar_en_lcd("Chequeo", "baja P")
t0 = time.time()
while time.time() - t0 < 60:
if pres_baja.value() == 1:
break
if arranque.value() == 0:
break
if congelamiento.value() == 1:
break
time.sleep(1)
if pres_baja.value() == 0:
guardar_falla("Baja P")
reset_salidas()
continue
if congelamiento.value() == 1:
guardar_falla("Congelamiento")
reset_salidas()
while congelamiento.value() == 1:
time.sleep(1)
continue # vuelve al ciclo de arranque
# Paso 3: espera de 5 minutos antes de arrancar compresor
mostrar_en_lcd("Espera", "5 min")
t0 = time.time()
while time.time() - t0 < 300:
if arranque.value() == 0:
break
if congelamiento.value() == 1:
break
time.sleep(1)
if arranque.value() == 0:
continue
if congelamiento.value() == 1:
guardar_falla("Congelamiento")
reset_salidas()
while congelamiento.value() == 1:
time.sleep(1)
continue
# Paso 4: arrancar forzadores
mostrar_en_lcd("Forzadores ON")
forzadores.on()
time.sleep(10)
# Paso 5: arrancar compresor
mostrar_en_lcd("Compresor ON")
compresor.on()
t_inicio = time.time()
# Mantener mientras dure la señal de arranque y condiciones OK
while True:
if congelamiento.value() == 1:
guardar_falla("Congelamiento")
reset_salidas()
while congelamiento.value() == 1:
time.sleep(1)
break # vuelve al ciclo de arranque
if arranque.value() == 0:
solenoide.off()
mostrar_en_lcd("Esperando", "baja")
while pres_baja.value() == 0:
time.sleep(1)
compresor.off()
forzadores.off()
mostrar_en_lcd("Compresor OFF")
break
if pres_alta.value() == 1:
guardar_falla("Alta P")
reset_salidas()
break
if pres_baja.value() == 1:
guardar_falla("Baja P")
reset_salidas()
break
if air_switch.value() == 0:
guardar_falla("Sin aire")
reset_salidas()
break
# chequeo aceite después de 120s
if time.time() - t_inicio > 120:
if pres_aceite.value() == 1:
guardar_falla("Aceite")
reset_salidas()
break
time.sleep(1)
else:
reset_salidas()
mostrar_en_lcd("Esperando", "orden")
time.sleep(1)