aryabalanbalakrishnan
Published © GPL3+

Arduino Leonardo emoji keypad

Program Arduino Leonardo and keypad to make a customized emoji keyboard

BeginnerFull instructions provided1,080
Arduino Leonardo emoji keypad

Things used in this project

Hardware components

Arduino Leonardo
Arduino Leonardo
micro or due will also work, just wire accordingly
×1
SparkFun Qwiic Keypad - 12 Button
SparkFun Qwiic Keypad - 12 Button
any keypad will work
×1

Software apps and online services

Arduino IDE
Arduino IDE

Story

Read more

Schematics

schematics

wire keypad pin 1 to d2, pin 2 to d3, pin 3 to d4, pin 4 to d5, pin 5 to d6,
pin 6 to d7, and pin 7 to d8.

Code

code

C/C++
upload this from Arduino ide to your Leonardo
// this is a simple code for an emoji keyboard with an 
//arduino leonardo or micro. this cannot be done with an uno
#include <Keyboard.h>
// Pins 1-7 of the keypad connected to the Arduino respectively:
int keypadPins[7] = {2, 3, 4, 5, 6, 7, 8};
int keypadStatus;  // Used to monitor which buttons are pressed.
int timeout;  // timeout variable used in loop

void setup()
{
  for (int i=0; i<7; i++)
  {
    pinMode(keypadPins[i], INPUT);  // Set all keypad pins as inputs
    digitalWrite(keypadPins[i], HIGH);  // pull all keypad pins high
  }
}

void loop()
{
  keypadStatus = getKeypadStatus();  // read which buttons are pressed
  if (keypadStatus != 0)  // If a button is pressed go into here
  {
    sendKeyPress(keypadStatus);  // send the button over USB
    timeout = 2000;  // top of the repeat delay
    while ((getKeypadStatus() == keypadStatus) && (--timeout))  // Decrement timeout and check if key is being held down
      delayMicroseconds(1);
    while (getKeypadStatus() == keypadStatus)  // while the same button is held down
    {
      sendKeyPress(keypadStatus);  // continue to send the button over USB
      delay(50);  // 50ms repeat rate
    }
  }
}

/* sendKeyPress(int key): This function sends a single key over USB
   It requires an int, of which the 12 LSbs are used. Each bit in
   key represents a single button on the keypad.
   This function will only send a key press if a single button
   is being pressed */
void sendKeyPress(int key)
{
  switch(key)
  {
    case 1:  // 0x001
      Keyboard.write('😀');  //the emojis can be changed to whatever you want
      break;
    case 2:  // 0x002
      Keyboard.write('😁');
      break;
    case 4:  // 0x004
      Keyboard.write('😂�');
      break;
    case 8:  // 0x008
      Keyboard.write('🤣');
      break;
    case 16:  // 0x010
      Keyboard.write('😃');
      break;
    case 32:  // 0x020
      Keyboard.write('😄');
      break;
    case 64:  // 0x040
      Keyboard.write('😅');
      break;
    case 128:  // 0x080
      Keyboard.write('😆');
      break;
    case 256:  // 0x100
      Keyboard.write('😉');
      break;
    case 512:  // 0x200
      Keyboard.write('😊');
      break;
    case 1024:  // 0x400
      Keyboard.write('😎');  
      break;
    case 2048:  // 0x800
      Keyboard.press(KEY_HOME);
      Keyboard.write('.');
      Keyboard.release(KEY_HOME);// Sends the 'windows period' command
      break;
      
  }
}


int getKeypadStatus()
{
  int rowPins[4] = {keypadPins[2], keypadPins[6], keypadPins[5], keypadPins[0]};  // row pins are 2, 7, 6, and 1 of the keypad
  int columnPins[3] = {keypadPins[1], keypadPins[3], keypadPins[4]};  // column pins are pins 2, 4, and 5 of the keypad
  int keypadStatus = 0;  // this will be what's returned
  
  /* initialize all pins, inputs w/ pull-ups */
  for (int i=0; i<7; i++)
  {
    pinMode(keypadPins[i], INPUT);
    digitalWrite(keypadPins[i], HIGH);
  }
  
  for (int row=0; row<4; row++)
  {  // initial for loop to check all 4 rows
    pinMode(rowPins[row], OUTPUT);  // set the row pin as an output
    digitalWrite(rowPins[row], LOW);  // pull the row pins low
    for (int col=0; col<3; col++)
    {  // embedded for loop to check all 3 columns of each row
      if (!digitalRead(columnPins[col]))
      {
        keypadStatus |= 1 << ((row+1)*3 + (col+1) - 4);  // set the status bit of the keypad return value
      }
    }
    pinMode(rowPins[row], INPUT);  // reset the row pin as an input
    digitalWrite(rowPins[row], HIGH);  // pull the row pin high
  }
  
  return keypadStatus;
}

Credits

aryabalanbalakrishnan
1 project • 0 followers
Contact

Comments

Please log in or sign up to comment.