from machine import Pin, PWM
from utime import sleep, ticks_ms
# Definir pines para el LCD
rs = Pin(2, Pin.OUT)
e = Pin(3, Pin.OUT)
d4 = Pin(4, Pin.OUT)
d5 = Pin(5, Pin.OUT)
d6 = Pin(6, Pin.OUT)
d7 = Pin(7, Pin.OUT)
# Definir filas y columnas del keypad
rows = [Pin(8, Pin.OUT), Pin(9, Pin.OUT), Pin(10, Pin.OUT), Pin(11, Pin.OUT)]
cols = [Pin(12, Pin.IN, Pin.PULL_DOWN), Pin(13, Pin.IN, Pin.PULL_DOWN), Pin(14, Pin.IN, Pin.PULL_DOWN)]
# Definir pin para el buzzer
buzzer = PWM(Pin(15)) # Usamos PWM para controlar el sonido del buzzer
buzzer.freq(1000) # Frecuencia inicial
# Definir pines para los LEDs
led_green = Pin(16, Pin.OUT)
led_yellow = Pin(17, Pin.OUT)
led_red = Pin(18, Pin.OUT)
# Mapa del keypad
key_map = [
['1', '2', '3'],
['4', '5', '6'],
['7', '8', '9'],
['*', '0', '#']
]
# Buffer para almacenar lo tecleado
input_code = ""
# Contraseña para desactivar la bomba
correct_code = "1234"
# Duración del contador (5 minutos con 10 segundos)
time_limit = 310 # 310 segundos = 5 minutos con 10 segundos
# Función para enviar comandos al LCD
def lcd_command(cmd):
rs.value(0) # Modo comando
lcd_send(cmd)
sleep(0.005)
# Función para enviar datos al LCD
def lcd_data(data):
rs.value(1) # Modo datos
lcd_send(data)
sleep(0.005)
# Función para enviar bits al LCD
def lcd_send(data):
# Enviar los 4 bits altos
d4.value((data >> 4) & 1)
d5.value((data >> 4) & 2)
d6.value((data >> 4) & 4)
d7.value((data >> 4) & 8)
lcd_toggle_enable()
# Enviar los 4 bits bajos
d4.value(data & 1)
d5.value(data & 2)
d6.value(data & 4)
d7.value(data & 8)
lcd_toggle_enable()
# Función para alternar el pin de habilitación (Enable)
def lcd_toggle_enable():
e.value(1)
sleep(0.001)
e.value(0)
sleep(0.001)
# Inicializar el LCD en modo 4 bits
def lcd_init():
lcd_command(0x33) # Inicialización
lcd_command(0x32) # Configuración para 4 bits
lcd_command(0x28) # Pantalla de 2 líneas, matriz de 5x8 puntos
lcd_command(0x0C) # Encender pantalla, cursor apagado
lcd_command(0x06) # Modo de incremento
lcd_command(0x01) # Limpiar pantalla
sleep(0.005)
# Función para escribir texto en el LCD
def lcd_putstr(text):
lcd_clear()
for char in text:
lcd_data(ord(char))
# Función para borrar el contenido del LCD
def lcd_clear():
lcd_command(0x01) # Comando para limpiar pantalla
sleep(0.005)
# Función para escanear el keypad
def scan_keypad():
for row_num, row_pin in enumerate(rows):
row_pin.value(1) # Activar la fila
for col_num, col_pin in enumerate(cols):
if col_pin.value() == 1:
return key_map[row_num][col_num]
row_pin.value(0) # Desactivar la fila
return None
# Función para activar el buzzer durante un tiempo determinado
def buzzer_beep(duration):
buzzer.duty_u16(1000) # Activar el buzzer
sleep(duration) # Duración del sonido
buzzer.duty_u16(0) # Apagar el buzzer
# Función para simular la explosión
def explosion_sound():
for _ in range(10): # Hacer sonar el buzzer 10 veces
buzzer_beep(0.1)
sleep(0.1)
# Función para apagar todos los LEDs
def turn_off_leds():
led_green.value(0)
led_yellow.value(0)
led_red.value(0)
# Función para mostrar la explosión con LEDs intermitentes
def explosion_lights():
for _ in range(10): # Parpadear los LEDs 10 veces
led_red.value(1)
sleep(0.2)
led_red.value(0)
led_yellow.value(1)
sleep(0.2)
led_yellow.value(0)
# Función para el contador de la bomba
def countdown():
start_time = ticks_ms() # Obtener el tiempo inicial
time_left = time_limit
while time_left > 0:
elapsed_time = (ticks_ms() - start_time) // 1000 # Convertir a segundos
time_left = time_limit - elapsed_time
lcd_putstr(f"Tiempo: {time_left}s")
led_yellow.value(1) # Encender LED amarillo
sleep(1)
led_yellow.value(0) # Apagar LED amarillo
sleep(0.1)
# Verificar si se ha presionado el botón para ingresar código
key = scan_keypad()
if key == "*":
return "enter_code"
return "exploded"
# Función para ingresar el código
def enter_code():
global input_code
input_code = ""
lcd_putstr("Enter Code:")
while len(input_code) < 4:
key = scan_keypad()
if key:
buzzer_beep(0.1)
if key == "#": # Borrar el último dígito
if len(input_code) > 0:
input_code = input_code[:-1]
lcd_putstr(input_code)
elif key != "*":
input_code += key
lcd_putstr(input_code)
sleep(0.3)
return input_code
# Función principal
def main():
global input_code
lcd_init() # Inicializar la pantalla
lcd_putstr("Set codigo bomba")
# Ingresar el código para desactivar la bomba
correct_code = enter_code()
lcd_putstr("Bomb Armed")
sleep(2)
# Iniciar el contador de la bomba
result = countdown()
if result == "enter_code":
entered_code = enter_code()
if entered_code == correct_code:
lcd_putstr("Bomb Defused")
led_green.value(1) # Encender LED verde si la bomba fue desactivada
else:
lcd_putstr("Wrong Password")
sleep(2)
lcd_putstr("Bomb Exploded")
explosion_sound()
explosion_lights()
else:
lcd_putstr("Bomb Exploded")
explosion_sound()
explosion_lights()
# Ejecutar el juego
main()