Skip to content

Instantly share code, notes, and snippets.

@KeitetsuWorks
Forked from HaxNobody/ZoomMuteButton.ino
Last active April 6, 2022 12:54
Show Gist options
  • Save KeitetsuWorks/15b8a7303a0f979dfccbacb80769198c to your computer and use it in GitHub Desktop.
Save KeitetsuWorks/15b8a7303a0f979dfccbacb80769198c to your computer and use it in GitHub Desktop.
Physical mute button for Microsoft Teams using an ATTiny85/Digispark and the Micronucleus bootloader to allow programming with the Arduino IDE
/*
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 and add comments for my own
understanding
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.
* A momentary press on button 2 will toggle video on or off.
Unfortunately, exiting a meeting with only key presses is no longer possible in
Zoom, so I have removed that feature.
*/
#include <DigiKeyboard.h> // Library for sending keystrokes as an HID device over USB
#include <FastLED.h> // Library for controlling LEDs with high speed math
#include <OneButton.h> // Library for button input functions
#define LedBreatheSpeed 12 // Speed of LED breathing animation in BPM
#define LedMinBrightness 5 // Minimum brightness value
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
button2.attachClick(
button2click); // Set up button 2 for Zoom video toggle function
button1.setPressTicks(300); // 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();
analogWrite(
1, beatsin8(LedBreatheSpeed, LedMinBrightness)); // Make LED "breathe"
}
// 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(
KEY_M,
MOD_SHIFT_LEFT | MOD_CONTROL_LEFT); // Toggle mute on or off in Teams
}
// This function will be called when button 2 is pressed for more than 50ms and
// less than 300ms.
void button2click() {
DigiKeyboard.sendKeyStroke(0); // Clear any current key presses
DigiKeyboard.sendKeyStroke(
KEY_O,
MOD_SHIFT_LEFT | MOD_CONTROL_LEFT); // Toggle video on or off in Teams
}
// 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.sendKeyPress(
KEY_SPACE,
MOD_CONTROL_LEFT); // Press and hold the ctrl + space keys to
// trigger zoom to temporarily unmute
}
// 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