Last active
March 25, 2018 18:21
-
-
Save woodworker/703af6464c102a4561883d56ae750ff9 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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