#include <Keypad.h> // https://github.com/Chris--A/Keypad
#include <BleGamepad.h> // https://github.com/MagnusThome/ESP32-BLE-Gamepad
BleGamepad bleGamepad("SimWheel", "breeze", 100);
// BUTTON MATRIX
#define ROWS 5
#define COLS 4
uint8_t rowPins[ROWS] = { 13, 14, 15, 16, 33 };
uint8_t colPins[COLS] = { 17, 18, 19, 21 };
uint8_t keymap[ROWS][COLS] = {
{ 0, 1, 2, 3 },
{ 4, 5, 6, 7 },
{ 8, 9, 10, 11 },
{ 12, 13, 14, 15 },
{ 16, 17, 18, 19 }
};
Keypad customKeypad = Keypad(makeKeymap(keymap), rowPins, colPins, ROWS, COLS);
// ROTARY ENCODERS
#define ENCODER 5
uint8_t encoderClks[ENCODER] = { 22, 25, 27, 05, 34 };
uint8_t encoderDts[ENCODER] = { 23, 26, 32, 04, 35 };
uint8_t encoderDwn[ENCODER] = { 20, 22, 24, 26, 28 };
uint8_t encoderUpp[ENCODER] = { 21, 23, 25, 27, 29 };
int lastClks[ENCODER] = { HIGH, HIGH, HIGH, HIGH, HIGH };
void setup() {
Serial.begin(115200);
for (uint8_t i = 0; i < ENCODER; i++) {
pinMode(encoderClks[i], INPUT);
pinMode(encoderDts[i], INPUT);
}
customKeypad.addEventListener(keypadEvent);
customKeypad.setHoldTime(1);
bleGamepad.begin();
Serial.println("Booted!");
}
void loop() {
unsigned long now = millis();
// ROTARY ENCODERS
for (uint8_t i = 0; i < ENCODER; i++) {
int newClk = digitalRead(encoderClks[i]);
if (newClk != lastClks[i]) {
lastClks[i] = newClk;
int dtValue = digitalRead(encoderDts[i]);
if (newClk == LOW && dtValue == HIGH) {
sendKey(encoderUpp[i]);
}
if (newClk == LOW && dtValue == LOW) {
sendKey(encoderDwn[i]);
}
}
}
customKeypad.getKey(); // READ BUTTON MATRIX (EVENT CALLBACK SETUP)
}
void keypadEvent(KeypadEvent key) {
uint8_t keystate = customKeypad.getState();
if (keystate == PRESSED) {
pressKey(key);
}
if (keystate == RELEASED) {
releaseKey(key);
}
}
void sendKey(uint8_t key) {
uint32_t gamepadbutton = pow(2, key); // CONVERT TO THE BINARY MAPPING GAMEPAD KEYS USE
Serial.print("pulse\t");
Serial.println(key);
if (bleGamepad.isConnected()) {
bleGamepad.press(gamepadbutton);
delay(150);
bleGamepad.release(gamepadbutton);
}
}
void pressKey(uint8_t key) {
uint32_t gamepadbutton = pow(2, key); // CONVERT TO THE BINARY MAPPING GAMEPAD KEYS USE
Serial.print("hold\t");
Serial.println(key);
if (bleGamepad.isConnected()) {
bleGamepad.press(gamepadbutton);
}
}
void releaseKey(uint8_t key) {
uint32_t gamepadbutton = pow(2, key); // CONVERT TO THE BINARY MAPPING GAMEPAD KEYS USE
Serial.print("release\t");
Serial.println(key);
if (bleGamepad.isConnected()) {
bleGamepad.release(gamepadbutton);
}
}