#include <Wire.h> /*~ Librería I2C ~*/
#include <LiquidCrystal_I2C.h> /*~ Librería LCD ~*/
import time
from machine import Pin
from machine import I2C
import dht
import servo
from machine import PWM
# Inicializar el teclado matricial en la parte derecha del ESP32
filas = [Pin(12, Pin.IN, Pin.PULL_UP), Pin(13, Pin.IN, Pin.PULL_UP), Pin(14, Pin.IN, Pin.PULL_UP), Pin(15, Pin.IN, Pin.PULL_UP)]
columnas = [Pin(25, Pin.OUT), Pin(26, Pin.OUT), Pin(27, Pin.OUT), Pin(32, Pin.OUT)]
# Inicializar el sensor DHT11
sensor_dht = dht.DHT11(Pin(4))
# Inicializar el servo
pin_servo = Pin(23)
pwm_servo = PWM(pin_servo, freq=50)
motor_servo = servo.Servo(pwm_servo)
# Inicializar el motor paso a paso
pin_motor_habilitar = Pin(16, Pin.OUT)
pin_motor_direccion = Pin(17, Pin.OUT)
pin_motor_paso = Pin(18, Pin.OUT)
pin_motor_habilitar.value(1) # Habilitar el motor
def mover_motor_pasos(pasos, direccion):
pin_motor_direccion.value(direccion)
for _ in range(pasos):
pin_motor_paso.value(1)
time.sleep_us(500) # Ajustar el tiempo según tu motor
pin_motor_paso.value(0)
time.sleep_us(500) # Ajustar el tiempo según tu motor
# Definir las opciones del menú con letras
opciones_menu = ['a. Temperatura', 'b. Servo', 'c. Motor Paso a Paso', 'd. Salir']
opcion_actual = 0
# Función para mostrar el menú en la LCD
def mostrar_menu(opcion):
lcd.clear()
lcd.move_to(0, 0)
lcd.putstr("Menu:")
lcd.move_to(0, 1)
lcd.putstr(opciones_menu[opcion])
# Inicializar la LCD (debes proporcionar la configuración correcta)
# Aquí se supone una configuración de I2C como ejemplo
i2c = I2C(0, sda=Pin(21), scl=Pin(22), freq=400000)
import ssd1306
lcd = ssd1306.SSD1306_I2C(128, 64, i2c)
# Bucle principal
while True:
# Mostrar el menú en la LCD
mostrar_menu(opcion_actual)
# Esperar hasta que se presione una tecla
tecla = None
while tecla is None:
for i in range(4):
columnas[i].value(0)
for j in range(4):
if filas[j].value() == 0:
tecla = (i, j)
columnas[i].value(1)
# Determinar la opción seleccionada
opcion_seleccionada = tecla[0] + tecla[1] * 4
# Actualizar la opción actual si se presiona una tecla válida
if 0 <= opcion_seleccionada < len(opciones_menu):
opcion_actual = opcion_seleccionada
# Mostrar la opción seleccionada en la LCD
mostrar_menu(opcion_actual)
# Esperar a que se presione la tecla de entrada (asterisco)
while True:
for i in range(4):
columnas[i].value(0)
for j in range(4):
if filas[j].value() == 0:
tecla = (i, j)
columnas[i].value(1)
if tecla == (3, 3): # Asterisco para confirmar
break
# Realizar acciones según la opción seleccionada
if opcion_actual == 0: # Temperatura
sensor_dht.measure()
temperatura = sensor_dht.temperature()
lcd.clear()
lcd.move_to(0, 0)
lcd.putstr("Temperatura:")
lcd.move_to(0, 1)
lcd.putstr(str(temperatura) + "C")
elif opcion_actual == 1: # Servo
lcd.clear()
lcd.move_to(0, 0)
lcd.putstr("Ingrese grados:")
lcd.move_to(0, 1)
lcd.putstr("Giro:")
# Leer la entrada del teclado para los grados
grados = ""
while True:
for i in range(4):
columnas[i].value(0)
for j in range(4):
if filas[j].value() == 0:
tecla = (i, j)
grados += str(tecla[1] + tecla[0] * 4)
columnas[i].value(1)
lcd.move_to(12, 1)
lcd.putstr(" " * 8) # Borrar la pantalla anterior
lcd.move_to(12, 1)
lcd.putstr(grados)
if tecla == (3, 3): # Asterisco para confirmar
try:
grados_int = int(grados)
lcd.move_to(0, 1)
lcd.putstr("Giro:")
if grados_int >= 0:
lcd.putstr("Adelante")
motor_servo.write_angle(grados_int)
else:
lcd.putstr("Atrás")
motor_servo.write_angle(abs(grados_int))
except ValueError:
lcd.move_to(0, 1)
lcd.putstr("Entrada inválida")
break
elif opcion_actual == 2: # Motor Paso a Paso
lcd.clear()
lcd.move_to(0, 0)
lcd.putstr("Pasos:")
lcd.move_to(0, 1)
lcd.putstr("Dirección:")
# Leer la entrada del teclado para los pasos
pasos = ""
direccion = 0 # 0: Adelante, 1: Atrás
while True:
for i in range(4):
columnas[i].value(0)
for j in range(4):
if filas[j].value() == 0:
tecla = (i, j)
if tecla == (0, 0): # Cambiar dirección
direccion = 1 - direccion
elif tecla == (3, 3): # Asterisco para confirmar
try:
pasos_int = int(pasos)
lcd.move_to(0, 1)
lcd.putstr("Dirección:")
if direccion == 0:
lcd.putstr("Adelante")
mover_motor_pasos(pasos_int, 0)
else:
lcd.putstr("Atrás")
mover_motor_pasos(pasos_int, 1)
except ValueError:
lcd.move_to(0, 1)
lcd.putstr("Entrada inválida")
break
else:
pasos += str(tecla[1] + tecla[0] * 4)
columnas[i].value(1)
lcd.move_to(6, 1)
lcd.putstr(" " * 8) # Borrar la pantalla anterior
lcd.move_to(6, 1)
lcd.putstr(pasos)
elif opcion_actual == 3: # Salir
break
}