#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <BLEKeyboard.h>
#include <Encoder.h>
// Define OLED dimensions
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire);
// Define pins for rotary encoders and buttons
#define ENCODER1_A 34
#define ENCODER1_B 35
#define ENCODER2_A 32
#define ENCODER2_B 33
#define BUTTONS_COUNT 10
const int buttonPins[BUTTONS_COUNT] = {4, 5, 18, 19, 21, 22, 23, 25, 26, 27};
// BLE Keyboard instance
BLEKeyboard bleKeyboard;
// Rotary encoders
Encoder encoder1(ENCODER1_A, ENCODER1_B);
Encoder encoder2(ENCODER2_A, ENCODER2_B);
// Variables to track encoder positions
long lastPosition1 = 0;
long lastPosition2 = 0;
// Functions for shortcuts
void performShortcut(int button) {
switch (button) {
case 0: bleKeyboard.write(KEY_MEDIA_VOLUME_DOWN); break; // Example action
case 1: bleKeyboard.write(KEY_MEDIA_VOLUME_UP); break;
case 2: bleKeyboard.write(KEY_MEDIA_PLAY_PAUSE); break;
case 3: bleKeyboard.write(KEY_MEDIA_NEXT_TRACK); break;
case 4: bleKeyboard.write(KEY_MEDIA_PREVIOUS_TRACK); break;
case 5: bleKeyboard.press('S'); bleKeyboard.release('S'); break; // Shortcut for Fusion360
case 6: bleKeyboard.press('Y'); bleKeyboard.release('Y'); break; // Shortcut for YouTube
default: break;
}
}
// Setup function
void setup() {
// Initialize serial for debugging
Serial.begin(115200);
// Initialize BLE Keyboard
bleKeyboard.begin();
// Initialize OLED
if (!display.begin(SSD1306_I2C_ADDRESS, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
for (;;);
}
display.clearDisplay();
display.display();
// Configure button pins
for (int i = 0; i < BUTTONS_COUNT; i++) {
pinMode(buttonPins[i], INPUT_PULLUP);
}
// Display initialization message
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println("BLE Controller Init...");
display.display();
delay(2000);
display.clearDisplay();
}
// Main loop
void loop() {
// Check rotary encoder 1
long newPosition1 = encoder1.read() / 4;
if (newPosition1 != lastPosition1) {
if (newPosition1 > lastPosition1) {
bleKeyboard.write(KEY_MEDIA_VOLUME_UP);
} else {
bleKeyboard.write(KEY_MEDIA_VOLUME_DOWN);
}
lastPosition1 = newPosition1;
}
// Check rotary encoder 2
long newPosition2 = encoder2.read() / 4;
if (newPosition2 != lastPosition2) {
if (newPosition2 > lastPosition2) {
// Increase brightness (custom implementation for PC needed)
} else {
// Decrease brightness (custom implementation for PC needed)
}
lastPosition2 = newPosition2;
}
// Check buttons
for (int i = 0; i < BUTTONS_COUNT; i++) {
if (digitalRead(buttonPins[i]) == LOW) {
performShortcut(i);
delay(200); // Debounce delay
}
}
// Update OLED display
display.clearDisplay();
display.setCursor(0, 0);
display.println("BLE PC Controller");
display.println("Encoder 1: Volume");
display.println("Encoder 2: Brightness");
display.display();
}