############################
# E029_ROTARY_DECODER.PY: Gestiona un decodificador giratorio
# ENTRADAS: Giro del decoficador y estado del pulsador reinicio
# SALIDAS: Contador de giro y LED de crecimiento/decrecimiento
############################
'''
CONEXIONES DECODIFICADOR GIRATORIO
KY-040© ESP32© Observaciones
-----------------------------------------
1 GND GND Tierra
2 +3.3V +3.3V Alimentación
3 SW GPIO25 Pulsador
4 DT GPIO32 Detección de giro
5 CLK GPIO35 Sentido del giro
'''
from machine import Pin # Gestión de GPIO
import time # Control de tiempos
# Definición de GPIO en el ESP32©
pin_DT = 32 # GPIO32 DT o datos
pin_CLK = 35 # GPIO35 CLK o reloj
pin_SW = 25 # GPIO25 SW o pulsador
led_r = 27 # GPIO27 LED Rojo
led_v = 26 # GPIO26 LED Verde
# Variables globales
contador = 0 # Contador de giro
ultimo_estado_CLK = 0 # Último estado de CLK
paso = 1 # Incremento/decremento del contador
cambio = False # Cambio de sentido
# Función de configuración inicial
def setup():
# LED como salida y apagados
for pin in [led_r, led_v]:
Pin(pin, Pin.OUT).value(0)
# Configurar pines de entrada
Pin(pin_DT, Pin.IN)
Pin(pin_CLK, Pin.IN)
# Configurar pin_SW como entrada con pull-up y establecer interrupción flanco de bajada
Pin(pin_SW, Pin.IN, Pin.PULL_UP).irq(trigger=Pin.IRQ_FALLING, handler=clear)
Pin(pin_DT, Pin.IN, Pin.PULL_UP).irq(trigger=Pin.IRQ_FALLING, handler=girando)
# Función para manejar el giro del codificador giratorio
def girando(_): # Se debe añadir un argumento
global contador, paso, ultimo_estado_CLK, cambio
# Lee el estado actual de CLK
actual_estado_CLK = Pin(pin_CLK).value() # Estado CLK
if ultimo_estado_CLK == 0 and actual_estado_CLK == 1:
contador=contador-paso # Decremento contador
print('Giro ANTI HORARIO')
Pin(led_r).value(1) # Enciendo LED rojo
Pin(led_v).value(0) # Apago LED verde
if ultimo_estado_CLK == 1 and actual_estado_CLK == 1:
Pin(led_r).value(1)
if cambio: # Cambio de sentido
print('GIRO ANTI HORARIO')
cambio = not cambio # Evita repetir texto
contador=contador-paso
if ultimo_estado_CLK == 1 and actual_estado_CLK == 0:
contador=contador+paso # Incremento contador
print('Giro HORARIO')
Pin(led_r).value(0) # Apago LED rojo
Pin(led_v).value(1) # Enciendo LED verde
if ultimo_estado_CLK == 0 and actual_estado_CLK == 0:
Pin(led_v).value(1)
if not cambio: # Cambio de sentido
print('Giro HORARIO')
cambio = not cambio # Evita repetir texto
contador=contador+paso
print('contador = %d' % contador)
ultimo_estado_CLK=actual_estado_CLK # Actualizo último estado
# Función para manejar la interrupción del pulsador de reinicio
def clear(_): # Se debe añadir un argumento
global contador, cambio
cambio = not cambio # Reinicio flag
print('\n' * 20) # Imprime líneas en blanco para limpiar la pantalla
Pin(led_r).value(0) # Apaga LED rojo
Pin(led_v).value(0) # Apaga LED verde
print('CONTROL DECODIFICADOR GIRATORIO CON PULSADOR')
print('Girar mando o pulsar botón...')
contador = 0 # Restablece el contador
print('Contador = %d' % contador)
# Bucle principal
def loop():
#print('\n' * 20) # Imprime líneas en blanco para limpiar la pantalla
print('Girar mando o pulsar botón...')
while True:
time.sleep(0.01) # Simula bucle principal
# Para detener el programa
def parar():
Pin(led_r).value(0) # Apaga LED rojo
Pin(led_v).value(0) # Apaga LED verde
# Punto de entrada principal
if __name__ == '__main__':
print('\n' * 20) # Imprime léneas en blanco para limpiar la pantalla
print('CONTROL DECODIFICADOR GIRATORIO CON PULSADOR')
setup() # Configuración inicial
try:
loop() # Llama al bucle principal
except KeyboardInterrupt:
parar() # Detiene el programa