#Fundamentos De Sistemas Embebidos
#Caceres Olguin Facundo 45747823
#Mangalaviti Sebastian 45233238
#10/07/2024
#UNLaM
import time
import machine
import micropython
import network
import random
from machine import Pin
from umqtt.simple import MQTTClient
#indicamos red wifi y clave
ssid = 'Wokwi-GUEST'
wifipassword = ''
#indicamos datos del server MQTT
mqtt_server = 'io.adafruit.com'
port = 1883
USER = 'Faccu'
KEY = 'aio_ptKz32Q5JmGkSnwbqXed49UCc3yQ'
#Indicamos id y topicos
client_id = 'Seimonsays'
LEVEL_FEED = 'level'
FEEDS = ['botones.verde', 'botones.rojo', 'botones.azul', 'botones.amarillo']
# Configuración de pines de LEDs
led_pins = [12, 14, 27, 26]
leds = [Pin(12, Pin.OUT),Pin(14, Pin.OUT),Pin(27, Pin.OUT),Pin(26, Pin.OUT)]
Pulsador = Pin(33,Pin.IN,Pin.PULL_UP)
#definimos modo station
sta_if = network.WLAN(network.STA_IF)
sta_if.active(True)
#conectamos al wifi
sta_if.connect(ssid, wifipassword)
print("Conectando")
while not sta_if.isconnected():
print(".",end="")
time.sleep(0.1)
print("Conectado al Wifi!")
#vemos las direcciones IP
print(sta_if.ifconfig())
# Función para enviar datos a Adafruit IO
def send_to_adafruit(value):
topic = '{}/feeds/{}'.format(USER, LEVEL_FEED)
conexionMQTT.publish(topic, str(value))
# Función para suscribirse a los feeds de los botones
def suscribirse_feeds(client):
for feed in FEEDS:
conexionMQTT.subscribe(USER + '/feeds/' + feed)
#funcion q debe ejecutarse cada q se recibe un mensaje de un broker
def funcion_callback(topic, msg):
dato = msg.decode('utf-8')
topicrec = topic.decode('utf-8')
topic_str = topic.decode('utf-8').split('/')[-1]
index = FEEDS.index(topic_str)
botones[index] = int(msg)
if dato == '1': print("Mensaje en topico "+topicrec+":"+dato)
#Nos conectamos al broker MQTT
try:
conexionMQTT = MQTTClient(client_id, mqtt_server,user=USER,password=KEY,port=int(port))
conexionMQTT.set_callback(funcion_callback)
conexionMQTT.connect()
print("Conectando con Broker MQTT")
except OSError as e:
print("Fallo la conexion con el Broker, reiniciando...")
time.sleep(5)
machine.reset()
suscribirse_feeds(conexionMQTT)
#FUNCIONES DEL JUEGO SEYMON SAYS
def comparar_secuencia(secuencia, respuesta):
return secuencia == respuesta
def retroalimentacion(correcto):
if correcto:
print("Correcto!")
for _ in range(3):
for led in leds:
led.on()
time.sleep(0.1)
for led in leds:
led.off()
time.sleep(0.1)
else:
print("Incorrecto!")
for _ in range(3):
for led in leds:
led.on()
time.sleep(0.1)
for led in leds:
led.off()
time.sleep(0.1)
def generar_secuencia(secuencia, pasos):
while len(secuencia) < pasos:
secuencia.append(random.randint(0, 3))
return secuencia
def mostrar_secuencia(secuencia):
for color in secuencia:
leds[color].on()
time.sleep(0.5)
leds[color].off()
time.sleep(0.2)
def capturar_respuesta(longitud):
respuesta = []
while len(respuesta) < longitud:
conexionMQTT.check_msg() # Procesar mensajes MQTT
time.sleep_ms(500)
for i, estado in enumerate(botones):
if estado == 1:
respuesta.append(i)
leds[i].on()
time.sleep(0.2)
leds[i].off()
return respuesta
#Codigo Magico:
while True:
print("Para comenzar el juego magico oprima el boton Verde:")
valor = 0
band = 0
while band == 0:
if Pulsador.value() == False:
band = 1
print("Inicio del juego: ")
nivel = 1
pasos = 1
secuencia = []
botones = [0, 0, 0, 0]
while nivel<=20:
try:
send_to_adafruit(nivel)
print('Nivel:', nivel)
secuencia = generar_secuencia(secuencia, pasos)
#print("secuencia magica a realizar: ",secuencia)
mostrar_secuencia(secuencia)
respuesta = capturar_respuesta(len(secuencia))
if comparar_secuencia(secuencia, respuesta):
retroalimentacion(True)
pasos += 1
nivel += 1
else:
retroalimentacion(False)
send_to_adafruit(0)
break
time.sleep(2)
except OSError as e:
print("Error ",e)
time.sleep(5)
machine.reset
if nivel > 20:print("Ganaste en el juego de lo que dice Simon")
else:print("Perdiste en el juego de lo que dice Simon")