# programacion de 3 tanques en cascada con modo automatico y manual.
# ESP32 - MICRO PYTHON
# Daniel Escalante y jean goenaga
from machine import Pin
import time
# Sensores de nivel (40% y 80%)
#tanque 1
t1_min = Pin(12, Pin.IN, Pin.PULL_UP)
t1_max = Pin(14, Pin.IN, Pin.PULL_UP)
#tanque 2
t2_min = Pin(27, Pin.IN, Pin.PULL_UP)
t2_max = Pin(26, Pin.IN, Pin.PULL_UP)
#tanque 3
t3_min = Pin(25, Pin.IN, Pin.PULL_UP)
t3_max = Pin(33, Pin.IN, Pin.PULL_UP)
# LED de señalización
led_rojo_t1 = Pin(22, Pin.OUT)
led_verde_t1 = Pin(23, Pin.OUT)
led_rojo_t2 = Pin(17, Pin.OUT)
led_verde_t2 = Pin(16, Pin.OUT)
led_rojo_t3 = Pin(13, Pin.OUT)
led_verde_t3 = Pin(32, Pin.OUT)
# LED amarillo + buzzer (alarma)
led_amarillo = Pin(19, Pin.OUT)
buzzer = Pin(21, Pin.OUT)
# Actuadores (LED)
bomba = Pin(2, Pin.OUT)
valv1 = Pin(4, Pin.OUT)
valv2 = Pin(5, Pin.OUT)
modo_manual = Pin(15, Pin.IN, Pin.PULL_UP) # cambia entre automático y manual
sensor_crit = Pin(34, Pin.IN, Pin.PULL_UP) # nivel critico general <20%
btn_bomba = Pin(18, Pin.IN, Pin.PULL_UP) # botón toggle bomba
btn_valv1 = Pin(35, Pin.IN, Pin.PULL_UP) # botón toggle válvula 1
btn_valv2 = Pin(0, Pin.IN, Pin.PULL_UP) # botón toggle válvula 2
# Estado y temporizadores
estado = 0
manual = False
last_btn = False
last_toggle_ms = 0
DEBOUNCE_MS = 80
_alarm_last_ms = 0
ALARM_PERIOD_MS = 300
# Estados toggle manual
bomba_on = False
valv1_on = False
valv2_on = False
last_bomba = False
last_valv1 = False
last_valv2 = False
# Funciones auxiliares
def sensor_on(p):
return p.value() == 0
def actuadores_off():
bomba.off()
valv1.off()
valv2.off()
def actualizar_leds():
led_rojo_t1.value(1 if not sensor_on(t1_min) else 0)
led_verde_t1.value(1 if sensor_on(t1_max) else 0)
led_rojo_t2.value(1 if not sensor_on(t2_min) else 0)
led_verde_t2.value(1 if sensor_on(t2_max) else 0)
led_rojo_t3.value(1 if not sensor_on(t3_min) else 0)
led_verde_t3.value(1 if sensor_on(t3_max) else 0)
def verificar_alarma():
global _alarm_last_ms
if sensor_on(sensor_crit): # sensor de nivel critico total
led_amarillo.value(1)
now = time.ticks_ms()
if time.ticks_diff(now, _alarm_last_ms) >= ALARM_PERIOD_MS:
buzzer.value(0 if buzzer.value() else 1)
_alarm_last_ms = now
else:
led_amarillo.value(0)
buzzer.value(0)
def toggle_modo():
global last_btn, last_toggle_ms, manual
now = time.ticks_ms()
btn = (modo_manual.value() == 0)
if (not last_btn) and btn and time.ticks_diff(now, last_toggle_ms) >= DEBOUNCE_MS:
last_toggle_ms = now
manual = not manual
print("Modo manual:", "On" if manual else "Off")
last_btn = btn
def toggle_manual_controls():
"Permite que los botones actúen como interruptores"
global bomba_on, valv1_on, valv2_on
global last_bomba, last_valv1, last_valv2
# Bomba
if sensor_on(btn_bomba) and not last_bomba:
bomba_on = not bomba_on
bomba.value(1 if bomba_on else 0)
last_bomba = sensor_on(btn_bomba)
# Válvula 1
if sensor_on(btn_valv1) and not last_valv1:
valv1_on = not valv1_on
valv1.value(1 if valv1_on else 0)
last_valv1 = sensor_on(btn_valv1)
# Válvula 2
if sensor_on(btn_valv2) and not last_valv2:
valv2_on = not valv2_on
valv2.value(1 if valv2_on else 0)
last_valv2 = sensor_on(btn_valv2)
# Inicio
actuadores_off()
buzzer.off()
led_amarillo.off()
actualizar_leds()
print("Arranque en automático. Estado=0 (llenar Tanque 1).")
# Bucle principal
while True:
toggle_modo()
if manual:
toggle_manual_controls()
else:
# Modo automático
if estado == 0:
if not sensor_on(t1_max):
bomba.on()
if sensor_on(t1_max):
bomba.off()
valv1.on()
estado = 1
print(">> Estado=1 → Llenar Tanque 2")
elif estado == 1:
if not sensor_on(t2_max):
valv1.on()
if sensor_on(t2_max):
valv1.off()
valv2.on()
estado = 2
print(">> Estado=2 → Llenar Tanque 3")
elif estado == 2:
if not sensor_on(t3_max):
valv2.on()
if sensor_on(t3_max):
valv2.off()
estado = 3
print(">> Estado=3 → Proceso completado")
elif estado == 3:
actuadores_off()
# Reinicio: si Tanque 1 vuelve a bajar de 40%, arranca otra vez
if not sensor_on(t1_min):
estado = 0
print(">> Estado=0 → Reinicio, llenar Tanque 1")
actualizar_leds()
verificar_alarma()
time.sleep(0.5)
maximo
maximo
minimo
manual
maximo
minimo
minimo
tanque 3
tanque 2
tanque 1
tanque 1
alto
bajo
tanque 2
bajo
alto
bajo
alto
tanque 3
valvula 2
valvula 1
bomba
Alarma
boton critico
Boton bomba
botón val1
Botón val2