"""
Máquina de Estados de Moore - Sistema Automatizado de Dosificación,
Identificación y Control Térmico PID
Proyecto Integrador Taller Tecnológico II
Universidad del Valle - Tecnología en Electrónica Industrial
Entradas (9 bits): Start, S1, S2, S3, F, S4, Tk, Stop, Cip
Salidas Moore (7 bits): Q1, Xv1, Xv2, Xv3, Xv4, Bp, R1
SALIDAS por estado (Q1 Xv1 Xv2 Xv3 Xv4 Bp R1):
E_0: 0000000 - Reposo, todo apagado
E_1: 1000000 - Banda transportadora ON
E_2: 1000000 - Banda transportadora ON
E_3: 0001010 - Xv1 + Bp (dosificación producto 1)
E_4: 0010010 - Xv2 + Bp (dosificación producto 2)
E_5: 0100010 - Xv3 + Bp (dosificación producto 3)
E_6: 0000110 - Xv4 + Bp (control térmico PID)
E_7: 1000000 - Banda transportadora ON
E_8: 0000001 - R1 (resistencia calefactora)
E_9: 1000000 - Banda transportadora ON
"""
from machine import Pin
from time import sleep
# ─────────────────────────────────────────────
# ENTRADAS
# ─────────────────────────────────────────────
Start = Pin(36, Pin.IN) #Verde
S1 = Pin(39, Pin.IN) #Morado
S2 = Pin(34, Pin.IN) #Morado
S3 = Pin(35, Pin.IN) #Morado
F = Pin(32, Pin.IN) #Rosa
S4 = Pin(33, Pin.IN) #Morado
Tk = Pin(25, Pin.IN) #Naranja
Stop = Pin(26, Pin.IN) #Rojo
Cip = Pin(27, Pin.IN) #Azul
# ─────────────────────────────────────────────
# SALIDAS (Moore)
# ─────────────────────────────────────────────
Q1 = Pin(14, Pin.OUT) #Motor = Azul
Xv1 = Pin(12, Pin.OUT) #Valvula = verde
Xv2 = Pin(13, Pin.OUT) #Valvula = verde
Xv3 = Pin(15, Pin.OUT) #Valvula = verde
Xv4 = Pin(2, Pin.OUT) #Valvula = verde
Bp = Pin(4, Pin.OUT) #Bomba = Amarillo
R1 = Pin(5, Pin.OUT) #Resistencia Calefactora = Rojo
# ─────────────────────────────────────────────
# FUNCIONES DE SALIDA POR ESTADO
# ─────────────────────────────────────────────
def salida_E0():
"""0000000 - Todo apagado"""
Q1.value(0); Xv1.value(0); Xv2.value(0); Xv3.value(0)
Xv4.value(0); Bp.value(0); R1.value(0)
def salida_E1():
"""1000000 - Banda ON"""
Q1.value(1); Xv1.value(0); Xv2.value(0); Xv3.value(0)
Xv4.value(0); Bp.value(0); R1.value(0)
def salida_E2():
"""1000000 - Banda ON"""
Q1.value(1); Xv1.value(0); Xv2.value(0); Xv3.value(0)
Xv4.value(0); Bp.value(0); R1.value(0)
def salida_E3():
"""0001010 - Xv3 + Bp"""
Q1.value(0); Xv1.value(1); Xv2.value(0); Xv3.value(0)
Xv4.value(0); Bp.value(1); R1.value(0)
def salida_E4():
"""0010010 - Xv2 + Bp"""
Q1.value(0); Xv1.value(0); Xv2.value(1); Xv3.value(0)
Xv4.value(0); Bp.value(1); R1.value(0)
def salida_E5():
"""0100010 - Xv1 + Bp"""
Q1.value(0); Xv1.value(0); Xv2.value(0); Xv3.value(1)
Xv4.value(0); Bp.value(1); R1.value(0)
def salida_E6():
"""0000110 - Xv4 + Bp"""
Q1.value(0); Xv1.value(0); Xv2.value(0); Xv3.value(0)
Xv4.value(1); Bp.value(1); R1.value(0)
def salida_E7():
"""1000000 - Banda ON"""
Q1.value(1); Xv1.value(0); Xv2.value(0); Xv3.value(0)
Xv4.value(0); Bp.value(0); R1.value(0)
def salida_E8():
"""0000001 - R1"""
Q1.value(0); Xv1.value(0); Xv2.value(0); Xv3.value(0)
Xv4.value(0); Bp.value(0); R1.value(1)
def salida_E9():
"""1000000 - Banda ON"""
Q1.value(1); Xv1.value(0); Xv2.value(0); Xv3.value(0)
Xv4.value(0); Bp.value(0); R1.value(0)
# ─────────────────────────────────────────────
# ESTADO INICIAL
# ─────────────────────────────────────────────
estado_actual = 0
salida_E0()
# ─────────────────────────────────────────────
# BUCLE PRINCIPAL
# ─────────────────────────────────────────────
#
# Transiciones según diagrama QFSM (x = don't care):
#
# E_0 --[xxxxxxx1x]--> E_0 Stop activo
# E_0 --[1xxxxxxx0]--> E_1 Start=1, Cip=0
#
# E_1 --[xxxxxxx1x]--> E_0 Stop activo
# E_1 --[100000000]--> E_1 Banda en marcha, sin sensor
# E_1 --[010000000]--> E_3 S1 solo: producto 1
# E_1 --[011000000]--> E_4 S1+S2: producto 2
# E_1 --[011100000]--> E_5 S1+S2+S3: producto 3
#
# E_2 --[xxxxxxx1x]--> E_0 Stop activo
# E_2 --[000000001]--> E_6 Cip → control térmico
# E_2 --[xxxxxxx0x]--> E_2 Permanece
#
# E_3 --[xxxxxxx1x]--> E_0 Stop activo
# E_3 --[010010000]--> E_7 F activo: llenado prod.1 completo
# E_3 --[010000000]--> E_3 Permanece dosificando
#
# E_4 --[xxxxxxx1x]--> E_0 Stop activo
# E_4 --[011010000]--> E_7 F activo: llenado prod.2 completo
# E_4 --[011000000]--> E_4 Permanece dosificando
#
# E_5 --[xxxxxxx1x]--> E_0 Stop activo
# E_5 --[011110000]--> E_7 F activo: llenado prod.3 completo
# E_5 --[011100000]--> E_5 Permanece dosificando
#
# E_6 --[xxxxxxx1x]--> E_0 Stop activo
# E_6 --[0xxx10000]--> E_9 Transporta el agua y limpia
# E_6 --[0xxx00000]--> E_6 Permanece
#
# E_7 --[xxxxxxx1x]--> E_0 Stop activo
# E_7 --[000001000]--> E_8 S4 activo
# E_7 --[0xxx10000]--> E_7 Transportando
#
# E_8 --[xxxxxxx1x]--> E_0 Stop activo
# E_8 --[000001000]--> E_8 Permanece
# E_8 --[000000100]--> E_9 Fin de proceso
#
# E_9 --[xxxxxxx1x]--> E_0 Stop activo
# E_9 --[000000100]--> E_9 Retornando
# E_9 --[xxxxxxx01]--> E_1 Cip=1 → nuevo ciclo
while True:
start_v = Start.value()
s1_v = S1.value()
s2_v = S2.value()
s3_v = S3.value()
f_v = F.value()
s4_v = S4.value()
tk_v = Tk.value()
stop_v = Stop.value()
cip_v = Cip.value()
# ── E_0: Reposo ────────────────────────────────────────────────────────
if estado_actual == 0:
salida_E0()
if stop_v:
estado_actual = 0
elif start_v:
estado_actual = 1
elif cip_v:
estado_actual = 2
# ── E_1: Transporte hacia dosificación ────────────────────────────────
elif estado_actual == 1:
salida_E1()
if stop_v:
estado_actual = 0
elif s1_v and s2_v and s3_v: # Producto 3
estado_actual = 5
elif s1_v and s2_v and not s3_v: # Producto 2
estado_actual = 4
elif s1_v and not s2_v and not s3_v: # Producto 1
estado_actual = 3
else:
estado_actual = 1 # Sigue transportando
# ── E_2: Espera / transición interna ──────────────────────────────────
elif estado_actual == 2:
salida_E2()
if stop_v:
estado_actual = 0
elif s1_v and s2_v and s3_v: # Producto 3
estado_actual = 6
elif s1_v and s2_v and not s3_v: # Producto 2
estado_actual = 6
elif s1_v and not s2_v and not s3_v: # Producto 1
estado_actual = 6
else:
estado_actual = 2
# ── E_3: Dosificación Producto 1 ──────────────────────────────────────
elif estado_actual == 3:
salida_E3()
if stop_v:
estado_actual = 0
elif s1_v and not s2_v and f_v: # Llenado completo
estado_actual = 7
else:
estado_actual = 3
# ── E_4: Dosificación Producto 2 ──────────────────────────────────────
elif estado_actual == 4:
salida_E4()
if stop_v:
estado_actual = 0
elif s1_v and s2_v and not s3_v and f_v: # Llenado completo
estado_actual = 7
else:
estado_actual = 4
# ── E_5: Dosificación Producto 3 ──────────────────────────────────────
elif estado_actual == 5:
salida_E5()
if stop_v:
estado_actual = 0
elif s1_v and s2_v and s3_v and f_v: # Llenado completo
estado_actual = 7
else:
estado_actual = 5
# ── E_6: Limpieza de vaso con agua ──────────────────────────────────────────
elif estado_actual == 6:
salida_E6()
if stop_v:
estado_actual = 0
elif not start_v and f_v:
estado_actual = 9
else:
estado_actual = 6
# ── E_7: Transporte hacia siguiente estación ──────────────────────────
elif estado_actual == 7:
salida_E7()
if stop_v:
estado_actual = 0
elif s4_v:
estado_actual = 8
else:
estado_actual = 7
# ── E_8: Proceso con resistencia calefactora ──────────────────────────
elif estado_actual == 8:
salida_E8()
if stop_v:
estado_actual = 0
elif tk_v:
estado_actual = 9
else:
estado_actual = 8
# ── E_9: Retorno / fin de ciclo ───────────────────────────────────────
elif estado_actual == 9:
salida_E9()
if stop_v:
estado_actual = 0
elif cip_v: # Nuevo ciclo
estado_actual = 2
else:
estado_actual = 9
sleep(0.1)
Loading
esp32-devkit-c-v4
esp32-devkit-c-v4
Xv1
Xv2
S1
S2
S3
S4
Start
Q1
Xv3
Xv4
Bp
R1
Q1 = 14
Xv1 = 12
Xv2 = 13
Xv3 = 15
Xv4 = 2
Bp = 4
R1 = 5
Start = 36
S1 = 39
S2 = 34
S3 = 35
F = 32
S4 = 33
Tk = 25
Stop = 26
Cip = 27
Cip
Stop
F
Tk