Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <Wire.h>
- #include <Adafruit_GFX.h>
- #include <Adafruit_SSD1306.h>
- #include <BleKeyboard.h>
- #include <WiFi.h>
- #include <WebServer.h>
- #include <esp_bt.h>
- // WIFI
- const char* ssid = "TD";
- const char* password = "boom boom";
- WebServer server(80);
- // PINS =
- #define CLK 18
- #define DT 19
- #define SW 23
- // OLED
- #define SCREEN_WIDTH 128
- #define SCREEN_HEIGHT 64
- Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
- // BLE
- BleKeyboard bleKeyboard("ESP32 Controller", "Tanay", 100);
- // STATE
- int volume = 50;
- bool isPlaying = false;
- String track = "No Track";
- String artist = "No Artist";
- // ENCODER
- int lastCLK;
- unsigned long lastConnectedTime = 0;
- // SETUP
- void setup() {
- Serial.begin(115200);
- pinMode(CLK, INPUT_PULLUP);
- pinMode(DT, INPUT_PULLUP);
- pinMode(SW, INPUT_PULLUP);
- lastCLK = digitalRead(CLK);
- Wire.begin(21, 22);
- if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
- Serial.println("OLED FAIL");
- while (1);
- }
- display.clearDisplay();
- display.setTextColor(WHITE);
- bleKeyboard.begin();
- bleKeyboard.setDelay(0);
- // WIFI CONNECT
- WiFi.begin(ssid, password);
- Serial.print("Connecting to WiFi");
- while (WiFi.status() != WL_CONNECTED) {
- delay(500);
- Serial.print(".");
- }
- Serial.println("\nConnected!");
- Serial.println(WiFi.localIP());
- // HTTP ENDPOINT
- server.on("/update", []() {
- if (server.hasArg("track")) track = server.arg("track");
- if (server.hasArg("artist")) artist = server.arg("artist");
- Serial.println("Track: " + track);
- Serial.println("Artist: " + artist);
- server.send(200, "text/plain", "OK");
- });
- server.begin();
- }
- // LOOP
- void loop() {
- server.handleClient();
- // BLE CONNECTION HANDLING
- static bool wasConnected = false;
- if (bleKeyboard.isConnected()) {
- if (!wasConnected) {
- Serial.println("BLE Connected");
- wasConnected = true;
- }
- lastConnectedTime = millis();
- } else {
- if (wasConnected) {
- Serial.println("BLE Disconnected → restarting BLE");
- wasConnected = false;
- delay(500);
- Serial.println("Resetting BLE stack...");
- // turn off bluetooth completely
- esp_bluedroid_disable();
- esp_bluedroid_deinit();
- esp_bt_controller_disable();
- // small delay
- delay(500);
- // restart clean
- ESP.restart();
- }
- delay(500);
- return;
- }
- handleEncoder();
- handleButton();
- drawUI();
- }
- // ENCODER
- void handleEncoder() {
- static int lastStateCLK = HIGH;
- int currentStateCLK = digitalRead(CLK);
- if (currentStateCLK != lastStateCLK) {
- if (digitalRead(DT) != currentStateCLK) {
- volume = min(100, volume + 2);
- bleKeyboard.write(KEY_MEDIA_VOLUME_UP);
- Serial.println("VOL UP");
- } else {
- volume = max(0, volume - 2);
- bleKeyboard.write(KEY_MEDIA_VOLUME_DOWN);
- Serial.println("VOL DOWN");
- }
- delay(3); // debounce
- }
- lastStateCLK = currentStateCLK;
- }
- // BUTTON
- void handleButton() {
- static unsigned long lastPress = 0;
- if (digitalRead(SW) == LOW && millis() - lastPress > 300) {
- lastPress = millis();
- isPlaying = !isPlaying;
- bleKeyboard.write(KEY_MEDIA_PLAY_PAUSE);
- Serial.println("PLAY/PAUSE");
- }
- }
- // UI
- void drawUI() {
- display.clearDisplay();
- display.setTextSize(1);
- // HEADER
- display.setCursor(20, 0);
- display.print("Now Playing");
- // TRACK
- display.setCursor(0, 15);
- display.print(track);
- // ARTIST
- display.setCursor(0, 25);
- display.print(artist);
- // STATE
- display.setCursor(0, 35);
- display.print(isPlaying ? "Playing" : "Paused");
- // VOLUME BAR
- display.drawRect(0, 48, 128, 10, WHITE);
- int fill = map(volume, 0, 100, 0, 126);
- display.fillRect(1, 49, fill, 8, WHITE);
- display.display();
- }
Advertisement