One Button Switch Keyboard

Hello, I just want to make one button that triggers an action on my Mac OSX 13.5.2 M2.

I have connected one push button to PIN 2 and GND. As stated on the Arduino Sample Sketch.
When I push the button, it should trigger the keyboard shift+command+m

I used this code for that:

/*

  Keyboard logout

  This sketch demonstrates the Keyboard library.

  When you connect pin 2 to ground, it performs a logout.

  It uses keyboard combinations to do this, as follows:

  On Windows, CTRL-ALT-DEL followed by ALT-l

  On Ubuntu, CTRL-ALT-DEL, and ENTER

  On OSX, CMD-SHIFT-q

  To wake: Spacebar.

  Circuit:

  - Arduino Leonardo or Micro

  - wire to connect D2 to ground

  created 6 Mar 2012

  modified 27 Mar 2012

  by Tom Igoe

  This example is in the public domain.

  https://www.arduino.cc/en/Tutorial/KeyboardLogout

*/

#define OSX 0
#define WINDOWS 1
#define UBUNTU 2

#include "Keyboard.h"

// change this to match your platform:
int platform = OSX;

void setup() {

  // make pin 2 an input and turn on the pull-up resistor so it goes high unless

  // connected to ground:

  pinMode(2, INPUT_PULLUP);

  Keyboard.begin();
}

void loop() {

  while (digitalRead(2) == HIGH) {

    // do nothing until pin 2 goes low

    delay(500);

  }

  delay(1000);

  switch (platform) {

    case OSX:

      Keyboard.press(KEY_LEFT_GUI);

      // Shift-Q logs out:

      Keyboard.press(KEY_LEFT_SHIFT);

      Keyboard.press('W');

      delay(100);

      Keyboard.releaseAll();

      // enter:

      Keyboard.write(KEY_RETURN);

      break;

    case WINDOWS:

      // CTRL-ALT-DEL:

      Keyboard.press(KEY_LEFT_CTRL);

      Keyboard.press(KEY_LEFT_ALT);

      Keyboard.press(KEY_DELETE);

      delay(100);

      Keyboard.releaseAll();

      // ALT-l:

      delay(2000);

      Keyboard.press(KEY_LEFT_ALT);

      Keyboard.press('l');

      Keyboard.releaseAll();

      break;

    case UBUNTU:

      // CTRL-ALT-DEL:

      Keyboard.press(KEY_LEFT_CTRL);

      Keyboard.press(KEY_LEFT_ALT);

      Keyboard.press(KEY_DELETE);

      delay(1000);

      Keyboard.releaseAll();

      // Enter to confirm logout:

      Keyboard.write(KEY_RETURN);

      break;

  }

  // do nothing:

  while (true);
}

The strange thing is when I connect to my Mac and push the trigger. It does this shift+command+m once and then not going back when I push it again. The purpose is it should trigger mic off and on with one button.

How can I achieve this? Adapting the code using another code?

At the end of loop your code stucks forever.

Thanks for your help! So it means it only works once? So when I am deleting it it should work?

Yes and Yes

Be aware that you would not be the first one who experiences issues because you forgot to release the keys that were pressed. Or who will be spamming the computer with keystrokes (Keyboard.press()) or prints (Keyboard.print())

I suggest that you build in a safety guard during the development. In below (demo) example, I used pin A1 (but it can be any pin). If the pin is not connected to ground, the code will not send keypresses to the computer (and it will release any keys that might be pressed); if the pin is connected to ground, it enables the sending of key presses.

#include <Keyboard.h>
#define SAFETY_ENABLED HIGH
const uint8_t safetyPin = A1;

void setup()
{
  Serial.begin(115200);
  while (!Serial);

  pinMode(safetyPin, INPUT_PULLUP);
}

void loop()
{
  static bool isPressed = false;
  // check if the safetyPin is connected to ground
  if (digitalRead(safetyPin) != SAFETY_ENABLED)
  {
    // press the left shift key once
    if (isPressed == false)
    {
      Keyboard.press(KEY_LEFT_SHIFT);
      isPressed = true;
      Serial.println("Key pressed");
    }
  }
  // if the safety pin is not connected to ground
  else
  {
    // release any key that might be stuck
    Keyboard.releaseAll();
    Serial.println("All keys released");
    isPressed = false;
  }

  delay(500);
}

Hello all,

I used another code, and it is working like a charm:

#include "Keyboard.h"

const int buttonPin = 2;
int buttonState = 0;
int prevButtonState = HIGH;

void setup() {
  pinMode(buttonPin, INPUT_PULLUP);
  digitalWrite(buttonPin, HIGH);
  Keyboard.begin();
}

void loop() {
  buttonState = digitalRead(buttonPin);
  if ((buttonState != prevButtonState) && (buttonState == HIGH)) {
    Keyboard.press(KEY_LEFT_GUI); // Command key in Mac, use KEY_LEFT_CTRL for Pc
    Keyboard.press('M');
    delay(100);
    Keyboard.releaseAll(); // This is important after every Keyboard.press it will continue to be pressed
  }
  prevButtonState = buttonState;
}

I do not understand how I have to code it when I want to add more buttons? Any tutorials here?