Last active
March 7, 2021 12:29
-
-
Save kingfisher1234/f0cdadce57856022d0278475b0d39624 to your computer and use it in GitHub Desktop.
Physical mute button for Zoom using an ATTiny85/Digispark and the Micronucleus bootloader to allow programming with the Arduino IDE - PC Version
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
/* | |
Thanks to Elliotmade for the inspiration on this project | |
https://elliotmade.com/2020/04/23/physical-mute-button-for-zoom-meetings/ | |
Refactored by HaxNobody to extend functionalty: | |
https://gist.github.com/HaxNobody/7bde369d7a41348b8b91c1a4f358ea4a#file-zoommutebutton-ino | |
This program will send USB HID keyboard presses to bring the Zoom window into | |
the foreground and activate microphone and video functions. | |
* A momentary press on button 1 will toggle mute on or off. | |
* Press and hold button 1 to activate PTT (Push-to-Talk) functionality. | |
* Press and hold button 1 to close zoom | |
*/ | |
#include <DigiKeyboard.h> // Library for sending keystrokes as an HID device over USB | |
#include <OneButton.h> // Library for button input functions | |
#define LedBreatheSpeed 12 // Speed of LED breathing animation in BPM | |
#define LedMinBrightness 5 // Minimum brightness value | |
#define MOD_CMD_LEFT 0x00000008 | |
#define MOD_LEFTSHIFT 0xe1 | |
OneButton button1( | |
0, // Pin Number | |
true, // Input is active LOW | |
true // Enable internal pull-up resistor | |
); | |
OneButton button2( | |
2, // Pin Number | |
true, // Input is active LOW | |
true // Enable internal pull-up resistor | |
); | |
void setup() { | |
button1.attachClick(button1click); // Set up button 1 for Zoom mute toggle function | |
button1.attachLongPressStart(button1longPressStart); // Set up button 1 for Zoom temporary unmute function | |
button1.attachLongPressStop(button1longPressStop); // Set up button 1 for Zoom temporary unmute release function | |
button1.setPressTicks(1000); // Reduce long-press delay for button 1 to make temporary unmute more responsive | |
DigiKeyboard.delay(50); // Delay before entering loop | |
pinMode(1, OUTPUT); // Initialize LED pin | |
} | |
void loop() { | |
DigiKeyboard.update(); // Maintain USB communication | |
button1.tick(); // Check status of buttons in a continuous loop | |
button2.tick(); | |
} | |
// This function will be called when button 1 is pressed for more than 50ms and less than 300ms. | |
void button1click() { | |
DigiKeyboard.sendKeyStroke(0); // Clear any current key presses | |
DigiKeyboard.sendKeyStroke(0, MOD_SHIFT_LEFT | MOD_CONTROL_LEFT | MOD_ALT_LEFT); // Bring Zoom into foreground | |
DigiKeyboard.delay(50); // Give Zoom a chance to get into the foreground | |
DigiKeyboard.sendKeyStroke(KEY_A, MOD_ALT_LEFT); // Toggle mute on or off in Zoom | |
} | |
// This function will be called when button 1 is pressed and held down for more than 300ms. | |
void button1longPressStart() { | |
DigiKeyboard.sendKeyStroke(0); // Clear any current key presses | |
DigiKeyboard.sendKeyStroke(0, MOD_SHIFT_LEFT | MOD_CONTROL_LEFT | MOD_ALT_LEFT); | |
DigiKeyboard.delay(50); | |
DigiKeyboard.sendKeyStroke(KEY_Q, MOD_ALT_LEFT); | |
DigiKeyboard.delay(50); | |
DigiKeyboard.sendKeyStroke(KEY_ENTER); | |
} | |
// This function will be called when button 1 is released after being held down. | |
void button1longPressStop() { | |
DigiKeyboard.delay(300); // Delay to prevent cutting off the speaker's last word | |
DigiKeyboard.sendKeyPress(0); // Release space key to re-mute Zoom after temporary unmute | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment