from machine import Pin, PWM, TouchPad, SoftI2C
from neopixel import NeoPixel
from i2c_lcd import I2cLcd
from lcd_api import LcdApi
import time
Buzzer = PWM(Pin(19))
pixels = NeoPixel(Pin(23), 12)
# Datos de la LCD
Filas = 2
Columnas = 16
I2C_Direccion = 0x27
SCL = Pin(22)
SDA = Pin(21)
Frecuencia = 10000
i2c = SoftI2C(scl=SCL, sda=SDA, freq=Frecuencia)
lcd = I2cLcd(i2c, I2C_Direccion, Filas, Columnas)
# Configuracion botones del menu
Bok = Pin(34, Pin.IN, Pin.PULL_DOWN)
Bnext = Pin(35, Pin.IN, Pin.PULL_DOWN)
# Configuración teclas negras
Cs = Pin(4, Pin.IN, Pin.PULL_DOWN)
Ds = Pin(5, Pin.IN, Pin.PULL_DOWN)
Fs = Pin(18, Pin.IN, Pin.PULL_DOWN)
Gs = Pin(26, Pin.IN, Pin.PULL_DOWN)
As = Pin(25, Pin.IN, Pin.PULL_DOWN)
# Botones
boton = {
'DoS': Cs,
'ReS': Ds,
'FaS': Fs,
'SolS': Gs,
'LaS': As,
}
# Frecuencias
nota = {
'Do': 261.63,
'DoS': 277.18,
'Re': 293.66,
'ReS': 311.13,
'Mi': 329.63,
'Fa': 349.23,
'FaS': 369.99,
'Sol': 391.99,
'SolS': 415.30,
'La': 440.00,
'LaS': 466.16,
'Si': 493.88,
'Do2': 523.25
}
color = {
'Do': (233, 30, 99),
'DoS': (255, 30, 0),
'Re': (255, 110, 34),
'ReS': (255, 152, 0),
'Mi': (255, 250, 59),
'Fa': (205, 255, 57),
'FaS': (76, 175, 80),
'Sol': (0, 150, 136),
'SolS': (0, 188, 212),
'La': (33, 150, 243),
'LaS': (0, 17, 255),
'Si': (121, 0, 255),
'Do2': (156, 39, 176),
'Apagar':(0,0,0)
}
# Pixel de la tira led
pixel = {
'Do': 0,
'DoS': 1,
'Re': 2,
'ReS': 3,
'Mi': 4,
'Fa': 5,
'FaS': 6,
'Sol': 7,
'SolS': 8,
'La': 9,
'LaS': 10,
'Si': 11,
'Do2': 12
}
prueba = [
"DoS", "DoS", "ReS", "ReS", "FaS", "FaS",
"SolS", "SolS", "LaS", "LaS"
]
def simon():
lcd.putstr("Bienvenido a:\nSimon's Piano")
time.sleep(2)
lcd.clear()
lonSecuencia = len(prueba)
objSecuencia = prueba.copy()
time.sleep(1)
for led in prueba:
time.sleep(0.5)
Buzzer.freq(int(nota[led])) # Sonido
Buzzer.duty(230)
pixels[pixel[led]] = color[led] # Led y color
pixels.write()
lcd.putstr(led) # Pantalla
print(led)
time.sleep(0.5)
Buzzer.duty(0)
pixels[pixel[led]] = color['Apagar']
pixels.write()
lcd.clear()
time.sleep(0.1)
userSecuencia = []
while True:
if len(userSecuencia) >= lonSecuencia: # Si la secuencia ingresada alcanza la longitud, se sale del bucle infinito
break
for led, bot in boton.items(): # Por cada botón se hará lo siguiente
if len(userSecuencia) >= lonSecuencia: # Si la secuencia ingresada alcanza la longitud, se sale del bucle infinito
break
if bot.value() == True: # Si el botón está presionado
Buzzer.freq(int(nota[led])) # Sonido
Buzzer.duty(230)
pixels[pixel[led]] = color[led] # Led y color
pixels.write()
lcd.putstr(led) # Pantalla
print(led)
userSecuencia.append(led) # Se agrega el nombre del LED a la secuencia del usuario
while True: # Bucle infinito para mirar si el botón se dejó presionado
time.sleep(0.1)
if bot.value() == False: # Si el botón se dejó de presionar, apaga todo y sale del bucle infinito
Buzzer.duty(0)
pixels[pixel[led]] = color['Apagar']
pixels.write()
lcd.clear()
break
time.sleep(0.1)
else: # Si el botón no fue presionado, se asegura de apagar todo
Buzzer.duty(0)
pixels[pixel[led]] = color['Apagar']
pixels.write()
lcd.clear()
resultado = True
for i in range(lonSecuencia):
if objSecuencia[i] != userSecuencia[i]: # Compara la secuencia objetivo con la secuencia ingresada por el usuario
resultado = False # Si hay algo diferente, es porque la secuencia del usuario es incorrecta
# Mostrar resultado y las secuencias
if resultado:
print("\nSecuencia objetivo: ", ", ".join(objSecuencia))
print("Secuencia ingresada: ", ", ".join(userSecuencia))
print("\nGanaste")
else:
print("\nSecuencia objetivo: ", ", ".join(objSecuencia))
print("Secuencia ingresada: ", ", ".join(userSecuencia))
print("\nHas perdido")
while True:
if Bok.value() == True: # Cuando se presione el botón de iniciar, se hace lo siguiente:
simon() # Ejecuta la función que contiene la lógica del juego
if simon()
"""
def DoS():
# Do Sostenido
if Cs.value() == 1:
print("Do Sostenido")
# Prender led
pixels[1] = color['DoS']
pixels.write()
time.sleep(0.5)
pixels[1] = color['Apagar']
pixels.write()
# Tocar nota
Buzzer.freq(int(nota['DoS']))
Buzzer.duty(230)
time.sleep(0.5)
Buzzer.duty(0)
time.sleep(0.1)
def ReS():
# Re Sostenido
if Ds.value() == 1:
print("Re Sostenido")
pixels[3] = color['ReS']
pixels.write()
time.sleep(0.5)
pixels[3] = color['Apagar']
pixels.write()
Buzzer.freq(int(nota['ReS']))
Buzzer.duty(230)
time.sleep(0.5)
Buzzer.duty(0)
time.sleep(0.1)
def FaS():
# Fa Sostenido
if Fs.value() == 1:
print("Fa Sostenido")
pixels[6] = color['FaS']
pixels.write()
time.sleep(0.5)
pixels[6] = color['Apagar']
pixels.write()
Buzzer.freq(int(nota['FaS']))
Buzzer.duty(230)
time.sleep(0.5)
Buzzer.duty(0)
time.sleep(0.1)
def SolS():
# Sol Sostenido
if Gs.value() == 1:
print("Sol Sostenido")
pixels[8] = color['SolS']
pixels.write()
time.sleep(0.5)
pixels[8] = color['Apagar']
pixels.write()
Buzzer.freq(int(nota['SolS']))
Buzzer.duty(230)
time.sleep(0.5)
Buzzer.duty(0)
time.sleep(0.1)
def LaS():
# La Sostenido
if As.value() == 1:
print("La Sostenido")
pixels[10] = color['LaS']
pixels.write()
time.sleep(0.5)
pixels[10] = color['Apagar']
pixels.write()
Buzzer.freq(int(nota['LaS']))
Buzzer.duty(230)
time.sleep(0.5)
Buzzer.duty(0)
time.sleep(0.1)
"""