Keyboard Shortcut, Qwiic Keypad

Pages
Contributors: santaimpersonator
Favorited Favorite 2

Arduino Example

Note: This tutorial assumes you are familiar with Arduino products and you are using the latest stable version of the Arduino IDE on your desktop. If this is your first time using Arduino, please review our tutorial on installing the Arduino IDE. If you have not previously installed an Arduino library, please check out our installation guide.

Arduino Library

The easiest way to install the Arduino libraries are by searching SparkFun Qwiic Keypad and HID-Project inside the Arduino library manager. To manually install, head on over to their respective GitHub repositories:

or feel free to download the libraries below:

Using the Qwiic Keypad Library

The functionality of the Qwiic Keypad library is pretty straight forward. The example code, primarily draws from the Example1_ReadButton.ino sketch. Below is a quick summary of the library functions that are used in the example code.

  • keypad1.begin()- Used to connect to Qwiic Keypad.
  • keypad1.updateFIFO()- Used to increment the FIFO.
  • char button = keypad1.getButton()- Used to read button press from FIFO with value stored as a character in the variable button.

Using the HID-Project Library

The HID-Project library, built by NicoHood work similarly to the Arduino Keyboard library. It is also compatible with the original key definitions, just make sure you use the name, not the number. (i.e Keyboard.write(0xB0) will not work, use Keyboard.write(KEY_RETURN) instead.)

Button Combinations

To create shortcut using button combinations, find out the button combination for your shortcut. These should be listed in the user manual for your program or operating system; otherwise, the internet is a great resource. Make sure to test that the shortcut works before programming it.

To code your shortcut in Arduino, use the Keyboard.press(Define_Key) function, designating the individual key. To press multiple keys together, call this function again while designating each of the individual keys. Then use Keyboard.releaseAll() to release all the keys pressed at once. Please refer to the ImprovedKeylayouts.h header file from the HID-Project library for the naming convention (or keycode) of each keyboard key.

Example: Ctrl + Alt + F1

Code:

language:c
Keyboard.press(KEY_CTRL);
Keyboard.press(KEY_F1);
Keyboard.press(KEY_ALT);
Keyboard.releaseAll();

Functional Buttons

To create a functional shortcut in Arduino, use the Consumer.write(Define_Key) function, designating the functional key to implement. Please refer to the ConsumerAPI.h header file from the HID-Project library for the naming convention (or keycode) of the available keys.

Example:

Code:

language:c
Consumer.write(MEDIA_VOLUME_DOWN);
delay(50);
Keyboard.releaseAll();

Text String

To type out a string of text in Arduino, use the Keyboard.print("Text") or Keyboard.println("Text") function.

Example Text:
<table>
    <tr>
        <td></td>
        <td></td>
        <td></td>
    </tr>
    <tr>
        <td></td>
        <td></td>
        <td></td>
    </tr>
    <tr>
        <td></td>
        <td></td>
        <td></td>
    </tr>
</table>
Code:
Keyboard.println("<table border=\"1\">");
Keyboard.println("    <tr style=\"padding:10px\">");
Keyboard.println("        <td style=\"padding:10px\" valign=\"center\"></td>");
Keyboard.println("        <td style=\"padding:10px\" valign=\"center\"></td>");
Keyboard.println("        <td style=\"padding:10px\" valign=\"center\"></td>");
Keyboard.println("    </tr>");
Keyboard.println("    <tr style=\"padding:10px\">");
Keyboard.println("        <td style=\"padding:10px\" valign=\"top\"></td>");
Keyboard.println("        <td style=\"padding:10px\"></td>");
Keyboard.println("        <td style=\"padding:10px\"></td>");
Keyboard.println("    </tr>");
Keyboard.println("    <tr style=\"padding:10px\">");
Keyboard.println("        <td></td>");
Keyboard.println("        <td></td>");
Keyboard.println("        <td></td>");
Keyboard.println("    </tr>");
Keyboard.println("</table>");

Example Code

In the example code below I have implemented specific keyboard shortcuts for my personal needs. You will also notice, that in certain instances, I have combined a series of different shortcuts for greater functionality.

