Instantly share code, notes, and snippets.
Last active Nov 23, 2020
CircuitPython Mute Button
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# SPDX-FileCopyrightText: 2020 John Furcean | |
# SPDX-License-Identifier: MIT | |
import time | |
import board | |
from digitalio import DigitalInOut, Direction, Pull | |
import usb_hid | |
from adafruit_hid.keyboard import Keyboard | |
from adafruit_hid.keyboard_layout_us import KeyboardLayoutUS | |
from adafruit_hid.keycode import Keycode | |
import neopixel | |
# time you want to hold the button down before it changes states | |
BUTTON_HOLD_TIME = 1 | |
# initialize onboard neopixel | |
# this will be used to indiciate what application is enabled | |
rgb_led = neopixel.NeoPixel(board.NEOPIXEL, 1) | |
rgb_led.brightness = 1.0 | |
rgb_led[0] = (0, 0, 0) | |
kbd = Keyboard(usb_hid.devices) | |
# This will be used to indicate if muted or not | |
# please note that an individual will have to make sure it is synced with the application | |
button_led = DigitalInOut(board.D0) | |
button_led.direction = Direction.OUTPUT | |
# Digital input with pullup on D1 | |
button1 = DigitalInOut(board.D1) | |
button1.direction = Direction.INPUT | |
button1.pull = Pull.UP | |
# Defines what the different states of the buttons will do | |
# Note: in order for the code to work appropriately, | |
# the keys need to start at 0 and increment upwards. | |
# Single keycodes commands need to have a trailing comma (,) | |
# the below keycode commands are for Mac and will need to be | |
# modified for Windows or Linux | |
controller_buttons = { | |
0 : { | |
'name': 'Space Bar', | |
'keycode': (Keycode.SPACE,), | |
'color':(0, 0, 0) | |
}, | |
1 : { | |
'name': 'Zoom Mute', | |
'keycode': (Keycode.COMMAND, Keycode.SHIFT, Keycode.A), | |
'color':(0, 0, 205) | |
}, | |
2 : { | |
'name': 'Teams Mute', | |
'keycode': (Keycode.COMMAND, Keycode.SHIFT, Keycode.M), | |
'color':(120, 0, 255) | |
} | |
} | |
button1_in = False | |
button_index = 0 | |
change_button = False | |
while True: | |
# retreive the active controller button | |
controller_button = controller_buttons[button_index%len(controller_buttons)] | |
# set the color of the onboard neopixel to match the active controller button | |
rgb_led[0] = controller_button['color'] | |
# detect if the button is recently pressed in | |
if not button1.value and not button1_in: | |
button_led.value = not button_led.value | |
button1_in = True | |
start_hold = time.monotonic() | |
# detect if the button is being held down | |
if not button1.value and button1_in: | |
time_now = time.monotonic() | |
# change the state of the button controller if | |
# the button has been held down for BUTTON_HOLD_TIME or more seconds | |
if time_now - start_hold > BUTTON_HOLD_TIME and not change_button: | |
print('Change State') | |
button_index += 1 | |
start_hold = time.monotonic() | |
button_led.value = False | |
change_button = True | |
# detect if the button has been released | |
if button1.value and button1_in: | |
# execute the keyboard commands for the active button controller | |
# if state of button controller hasn't been changed | |
if not change_button: | |
print("{} button press".format(controller_button['name'])) | |
kbd.send(*controller_button['keycode']) | |
# reset the change_button boolean if the state has been changed | |
else: | |
change_button = False | |
# update the state of the button1_in Boolean | |
button1_in = False | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment