#Menu con despliegue en LCD y un esquema de interacción
#
#Pograma editado por:BLANCO CERON JOSUE ANDRE, CASTILLO LOPEZ DONALDO, RAFAEL ZAMUDIO
#
# Xalapa, Veracruz, México
#
# 2023 - Septiembre
#
from machine import Pin, SoftI2C, PWM
from time import sleep
from lcd_api import LcdApi
from i2c_lcd import I2cLcd
import dht
import time
import machine
import dht
from HC1SR04 import HCSR04
import utime
#creando objetos para la lcd
I2C_ADDR = 0x27
totalRows = 4 #cantidad de filas
totalColumns = 20 #cantidad de columnas
i2c = SoftI2C (scl=Pin(22), sda=Pin(21)) #inicio de la i2c
lcd = I2cLcd (i2c, I2C_ADDR, totalRows, totalColumns)
# Configura los pines de los botones
boton1 = machine.Pin(12, machine.Pin.IN, machine.Pin.PULL_UP) # Reemplaza los números de pin por los adecuados
boton2 = machine.Pin(13, machine.Pin.IN, machine.Pin.PULL_UP)
boton3 = machine.Pin(14, machine.Pin.IN, machine.Pin.PULL_UP)
boton4 = machine.Pin(15, machine.Pin.IN, machine.Pin.PULL_UP)
pin_dht22 = 4 # Pin del sensor DHT22
pin_buzzer = 5
buzzer = machine.Pin(pin_buzzer, machine.Pin.OUT)
sensor_dht = dht.DHT22(machine.Pin(pin_dht22))
buzzer = machine.Pin(pin_buzzer, machine.Pin.OUT)
sensor_ultrasonico = HCSR04(trigger_pin= 25 , echo_pin= 23)
# Incorporamos el parámetro para mostrar el nombre del menú
def mostrar_menu(nombre, opciones):
lcd.putstr(nombre)
lcd.move_to(0, 1)
lcd.putstr('Seleccione opción:')
for clave in sorted(opciones):
lcd.move_to(0, opciones[clave][2])
lcd.putstr(f'{clave}) {opciones[clave][0]}')
#Damos valores para cada boton y nos de un retorno
def leer_opcion(opciones):
while True:
if not boton1.value():
return '1'
elif not boton2.value():
return '2'
elif not boton3.value():
return '3'
elif not boton4.value():
return '4'
#Ejecutamos las opciones
def ejecutar_opcion(opcion, opciones):
opciones[opcion][1]()
# Incorporamos el parámetro para mostrar el nombre del menú
def mostrar_menu(nombre, opciones):
for clave in sorted(opciones):
lcd.move_to(0, opciones[clave][2])
lcd.putstr(f'{opciones[clave][0]}')
def button_pressed_isr(pin):
def leer_opcion(opciones):
# Lee el botón o encoder rotativo para obtener la opción seleccionada
while True:
# Puedes utilizar aquí las funciones específicas de tu hardware para obtener la entrada del usuario
opcion = obtener_entrada_usuario()
if opcion in opciones:
return opcion
def ejecutar_opcion(opcion, opciones):
opciones[opcion][1]()
# Incorporamos el parámetro para mostrar el nombre del menú
def generar_menu(nombre, opciones, opcion_salida):
opcion = None
while opcion != opcion_salida:
mostrar_menu(nombre, opciones) # Muestra el Menú
opcion = leer_opcion(opciones) # Lee la entrada del usuario
ejecutar_opcion(opcion, opciones) # Ejecuta la opción seleccionada
# ESTRUCTURA del MENÚ
def menu_principal():
lcd.putstr('Menu Principal')
opciones = {
'1': ('***Ingresar ', menu_principal, 1), # Acción de una llamada a un...
'2': (' Esperar ', menuuu, 2), # submenu que genera un...
'3': (' ', Espera, 3), # nuevo menú
'4': ('', menu_principal, 0), # nuevo menú
}
generar_menu('Menu principal', opciones, 'x') # Nombre del menú
def Espera():
lcd.putstr('menu principal')
opciones = {
'1': (' ', menu_principal, 1), # Acción de una llamada a un...
'2': ('***', esperarr, 2), # submenu que genera un...
'3': (' ', Espera, 3), # nuevo menú
'4': ('', menu_principal, 0), # nuevo menú
}
generar_menu('Menu principal', opciones, 'x') # Nombre del menú
def esperarr():
lcd.putstr(' menu principal')
opciones = {
'1': (' ', menu_principal, 1), # Acción de una llamada a un...
'2': (' ', menu_principal, 2), # submenu que genera un...
'3': (' ', menu_principal, 3), # nuevo menú
'4': (' ', menu_principal, 0), # nuevo menú
}
generar_menu('Menu principal', opciones, 'x') # Nombre del menú
def menuuu():
lcd.putstr(' Menu principal')
opciones = {
'1': (' Encendersensor', menu_principal, 1), # Acción de una llamada a un...
'2': (' EncenderBuzzer', menuu, 2), # submenu que genera un...
'3': (' EncenderModulo', menuu, 3), # nuevo menú
'4': ('', menuu, 0), # nuevo menú
}
generar_menu('Menu principal', opciones, 'x') # Nombre del menú
def menuu():
opciones = {
'1': ('***EncenderSensor', menu_principal, 1), # Acción de una llamada a un...
'2': (' EncenderBuzzer', sondear_temperatura, 2), # submenu que genera un...
'3': (' EncenderModulo', menux, 3), # nuevo menú
'4': (' Menu principal ', menuu, 0),
}
generar_menu('', opciones, 'x') # Nombre del menú
def menux():
opciones = {
'1': (' EncenderSensor', menu_principal, 1), # Acción de una llamada a un...
'2': ('***EncenderBuzzer', activar_bocina, 2), # submenu que genera un...
'3': (' EncenderModulo', menu2, 3), # nuevo menú
'4': (' Menu principal ', menuu, 0),
}
generar_menu('', opciones, 'x') # Nombre del menú
def menu2():
opciones = {
'1': (' EncenderSensor', menu_principal, 1), # Acción de una llamada a un...
'2': (' EncendeBUzzer', activar_sensor_ultrasonico, 2), # submenu que genera un...
'3': ('***EncenderModulo', menu2, 3), # nuevo menú
'4': (' Menu principal ', menux, 0),
}
generar_menu('', opciones, 'x') # Nombre del menú
# Función para controlar la bocina
def activar_bocina():
# Enciende la bocina durante 2 segundos (ajusta el tiempo según tus necesidades)
buzzer.value(1)
utime.sleep(2)
buzzer.value(0)
lcd.clear()
lcd.putstr("Bocina activada")
print("Bocina activada")
lcd.clear()
# Función para ejecutar el módulo de ultrasonido
def activar_sensor_ultrasonico():
distancia = sensor_ultrasonico.distance_cm()
lcd.clear()
lcd.putstr("Distancia: {} cm".format(distancia))
print("Distancia: {} cm".format(distancia))
lcd.clear()
# Función para sondear la temperatura
def sondear_temperatura():
lcd.clear()
sensor_dht.measure()
temperatura = sensor_dht.temperature()
lcd.putstr("Temperatura: {}C".format(temperatura))
print("Temperatura: {}°C".format(temperatura))
utime.sleep(1)
lcd.clear()
if __name__ == '__main__':
menu_principal()