int rowPins[] = { 13, 12, 9, 8 };
int columnPins[] = { 7, 6, 5, 4 };
bool prevStates[16];
unsigned long pressTimes[16];
unsigned int delayTime = 20;
bool buttonsFiltered[16];
String outputString = "";
void setup() {
Serial.begin(9600);
for (int i = 0; i < 4; i++) {
pinMode(rowPins[i], OUTPUT);
pinMode(columnPins[i], INPUT_PULLUP);
}
}
void loop() {
for (int r = 0; r < 4; r++) {
digitalWrite(rowPins[r], LOW);
for (int c = 0; c < 4; c++) {
bool buttonReading = !digitalRead(columnPins[c]);
int buttonIndex = r * 4 + c;
if (buttonReading != prevStates[buttonIndex]) {
pressTimes[buttonIndex] = millis();
}
if (millis() - pressTimes[buttonIndex] >= delayTime) {
if (buttonsFiltered[buttonIndex] != buttonReading) {
buttonsFiltered[buttonIndex] = buttonReading;
if (buttonsFiltered[buttonIndex]) {
char pressedKey = getKey(buttonIndex);
if (pressedKey != '\0') {
if (pressedKey == 'C') {
outputString = "";
Serial.println("0");
} else {
outputString += pressedKey;
Serial.println(outputString);
}
}
}
}
}
prevStates[buttonIndex] = buttonReading;
}
digitalWrite(rowPins[r], HIGH);
}
}
char getKey(int index) {
switch (index) {
case 0: return '1';
case 1: return '2';
case 2: return '3';
case 3: return 'R';
case 4: return '4';
case 5: return '5';
case 6: return '6';
case 7: return 'G';
case 8: return '7';
case 9: return '8';
case 10: return '9';
case 11: return 'B';
case 12: return '*';
case 13: return '0';
case 14: return '#';
case 15: return 'C';
default: return '\0';
}
}