import machine
from machine import Pin, Timer
import time
#difinimos tipos
NADA=0
EVENTO=1
ESPERA=2
Verde=Pin(4,Pin.IN, Pin.PULL_UP)
Rojo=Pin(6,Pin.IN, Pin.PULL_UP)
Amarillo=Pin(5,Pin.IN, Pin.PULL_UP)
Azul=Pin(7,Pin.IN, Pin.PULL_UP)
estadoVerde = NADA #Estado del pulsador
estadoAzul = NADA
estadoRojo = NADA
estadoAmarillo = NADA
ARRIBA = 1
ABAJO = 2
DERECHA = 3
IZQUIERDA = 4
contadorArriba = 0
contadorAbajo = 0
contadorIzq = 0
contadorDer = 0
estadoFSM=0
estadoAnteriorFSM=0 #Agregué una variable que guarda el estado del FSM
def FSM(estadoActual,entrada):
#Esta FSM recibe el estado actual y una entrada
#que puede ser 1 (arriba), 2(abajo), 3 (izq), 4 (der)
#y reconoce la secuencia Arrriba Arriba, Abajo Abajo, Izquierda Derecha Izquierda Derecha
if estadoActual==0 and entrada==ARRIBA and contadorArriba==2:
return 1
if estadoActual==1 and entrada==ABAJO and contadorAbajo==1:
return 1
if estadoActual==1 and entrada==ABAJO and contadorAbajo==2:
return 2
if estadoActual==2 and entrada==IZQUIERDA and contadorAbajo==2:
return 2
if estadoActual==2 and entrada==DERECHA and contadorIzq==1:
return 3
if estadoActual==3 and entrada==IZQUIERDA and (contadorIzq==2 and contadorDer==1):
return 3
if estadoActual==3 and entrada==DERECHA and (contadorIzq==2 and contadorDer==2):
return 4
return 0
def procesaEntrada(estadoActual,valorPin):
if estadoActual==NADA and valorPin==False:
return EVENTO
if estadoActual==EVENTO:
return ESPERA
if estadoActual==ESPERA and valorPin==False:
return ESPERA
return NADA
while True:
time.sleep_ms(5) #Dejamos pasar tiempo para eliminar bouncing
#Procesamos la entrada a ver si hay evento
estadoVerde = procesaEntrada(estadoVerde, Verde.value())
if (estadoVerde == EVENTO):
contadorAbajo=contadorAbajo+1
if contadorAbajo > 2:
contadorAbajo= 0
print ("contadorAbajo: "+str (contadorAbajo))
estadoFSM=FSM(estadoFSM,ABAJO)
print ("FSM: "+str (estadoFSM))
estadoAzul = procesaEntrada(estadoAzul, Azul.value())
if (estadoAzul == EVENTO):
contadorArriba=contadorArriba+1
if contadorArriba > 2:
contadorArriba= 0
print ("contadorArriba: "+str (contadorArriba))
estadoFSM=FSM(estadoFSM,ARRIBA)
print ("FSM: "+str (estadoFSM))
estadoRojo = procesaEntrada(estadoRojo, Rojo.value())
if (estadoRojo == EVENTO):
contadorIzq=contadorIzq+1
if contadorIzq > 2:
contadorIzq = 0
print ("contadorIzq: "+str (contadorIzq))
estadoFSM=FSM(estadoFSM,IZQUIERDA)
print ("FSM: "+str (estadoFSM))
estadoAmarillo = procesaEntrada(estadoAmarillo, Amarillo.value())
if (estadoAmarillo == EVENTO):
contadorDer=contadorDer+1
if contadorDer >2:
contadorDer=0
print ("contadorDer: "+str (contadorDer))
estadoFSM=FSM(estadoFSM,DERECHA)
print ("FSM: "+str (estadoFSM))
if (estadoFSM==0 and estadoAnteriorFSM!=0): #Si ambos están en 0 significa que el programa recién empieza y no reinicia los contadores, si estadoAnterior !=0 significa que ya estabamos en un estado nuevo
contadorArriba = 0
contadorAbajo = 0
contadorIzq = 0
contadorDer = 0
estadoAnteriorFSM=estadoFSM
if (estadoFSM==4):
print("***************************")
print("* KONAMI *")
print("***************************")
estadoFSM=0