# 导入必要的库 import RPi.GPIO as GPIO import uinput # 设置GPIO模式为BCM GPIO.setmode(GPIO.BCM) # 定义旋钮按键的引脚 ROTARY_PIN_A = 17 ROTARY_PIN_B = 18 BUTTON_PIN = 27 # 设置旋钮按键的引脚为输入模式,并启用内部上拉电阻 GPIO.setup(ROTARY_PIN_A, GPIO.IN, pull_up_down=GPIO.PUD_UP) GPIO.setup(ROTARY_PIN_B, GPIO.IN, pull_up_down=GPIO.PUD_UP) GPIO.setup(BUTTON_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP) # 创建一个uinput设备,用于模拟键盘 device = uinput.Device([uinput.KEY_TAB, uinput.KEY_LEFTSHIFT, uinput.KEY_SPACE]) # 定义一个变量,用于存储旋钮的状态 rotary_state = 0 # 定义一个回调函数,用于处理旋钮的旋转事件 def rotary_callback(channel): global rotary_state # 读取旋钮的两个引脚的状态 pin_a = GPIO.input(ROTARY_PIN_A) pin_b = GPIO.input(ROTARY_PIN_B) # 根据旋钮的状态,判断旋钮的旋转方向 if pin_a and pin_b: # 旋钮从0到1或从2到3的状态转变,表示顺时针旋转 if rotary_state == 0 or rotary_state == 2: # 模拟按下tab键 device.emit_click(uinput.KEY_TAB) # 旋钮从1到0或从3到2的状态转变,表示逆时针旋转 elif rotary_state == 1 or rotary_state == 3: # 模拟按下tab键+shift键 device.emit_combo([uinput.KEY_TAB, uinput.KEY_LEFTSHIFT]) # 更新旋钮的状态为4,表示旋钮处于稳定状态 rotary_state = 4 elif pin_a and not pin_b: # 旋钮从0到1或从3到0的状态转变,更新旋钮的状态为1 rotary_state = 1 elif not pin_a and pin_b: # 旋钮从1到2或从0到2的状态转变,更新旋钮的状态为2 rotary_state = 2 else: # 旋钮从2到3或从1到3的状态转变,更新旋钮的状态为3 rotary_state = 3 # 定义一个回调函数,用于处理旋钮的按下事件 def button_callback(channel): # 模拟按下space键 device.emit_click(uinput.KEY_SPACE) # 为旋钮的两个引脚添加上升沿触发的事件检测,并指定回调函数 GPIO.add_event_detect(ROTARY_PIN_A, GPIO.RISING, callback=rotary_callback) GPIO.add_event_detect(ROTARY_PIN_B, GPIO.RISING, callback=rotary_callback) # 为旋钮的按键添加下降沿触发的事件检测,并指定回调函数 GPIO.add_event_detect(BUTTON_PIN, GPIO.FALLING, callback=button_callback, bouncetime=200) # 用一个无限循环,让程序保持运行状态 try: while True: pass except KeyboardInterrupt: # 如果用户按下Ctrl+C,退出程序,并清理GPIO GPIO.cleanup()