Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import time
- import board
- import busio
- import digitalio
- import rotaryio
- import usb_hid
- import usb_cdc
- import adafruit_ssd1306
- from adafruit_hid.consumer_control import ConsumerControl
- from adafruit_hid.consumer_control_code import ConsumerControlCode
- from adafruit_hid.keyboard import Keyboard
- from adafruit_hid.keycode import Keycode
- # Setup I2C for OLED (SCL = D13, SDA = D12)
- i2c = busio.I2C(board.D13, board.D12)
- display = adafruit_ssd1306.SSD1306_I2C(128, 32, i2c)
- # Setup HID and Serial
- consumer_control = ConsumerControl(usb_hid.devices)
- keyboard = Keyboard(usb_hid.devices)
- serial = usb_cdc.console
- # Setup Rotary Encoders (only second one works)
- encoder_brightness = rotaryio.IncrementalEncoder(board.D5, board.D6)
- button_brightness_mute = digitalio.DigitalInOut(board.D7)
- button_brightness_mute.direction = digitalio.Direction.INPUT
- button_brightness_mute.pull = digitalio.Pull.UP
- encoder_vol = rotaryio.IncrementalEncoder(board.D8, board.D9)
- button_vol_mute = digitalio.DigitalInOut(board.D4)
- button_vol_mute.direction = digitalio.Direction.INPUT
- button_vol_mute.pull = digitalio.Pull.UP
- last_position_vol = encoder_vol.position
- last_position_brightness = encoder_brightness.position
- # Clear OLED and display initial message
- display.fill(0)
- display.text("Waiting for host...", 0, 0, 1)
- display.show()
- print("KB2040 HID & OLED Ready")
- while True:
- # Read Serial Data and Update OLED
- if serial.in_waiting > 0:
- received_data = serial.read(serial.in_waiting).decode().strip()
- print(f"BATT: {received_data}%")
- # Update OLED Display
- display.fill(0)
- display.text("BATT: " + received_data[:20] + "%", 0, 0, 1)
- display.show()
- # Check Volume Encoder
- position_vol = encoder_vol.position
- if position_vol > last_position_vol:
- print("Volume Up")
- consumer_control.send(ConsumerControlCode.VOLUME_INCREMENT)
- elif position_vol < last_position_vol:
- print("Volume Down")
- consumer_control.send(ConsumerControlCode.VOLUME_DECREMENT)
- last_position_vol = position_vol
- # Check Mute Button for Volume
- if not button_vol_mute.value:
- print("Mute Toggle")
- consumer_control.send(ConsumerControlCode.MUTE)
- time.sleep(0.3) # Debounce
- # Check Brightness Encoder
- position_brightness = encoder_brightness.position
- if position_brightness > last_position_brightness:
- print("Brightness Up")
- consumer_control.send(ConsumerControlCode.BRIGHTNESS_INCREMENT)
- elif position_brightness < last_position_brightness:
- print("Brightness Down")
- consumer_control.send(ConsumerControlCode.BRIGHTNESS_DECREMENT)
- last_position_brightness = position_brightness
- # Check Button for Brightness Encoder (Send Ctrl+Alt+Del)
- if not button_brightness_mute.value:
- print("Sending Ctrl+Alt+Del")
- keyboard.press(Keycode.CONTROL, Keycode.ALT, Keycode.DELETE)
- keyboard.release_all()
- time.sleep(0.3) # Debounce
- time.sleep(0.05) # Keep loop responsive
Advertisement
Add Comment
Please, Sign In to add comment