from machine import Pin, I2C
import ssd1306
from keypad_utp import KeyPad
from time import sleep, time
# === Configuración de la pantalla OLED ===
i2c = I2C(0, scl=Pin(22), sda=Pin(21))
oled = ssd1306.SSD1306_I2C(128, 64, i2c)
# === Diccionarios de usuarios ===
d1 = dict(Nombre='1234', Edad=21, Documento='0000')
d2 = dict(Nombre='5678', Edad=30, Documento='1234')
d3 = dict(Nombre='4321', Edad=25, Documento='9999')
usuarios = {
'1': d1,
'2': d2,
'3': d3
}
# === Teclado matricial 4x4 ===
Teclas = [
'1', '2', '3', 'A',
'4', '5', '6', 'B',
'7', '8', '9', 'C',
'*', '0', '#', 'D',
]
keypad = KeyPad(
r1=19, r2=18, r3=5, r4=4,
c1=13, c2=12, c3=14, c4=27,
keys=Teclas
)
keypad.start()
# === LED de acceso ===
led = Pin(2, Pin.OUT)
led.value(0)
# === Variables del sistema ===
usuario_actual = None
clave_ingresada = ""
intentos = 0
errores_totales = 0 # Contador global de errores
bloqueado_hasta = 0
fase = "seleccion" # puede ser 'seleccion', 'nombre', 'edad', 'documento'
campo_actual = "" # Guarda el campo actual ('Nombre', 'Edad', 'Documento')
last_key = None
# === Función para mostrar en OLED ===
def mostrar_oled(linea1, linea2=""):
oled.fill(0)
oled.text(linea1, 0, 0)
oled.text(linea2, 0, 16)
oled.show()
# === Mensaje inicial ===
mostrar_oled("Selecciona usuario", "1, 2 o 3")
try:
while True:
ahora = time()
# Si está bloqueado, mostrar el tiempo restante
if ahora < bloqueado_hasta:
segundos = int(bloqueado_hasta - ahora)
mostrar_oled("Bloqueado", f"Faltan {segundos}s")
sleep(1)
continue
key = keypad.get_key()
if key:
if key != last_key: # Evitar repetición continua
# === Fase de selección de usuario ===
if fase == "seleccion":
if key in usuarios:
usuario_actual = usuarios[key]
mostrar_oled(f"Usuario {key} seleccionado", "Teclea nombre")
clave_ingresada = ""
intentos = 0
fase = "nombre"
campo_actual = "Nombre"
# === Fase de ingreso de nombre ===
elif fase == "nombre":
if key == "*":
clave_ingresada = ""
mostrar_oled("Teclea nombre:")
elif key == "#":
if clave_ingresada == usuario_actual['Nombre']:
mostrar_oled(f"Nombre correcto!", "Ahora la edad")
sleep(1)
clave_ingresada = ""
fase = "edad"
campo_actual = "Edad"
else:
errores_totales += 1 # Incrementamos el contador de errores
if errores_totales >= 3:
bloqueado_hasta = ahora + 20
mostrar_oled("Acceso Denegado", "Bloqueado 20s")
else:
mostrar_oled("Nombre incorrecto", f"Intento {errores_totales}/3")
clave_ingresada = ""
sleep(2)
mostrar_oled("Teclea nombre:")
elif len(clave_ingresada) < 4 and key.isdigit():
clave_ingresada += key
mostrar_oled(f"Nombre: {clave_ingresada}", "")
# === Fase de ingreso de edad ===
elif fase == "edad":
if key == "*":
clave_ingresada = ""
mostrar_oled("Teclea edad:")
elif key == "#":
if clave_ingresada == str(usuario_actual['Edad']):
mostrar_oled(f"Edad correcta!", "Ahora el documento")
sleep(1)
clave_ingresada = ""
fase = "documento"
campo_actual = "Documento"
else:
errores_totales += 1 # Incrementamos el contador de errores
if errores_totales >= 3:
bloqueado_hasta = ahora + 20
mostrar_oled("Acceso Denegado", "Bloqueado 20s")
else:
mostrar_oled("Edad incorrecta", f"Intento {errores_totales}/3")
clave_ingresada = ""
sleep(2)
mostrar_oled("Teclea edad:")
elif len(clave_ingresada) < 3 and key.isdigit():
clave_ingresada += key
mostrar_oled(f"Edad: {clave_ingresada}", "")
# === Fase de ingreso de documento ===
elif fase == "documento":
if key == "*":
clave_ingresada = ""
mostrar_oled("Teclea documento:")
elif key == "#":
if clave_ingresada == usuario_actual['Documento']:
mostrar_oled("Acceso", "Concedido!")
led.value(1)
sleep(3)
led.value(0)
clave_ingresada = ""
fase = "seleccion"
mostrar_oled("Selecciona usuario", "1, 2 o 3")
else:
errores_totales += 1 # Incrementamos el contador de errores
if errores_totales >= 3:
bloqueado_hasta = ahora + 20
mostrar_oled("Acceso Denegado", "Bloqueado 20s")
else:
mostrar_oled("Documento Incorrecto", f"Intento {errores_totales}/3")
clave_ingresada = ""
sleep(2)
mostrar_oled("Teclea documento:")
elif len(clave_ingresada) < 4 and key.isdigit():
clave_ingresada += key
mostrar_oled(f"Documento: {clave_ingresada}", "")
last_key = key
else:
last_key = None
sleep(0.1)
finally:
keypad.stop()