language:c
/*
  Hot-Shortcut KeyPad
  By: Wes Furuya
  SparkFun Electronics
  Date: March 27th, 2019
  License: This code is public domain but you buy me a beer if you use this and we meet someday (Beerware license).

  Feel like supporting our work? Buy a board from SparkFun!
  https://www.sparkfun.com/products/14641
  https://www.sparkfun.com/products/14812

  This sketch allows the RedBoard Turbo to emulate a HID keyboard. The buttons on the Qwiic Keypad are set for
  specific keyboard entries. For more details, please refer to the project guide:
  https://learn.sparkfun.com/tutorials/keyboard-shortcut-qwiic-keypad

*/
//#include "Keyboard.h"
#include "HID-Project.h"
#include <Wire.h>

#include "SparkFun_Qwiic_Keypad_Arduino_Library.h" //Click here to get the library: http://librarymanager/All#SparkFun_keypad
KEYPAD keypad1; //Create instance of this object

void setup(void)
{
//  Initializes serial output
//  SerialUSB is used for debug messages to the serial monitor
  SerialUSB.begin(9600);
  delay(3000);
  SerialUSB.println("Qwiic KeyPad Example");

//  Connects Turbo to the Qwiic Keypad
  if (keypad1.begin() == false)   // Note, using begin() like this will use default I2C address, 0x4B. 
                  // You can pass begin() a different address like so: keypad1.begin(Wire, 0x4A).
  {
    SerialUSB.println("Keypad does not appear to be connected. Please check wiring. Freezing...");
    while (1);
  }
  SerialUSB.print("Initialized. Firmware Version: ");
  SerialUSB.println(keypad1.getVersion());
  SerialUSB.println("Press a button: * to do a space. # to go to next line.");

//  Initializes keyboard functions
  Keyboard.begin();
  Consumer.begin();
}

