# .';:cc;. # .,',;lol::c. # ;';lddddlclo # lcloxxoddodxdool:,. # cxdddxdodxdkOkkkkkkkd:. # .ldxkkOOOOkkOO000Okkxkkkkx:. # .lddxkkOkOOO0OOO0000Okxxxxkkkk: # 'ooddkkkxxkO0000KK00Okxdoodxkkkko # .ooodxkkxxxOO000kkkO0KOxolooxkkxxkl # lolodxkkxxkOx,. .lkdolodkkxxxO. # doloodxkkkOk .... .,cxO; # ddoodddxkkkk: ,oxxxkOdc'..o' # :kdddxxxxd, ,lolccldxxxkkOOOkkkko, # lOkxkkk; :xkkkkkkkkOOO000OOkkOOk. # ;00Ok' 'O000OO0000000000OOOO0Od. # .l0l.;OOO000000OOOOOO000000x, # .'OKKKK00000000000000kc. # .:ox0KKKKKKK0kdc,. # ... # # Author: peppe8o # Blog: https://peppe8o.com # Date: Oct 05th, 2024 # Version: 1.0 from machine import Pin clk_pin = 16 dt_pin = 17 sw_pin = 18 clk_pin = Pin(clk_pin, Pin.IN, Pin.PULL_DOWN) dt_pin = Pin(dt_pin, Pin.IN, Pin.PULL_DOWN) sw_pin = Pin(sw_pin, Pin.IN, Pin.PULL_UP) rot_log=[[1, 1]] cw_path = [[1, 0], [0, 0], [0, 1], [1, 1]] ccw_path = [[0, 1], [0, 0], [1, 0], [1, 1]] counter = 0 def button_pressed(chn): global counter counter = 0 print("Reset counter. New value: ",counter) return def rotation_detected(chn): global last_log global rot_log global cw_path global ccw_path global counter last_log = [clk_pin.value(), dt_pin.value()] if last_log != rot_log[len(rot_log)-1]: rot_log.append(last_log) rot_log=rot_log[-len(cw_path):] if rot_log == cw_path: counter += 1 print(counter) if rot_log == ccw_path: counter -= 1 print(counter) return True sw_pin.irq(trigger=Pin.IRQ_FALLING,handler=button_pressed) clk_pin.irq(trigger=Pin.IRQ_RISING | Pin.IRQ_FALLING, handler=rotation_detected) dt_pin.irq(trigger=Pin.IRQ_RISING | Pin.IRQ_FALLING, handler=rotation_detected) while True: pass