import machine
from machine import Pin, SoftI2C , PWM
import time 
from lcd_api import LcdApi
from i2c_lcd import I2cLcd
from time import sleep

import utime


I2C_ADDR = 0x27
#  AQUI VA 
totalRows = 2
totalColumns = 16  
i2c = SoftI2C(scl=Pin(17), sda=Pin(16), freq=10000)
lcd = I2cLcd(i2c, I2C_ADDR, totalRows, totalColumns)


TECLA_ARRIBA  = const(0)
TECLA_ABAJO = const(1)

teclas_presionadas = []

teclas = [['1', '2', '3', 'A'], ['4', '5', '6', 'B'], ['7', '8', '9', 'C'], ['*', '0', '#', 'D']]

# Pines del GPIO  
filas = [3,4,5,6]
columnas = [7,8,9,10]

# define los pines de filas como salidas
fila_pines = [Pin(nombre_pin, mode=Pin.OUT) for nombre_pin in filas]

# define los pines de columnas como entradas
columna_pines = [Pin(nombre_pin, mode=Pin.IN, pull=Pin.PULL_DOWN) for nombre_pin in columnas]


buzzer_pin = 18
buzzer = Pin(buzzer_pin, Pin.OUT)

pir = Pin(0, Pin.IN, Pin.PULL_UP)

pin_led = Pin(1, Pin.OUT)  # Por ejemplo, pin GPIO 2
pin_led2 = Pin(2, Pin.OUT)  # Por ejemplo, pin GPIO 2
def control_led(estado):
    if estado == "encender":
        pin_led.on()
    elif estado == "apagar":
        pin_led.off()
    else:
        print("Estado inválido. Usa 'encender' o 'apagar'.")

def control_led2(estado):
    if estado == "encender":
        pin_led2.on()
    elif estado == "apagar":
        pin_led2.off()
    else:
        print("Estado inválido. Usa 'encender' o 'apagar'.")


def mostrar_mensaje(mensaje):
    lcd.clear()
    lcd.putstr(mensaje)

def sonar_zumbador():
    buzzer.value(1)
    time.sleep(1000)
    buzzer.value(0)


def init():
    for fila in range(0,4):
        for columna in range(0,4):
            fila_pines[fila].low()


def scan(fila, columna):
    """ escanea todo el teclado """

    # define la columna actual en alto -high-
    fila_pines[fila].high()
    tecla = None

    # verifica por teclas si hay teclas presionadas
    if columna_pines[columna].value() == TECLA_ABAJO:
        tecla = TECLA_ABAJO
    if columna_pines[columna].value() == TECLA_ARRIBA:
        tecla = TECLA_ARRIBA
    fila_pines[fila].low()

    # devuelve el estado de la tecla
    return tecla

print("Listo en espera")

valorBool = True

# define todas las columnas bajo -low-
init()
control_led("encender")
while True:
    
    if  valorBool == True:
        mensaje_bienvenida = "Ingrese una     Contrasena!"
        mostrar_mensaje(mensaje_bienvenida)
    
    if pir.value() == 1:
        print("Movimiento detectado")
        control_led("apagar")
        control_led2("encender")
        buzzer= PWM(Pin(18))
        buzzer.freq(500)
        buzzer.duty_u16(8000)
        sleep(1)
        buzzer.duty_u16(0)

    else:
        print("No se ha detectado movimiento")
        control_led2("apagar")
        control_led("encender")

        time.sleep(1)
    for fila in range(4):
        for columna in range(4):
            tecla = scan(fila, columna)
            if tecla == TECLA_ABAJO:
                
                sleep(0.5)
                ultima_tecla_presionada = teclas[fila][columna]
                if ultima_tecla_presionada == "*":
                    # Comprobar la contraseña
                    contraseña_correcta = "1234"  # Cambiar por tu contraseña deseada

                    if ''.join(teclas_presionadas) == contraseña_correcta:
                        control_led("apagar")
                        control_led2("encender")

                        print("Contraseña correcta!")
                        mensaje_bienvenida = "Contrasena      correcta!"
                        mostrar_mensaje(mensaje_bienvenida)
                        time.sleep(1)
                        lcd.clear()
                        buzzer= PWM(Pin(18))
                        buzzer.freq(500)
                        buzzer.duty_u16(8000)
                        sleep(1)
                        buzzer.duty_u16(0)

                        
                        control_led2("apagar")
                        valorBool=True
                    else:
                        print("Contraseña incorrecta!")
                        mensaje_incorrecto = "Contrasena      incorrecta!"
                        
                        mostrar_mensaje(mensaje_incorrecto)
                
                        time.sleep(1)
                        lcd.clear()
                    # Reiniciar la lista de teclas presionadas
                    teclas_presionadas = []
                else:
                    # Agregar la tecla presionada a la lista
                    if ultima_tecla_presionada  == "#" or valorBool == False:
                        valorBool=False
                        lcd.clear()
                        if ultima_tecla_presionada  != "#":                    
                            teclas_presionadas.append(ultima_tecla_presionada)
                    # Convertir la lista de teclas presionadas en una cadena
                            teclas_ingresadas = ''.join(teclas_presionadas)
                            print("Teclas ingresadas:", teclas_ingresadas)
                            mostrar_mensaje(teclas_ingresadas)





$abcdeabcde151015202530354045505560fghijfghij
BOOTSELLED1239USBRaspberryPiPico©2020RP2-8020/21P64M15.00TTT