Skip to content

Instantly share code, notes, and snippets.

@woodworker
Last active March 25, 2018 18:21
Show Gist options
  • Save woodworker/703af6464c102a4561883d56ae750ff9 to your computer and use it in GitHub Desktop.
Save woodworker/703af6464c102a4561883d56ae750ff9 to your computer and use it in GitHub Desktop.
#include <Wire.h>
byte rows[] = {2,3,4,5,6,7,8};
const int rowCount = sizeof(rows)/sizeof(rows[0]);
byte cols[] = {A0, A1, A2, 12, 11};
const int colCount = sizeof(cols)/sizeof(cols[0]);
char keys[colCount][rowCount];
bool lastValue[colCount][rowCount];
bool changedValue[colCount][rowCount];
char keyboard[colCount][rowCount];
char keyboard_symbol[colCount][rowCount];
int keyboardLightSteps = 20;
int keyboardLight = 20;
bool symbolSelected;
void setup() {
keyboard[0][0] = 'q';
keyboard[0][1] = 'w';
keyboard[0][2] = NULL; // symbol
keyboard[0][3] = 'a';
keyboard[0][4] = NULL; // ALT
keyboard[0][5] = ' ';
keyboard[0][6] = NULL; // Mic
keyboard[1][0] = 'e';
keyboard[1][1] = 's';
keyboard[1][2] = 'd';
keyboard[1][3] = 'p';
keyboard[1][4] = 'x';
keyboard[1][5] = 'z';
keyboard[1][6] = NULL; // Left Shift
keyboard[2][0] = 'r';
keyboard[2][1] = 'g';
keyboard[2][2] = 't';
keyboard[2][3] = NULL; // Right Shit
keyboard[2][4] = 'v';
keyboard[2][5] = 'c';
keyboard[2][6] = 'f';
keyboard[3][0] = 'u';
keyboard[3][1] = 'h';
keyboard[3][2] = 'y';
keyboard[3][3] = NULL; // Enter
keyboard[3][4] = 'b';
keyboard[3][5] = 'n';
keyboard[3][6] = 'j';
keyboard[4][0] = 'o';
keyboard[4][1] = 'l';
keyboard[4][2] = 'i';
keyboard[4][3] = NULL; // Backspace
keyboard[4][4] = '$';
keyboard[4][5] = 'm';
keyboard[4][6] = 'k';
keyboard_symbol[0][0] = '#';
keyboard_symbol[0][1] = '1';
keyboard_symbol[0][2] = NULL;
keyboard_symbol[0][3] = '*';
keyboard_symbol[0][4] = NULL;
keyboard_symbol[0][5] = NULL;
keyboard_symbol[0][6] = '0';
keyboard_symbol[1][0] = '2';
keyboard_symbol[1][1] = '4';
keyboard_symbol[1][2] = '5';
keyboard_symbol[1][3] = '@';
keyboard_symbol[1][4] = '8';
keyboard_symbol[1][5] = '7';
keyboard_symbol[1][6] = NULL;
keyboard_symbol[2][0] = '3';
keyboard_symbol[2][1] = '/';
keyboard_symbol[2][2] = '(';
keyboard_symbol[2][3] = NULL;
keyboard_symbol[2][4] = '?';
keyboard_symbol[2][5] = '9';
keyboard_symbol[2][6] = '6';
keyboard_symbol[3][0] = '_';
keyboard_symbol[3][1] = ':';
keyboard_symbol[3][2] = ')';
keyboard_symbol[3][3] = NULL;
keyboard_symbol[3][4] = '!';
keyboard_symbol[3][5] = ',';
keyboard_symbol[3][6] = ';';
keyboard_symbol[4][0] = '+';
keyboard_symbol[4][1] = '"';
keyboard_symbol[4][2] = '-';
keyboard_symbol[4][3] = NULL;
keyboard_symbol[4][4] = NULL;
keyboard_symbol[4][5] = '.';
keyboard_symbol[4][6] = '\'';
Wire.begin(0xBB); // join i2c bus with address #8
Wire.onReceive(receiveEvent); // register event
Serial.begin(115200);
for(int x=0; x<rowCount; x++) {
Serial.print(rows[x]); Serial.println(" as input");
pinMode(rows[x], INPUT);
}
for (int x=0; x<colCount; x++) {
Serial.print(cols[x]); Serial.println(" as input-pullup");
pinMode(cols[x], INPUT_PULLUP);
}
pinMode(10, OUTPUT);
pinMode(9, OUTPUT);
setKeyboardBacklight(keyboardLight);
symbolSelected = false;
}
void receiveEvent(int howMany) {
while (1 < Wire.available()) { // loop through all but the last
char c = Wire.read(); // receive byte as a character
Serial.print(c); // print the character
}
int x = Wire.read(); // receive byte as an integer
Serial.println(x); // print the integer
}
void readMatrix() {
int delayTime = 0;
// iterate the columns
for (int colIndex=0; colIndex < colCount; colIndex++) {
// col: set to output to low
byte curCol = cols[colIndex];
pinMode(curCol, OUTPUT);
digitalWrite(curCol, LOW);
// row: interate through the rows
for (int rowIndex=0; rowIndex < rowCount; rowIndex++) {
byte rowCol = rows[rowIndex];
pinMode(rowCol, INPUT_PULLUP);
delay(1); // arduino is not fast enought to switch input/output modes so wait 1 ms
int readVal = digitalRead(rowCol);
keys[colIndex][rowIndex] = readVal;
if ((lastValue[colIndex][rowIndex] != (bool) readVal)) {
changedValue[colIndex][rowIndex] = true;
} else {
changedValue[colIndex][rowIndex] = false;
}
lastValue[colIndex][rowIndex] = (bool) readVal;
pinMode(rowCol, INPUT);
}
// disable the column
pinMode(curCol, INPUT);
}
if (keyPressed(0, 2)) {
Serial.print("SYM BEFORE: ");
Serial.println(symbolSelected);
symbolSelected = true;
Serial.print("SYM AFTER: ");
Serial.println(symbolSelected);
}
}
bool keyPressed(int colIndex, int rowIndex) {
return changedValue[colIndex][rowIndex] && keys[colIndex][rowIndex] == LOW;
}
bool keyActive(int colIndex, int rowIndex) {
return keys[colIndex][rowIndex] == LOW;
}
void setKeyboardBacklight(int keyboardLight) {
analogWrite(10, keyboardLight);
analogWrite(9, keyboardLight);
}
void printMatrix() {
for (int rowIndex=0; rowIndex < rowCount; rowIndex++) {
for (int colIndex=0; colIndex < colCount; colIndex++) {
if (
changedValue[colIndex][rowIndex] &&
keys[colIndex][rowIndex] == LOW
) {
String toPrint;
if (symbolSelected && !keyPressed(0, 2)) {
symbolSelected = false;
toPrint = String(keyboard_symbol[colIndex][rowIndex]);
} else {
toPrint = String(keyboard[colIndex][rowIndex]);
}
if (keyActive(1,6) || keyActive(2,3)) {
toPrint.toUpperCase();
}
Serial.print(toPrint);
}
}
}
}
void changeBackgroundLight(int pwmValue) {
if (pwmValue > 255) {
pwmValue = 255;
}
if (pwmValue < 0) {
pwmValue = 0;
}
keyboardLight = pwmValue;
}
void loop() {
readMatrix();
printMatrix();
if (keyPressed(3,3)) {
Serial.println();
}
if (keyPressed(0,2)) {
changeBackgroundLight(keyboardLight + keyboardLightSteps);
}
if (keyPressed(2,3)) {
changeBackgroundLight(keyboardLight - keyboardLightSteps);
}
setKeyboardBacklight(keyboardLight);
delay(10);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment