from machine import I2C, Pin
from lcd_api import LcdApi
from pico_i2c_lcd import I2cLcd
from keypad_utp import KeyPad
import time
# Constantes para configurar el sistema
LCD_I2C_ADDR = 0x27
LCD_COLUMNS = 16
LCD_ROWS = 2
# Inicializar la interfaz I2C y la pantalla LCD
i2c = I2C(scl=Pin(22), sda=Pin(21))
lcd = I2cLcd(i2c, LCD_I2C_ADDR, LCD_ROWS, LCD_COLUMNS)
# Configurar las teclas del teclado matricial
teclas = [
'1', '2', '3', '+',
'4', '5', '6', '-',
'7', '8', '9', '*',
'.', '0', '=', '/',
]
# Inicializar el teclado matricial
keypad = KeyPad(r1=19, r2=18, r3=5, r4=4, c1=13, c2=12, c3=14, c4=27, keys=teclas)
keypad.start()
# Función para mostrar mensajes en la pantalla LCD
def display_message(message, line=0, clear=False):
if clear:
lcd.clear()
lcd.move_to(0, line)
lcd.putstr(message)
# Función para evaluar la operación
def evaluate(operation):
try:
# Utiliza eval() para calcular la operación. Es importante asegurarse de que la entrada es segura antes de usar eval().
result = eval(operation)
return str(result)
except:
return "Error"
# Mensaje inicial en la pantalla LCD
display_message("Operar:", clear=True)
# Variable para almacenar la operación completa
operation = ""
try:
while True:
key = keypad.get_key() # Obtener la última tecla presionada
if key:
# Si la tecla es '=', entonces evaluar la operación
if key == '=':
if operation:
result = evaluate(operation)
display_message(operation + "=" + result, clear=True)
operation = "" # Reiniciar la operación para empezar de nuevo
time.sleep(2) # Pausa para ver el resultado
display_message("Operar:", clear=True)
else:
# Añadir la tecla presionada a la operación
operation += key
display_message(operation, line=1)
time.sleep(0.1)
finally:
keypad.stop()