#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define rowNum 4 // four row
#define colNum 4 // four columns
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
int keyIndex;
unsigned long lastClick[rowNum][colNum] = {
{0, 0, 0, 0},
{0, 0, 0, 0},
{0, 0, 0, 0},
{0, 0, 0, 0}
};
char keys[rowNum][colNum] = {
{'1', '2', '3', ' '}, //
{'4', '5', '6', '~'}, //backspace udh
{'7', '8', '9', '^'}, //capslock udh
{'*', '0', '#', '\n'} //enter
};
char keys1[rowNum][colNum] = {
{'1', 'a', 'd', ' '},
{'g', 'j', 'm', '~'},
{'p', 't', 'w', '^'},
{'*', '0', '#', '\n'}
};
char keys2[rowNum][colNum] = {
{'1', 'b', 'e', ' '},
{'h', 'k', 'n', '~'},
{'q', 'u', 'x', '^'},
{'*', '0', '#', '\n'}
};
char keys3[rowNum][colNum] = {
{'1', 'c', 'f', ' '},
{'i', 'l', 'o', '~'},
{'r', 'v', 'y', '^'},
{'*', '0', '#', '\n'}
};
int pinState = 0;
int lastFlicker = LOW;
int lastState = LOW;
bool capsLock = 0;
String sentence;
char rowPins[rowNum] = {19, 18, 5, 17};
char colPins[colNum] = {16, 4, 12, 15};
void setup() {
Serial.begin(115200);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.clearDisplay();
display.display();
for(char r = 0; r < rowNum; r++){
pinMode(rowPins[r], OUTPUT);
digitalWrite(rowPins[r], HIGH);
}
for(char c = 0; c < colNum; c++){
pinMode(colPins[c], INPUT_PULLUP);
}
}
void loop() {
char key;
key = getKey();
if (key == '~') {
int l = sentence.length();
sentence.remove(l-1,1);
display.clearDisplay();
}
else if (key == '^') {
capsLock = !capsLock;
}
else if (key != '?') {
if (capsLock) {
key = toupper(key);
}
sentence += key;
display.clearDisplay();
}
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0, 10);
display.println(sentence);
display.display();
}
// DITAHAN GA MUNCUL TERUSSSS TP BLM DEBOUNCE
char getKey() {
char key = '?';
for (char r = 0; r < rowNum; r++) {
digitalWrite(rowPins[r], LOW);
for (char c = 0; c < colNum; c++) {
if (digitalRead(colPins[c]) == LOW) {
delay(50);
while (digitalRead(colPins[c]) == LOW) {
pinState = digitalRead(colPins[c]);
if ((pinState == LOW) && (lastState == HIGH)) { // kalau tertekan
if (((millis() - lastClick[r][c]) < 800) && (r < (rowNum-1)) && (c < (colNum-1))) { // kalo tombol yg sama ditekan lagi
if (keyIndex == 0) {
keyIndex++;
key = keys1[r][c];
} else if (keyIndex == 1) {
keyIndex++;
key = keys2[r][c];
} else if (keyIndex == 2) {
keyIndex++;
key = keys3[r][c];
} else if (keyIndex == 3) {
if ((r == 2) && (c == 0)) { // pqrs
key = 's';
keyIndex++;
} else if ((r == 2) && (c == 2)) { // wxyz
key = 'z';
keyIndex++;
} else {
keyIndex = 0;
key = keys[r][c];
}
} else if (keyIndex == 4) { // khusus abis s dan z
keyIndex = 0;
key = keys[r][c];
}
int l = sentence.length();
sentence.remove(l-1,1); // hapus char sebelumnya supaya bisa direplace
} else {
key = keys[r][c];
keyIndex = 0;
}
lastClick[r][c] = millis();
lastState = pinState;
}
}
}
lastState = HIGH;
}
digitalWrite(rowPins[r], HIGH);
}
return key;
}