void loop(void)
{
//  Checks for next keypad press
  keypad1.updateFIFO();  // necessary for keypad to pull button from stack to readable register
  delay(50);
  char button = keypad1.getButton();

  if (button == -1)
  {
    SerialUSB.println("No keypad detected");
    delay(1000);
  }
  else if (button != 0)
  {
    SerialUSB.print(button);
    if (button == '1')
    {
      //Mute Button
      Consumer.write(MEDIA_VOLUME_MUTE);
      Keyboard.releaseAll();
    }
    else if (button == '2')
    {
      //Volume Down
      Consumer.write(MEDIA_VOLUME_DOWN);
      Keyboard.releaseAll();
    }
    else if (button == '3')
    {
      //Volume Up
      Consumer.write(MEDIA_VOLUME_UP);
      Keyboard.releaseAll();
    }
    else if (button == '4')
    {
      //Calculator
      Consumer.write(CONSUMER_CALCULATOR);
      Keyboard.releaseAll();
    }
    else if (button == '5')
    {
      //Used custom shortcut to launch Snipping tool
      //In shorcut properties, set to: Ctrl+Alt+Insert
      Keyboard.press(KEY_LEFT_CTRL);
      Keyboard.press(KEY_LEFT_ALT);
      Keyboard.press(KEY_INSERT);
      Keyboard.releaseAll();
    }
    else if (button == '6')
    {
      //Windows Button
      Keyboard.press(KEY_LEFT_WINDOWS);
      Keyboard.releaseAll();
      delay(50);

      //Enters "ter" into search
      Keyboard.println("ter");
      delay(50);

      //Presses enter button to select entry
      //On my computer, this is TeraTerm
      Keyboard.press(KEY_ENTER);
      Keyboard.releaseAll();
    }
    else if (button == '7')
    {
      //Cuts selected entry
      Keyboard.press(KEY_LEFT_CTRL);
      Keyboard.press(KEY_X);
      Keyboard.releaseAll();
      delay(50);

      //Types text
      Keyboard.print("<!-- product_big(");
      delay(50);

      //Pastes entry
      Keyboard.press(KEY_LEFT_CTRL);
      Keyboard.press(KEY_V);
      Keyboard.releaseAll();
      delay(50);

      //Types text
      Keyboard.println(") -->");
      Keyboard.print("<!-- products_by_id(");
      delay(50);

      //Pastes entry
      Keyboard.press(KEY_LEFT_CTRL);
      Keyboard.press(KEY_V);
      Keyboard.releaseAll();
      delay(50);

      //Types text
      Keyboard.println("ID1, ID2) -->");
      Keyboard.println("<div class=\"clearfix\"></div>");
    }
    else if (button == '8')
    {
      //Types text
      Keyboard.println("<table border=\"1\">");
      Keyboard.println("    <tr style=\"padding:10px\">");
      Keyboard.println("        <td style=\"padding:10px\" valign=\"center\"></td>");
      Keyboard.println("        <td style=\"padding:10px\" valign=\"center\"></td>");
      Keyboard.println("        <td style=\"padding:10px\" valign=\"center\"></td>");
      Keyboard.println("    </tr>");
      Keyboard.println("    <tr style=\"padding:10px\">");
      Keyboard.println("        <td style=\"padding:10px\" valign=\"top\"></td>");
      Keyboard.println("        <td style=\"padding:10px\"></td>");
      Keyboard.println("        <td style=\"padding:10px\"></td>");
      Keyboard.println("    </tr>");
      Keyboard.println("    <tr style=\"padding:10px\">");
      Keyboard.println("        <td></td>");
      Keyboard.println("        <td></td>");
      Keyboard.println("        <td></td>");
      Keyboard.println("    </tr>");
      Keyboard.println("</table>");
    }
    else if (button == '9')
    {
      //Cuts selected entry
      Keyboard.press(KEY_LEFT_CTRL);
      Keyboard.press(KEY_X);
      Keyboard.releaseAll();
      delay(50);

      //Types text
      Keyboard.print("<div class=\"alert alert-info\"><b>Note:</b>");
      delay(50);

      //Pastes entry
      Keyboard.press(KEY_LEFT_CTRL);
      Keyboard.press(KEY_V);
      Keyboard.releaseAll();
      delay(50);

      //Types text
      Keyboard.println("</div>");
    }
    else if (button == '*')
    {
      //Cuts selected entry
      Keyboard.press(KEY_LEFT_CTRL);
      Keyboard.press(KEY_X);
      Keyboard.releaseAll();
      delay(50);

      //Types text
      Keyboard.print("-> [![alt text](");
      delay(50);

      //Pastes entry
      Keyboard.press(KEY_LEFT_CTRL);
      Keyboard.press(KEY_V);
      Keyboard.releaseAll();
      delay(50);

      //Types text
      Keyboard.print(")](");
      delay(50);

      //Pastes entry
      Keyboard.press(KEY_LEFT_CTRL);
      Keyboard.press(KEY_V);
      Keyboard.releaseAll();
      delay(50);

      //Types text
      Keyboard.println(") <-");
      Keyboard.println("
*Caption*
"); } else if (button == '0') { //Cuts selected entry Keyboard.press(KEY_LEFT_CTRL); Keyboard.press(KEY_X); Keyboard.releaseAll(); delay(50); //Types text Keyboard.print("<center><a href=\""); delay(50); //Pastes entry Keyboard.press(KEY_LEFT_CTRL); Keyboard.press(KEY_V); Keyboard.releaseAll(); delay(50); //Types text Keyboard.print("\"><img src=\""); delay(50); //Pastes entry Keyboard.press(KEY_LEFT_CTRL); Keyboard.press(KEY_V); Keyboard.releaseAll(); delay(50); //Types text Keyboard.println("\" alt=\"\"></a></center>"); Keyboard.println("<center><i>Caption</i></center>"); } else if (button == '#') { //Cuts selected entry Keyboard.press(KEY_LEFT_CTRL); Keyboard.press(KEY_X); Keyboard.releaseAll(); delay(50); //Types text Keyboard.print("<kbd>"); delay(50); //Pastes entry Keyboard.press(KEY_LEFT_CTRL); Keyboard.press(KEY_V); Keyboard.releaseAll(); delay(50); //Types text Keyboard.print("</kbd>"); } else { Keyboard.println(button); } } //Do something else. Don't call your Keypad a ton otherwise you'll tie up the I2C bus delay(25); //25 is good, more is better }