#include <Arduino.h>
#include <Keypad.h>
#include <JC_Button.h>
const uint8_t ROWS = 4;
const uint8_t COLS = 3;
char keys[ROWS][COLS] = {
{ '1', '2', '3' },
{ '4', '5', '6'},
{ '7', '8', '9'},
{ '*', '0', '#'}
};
uint8_t colPins[COLS] = { 26, 25, 33 };
uint8_t rowPins[ROWS] = { 13, 12, 14, 27 };
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, 4, 3);
char * internalCodes [] = {
(char*) "1211",
(char*) "1515"
};
void dispatchEvent(const char* _event, const char* _state) {
char buffer[120];
sprintf(buffer, "Event: %s, Data: %s ", _event, _state);
Serial.println(buffer);
}
Button buttonUp(32);
Button buttonSelect(35);
Button buttonDown(34);
void setup() {
Serial.begin(115200);
buttonUp.begin();
buttonSelect.begin();
buttonDown.begin();
}
unsigned long internalKeyCodeTime;
char internalCodeBuffer[5];
void resetinternalCodeBuffer() {
Serial.println("Reset internal code");
internalCodeBuffer[0] = 0;
internalKeyCodeTime = millis();
}
unsigned int checkinternalCodeBuffer(char keypadKey) {
unsigned int len = strlen(internalCodeBuffer);
internalCodeBuffer[len] = keypadKey;
internalCodeBuffer[len + 1] = 0;
if (strlen(internalCodeBuffer) == 4) {
Serial.print("Code ");
Serial.println(internalCodeBuffer);
for (int counter = 0; counter < 2; counter++) {
if (strcmp(internalCodes[counter], internalCodeBuffer) == 0) {
Serial.println("OK");
resetinternalCodeBuffer();
return true;
}
}
resetinternalCodeBuffer();
}
internalKeyCodeTime = millis();
return false;
}
void loop() {
char keypadKey = keypad.getKey();
if ((millis() - internalKeyCodeTime) > 2000 && strlen(internalCodeBuffer) > 0) {
resetinternalCodeBuffer();
return;
}
if (keypadKey != NO_KEY) {
if (checkinternalCodeBuffer(keypadKey)) {
return;
}
dispatchEvent("Buttonpressed", String(keypadKey).c_str());
}
buttonUp.read();
if (buttonUp.wasPressed()) {
resetinternalCodeBuffer();
dispatchEvent("Buttonpressed", "up");
}
buttonSelect.read();
if (buttonSelect.wasPressed()) {
resetinternalCodeBuffer();
dispatchEvent("Buttonpressed", "select");
}
buttonDown.read();
if (buttonDown.wasPressed()) {
resetinternalCodeBuffer();
dispatchEvent("Buttonpressed", "down");
}
}