photo

DIY Bluetooth Mouse with ESP32+MPU6050

Code for ESP32 Platformio


#include <Arduino.h>
#include <Wire.h>
#include <Adafruit_MPU6050.h>
#include <Adafruit_Sensor.h>
#include <BleMouse.h>

Adafruit_MPU6050 mpu;
BleMouse bleMouse("ESP32-Gyro-Mouse");

// buttons
#define BTN_LEFT  32
#define BTN_RIGHT 33

// settings
#define DEADZONE 0.12
#define SPEED    3

void setup() {
  Serial.begin(115200);

  pinMode(BTN_LEFT, INPUT_PULLUP);
  pinMode(BTN_RIGHT, INPUT_PULLUP);

  Wire.begin(21, 22);

  if (!mpu.begin()) {
    Serial.println("MPU6050 not found!");
    while (1) delay(10);
  }

  mpu.setAccelerometerRange(MPU6050_RANGE_4_G);
  mpu.setFilterBandwidth(MPU6050_BAND_21_HZ);

  bleMouse.begin();
  Serial.println("BLE Mouse started");
}

void loop() {
  if (!bleMouse.isConnected()) {
    delay(20);
    return;
  }

  sensors_event_t a, g, temp;
  mpu.getEvent(&a, &g, &temp);

  int moveX = 0;
  int moveY = 0;

  // LEFT / RIGHT movement
  if (abs(a.acceleration.x) > DEADZONE) {
    moveX = a.acceleration.x * SPEED;
  }

  // UP / DOWN movement
  if (abs(a.acceleration.y) > DEADZONE) {
    moveY = -a.acceleration.y * SPEED; // inverted for screen direction
  }

  // move the mouse
  if (moveX != 0 || moveY != 0) {
    bleMouse.move(moveX, moveY);
  }

  // ===== BUTTONS → DRAG & DROP =====

  // LEFT BUTTON
  if (digitalRead(BTN_LEFT) == LOW) {
    bleMouse.press(MOUSE_LEFT);    // hold = drag
  } else {
    bleMouse.release(MOUSE_LEFT);  // release
  }

  // RIGHT BUTTON
  if (digitalRead(BTN_RIGHT) == LOW) {
    bleMouse.press(MOUSE_RIGHT);
  } else {
    bleMouse.release(MOUSE_RIGHT);
  }

  delay(10);
}
  

platformio.ini

    [env:esp32dev]
platform = espressif32
board = esp32dev
framework = arduino
monitor_speed = 115200

lib_deps =
    adafruit/Adafruit MPU6050
    adafruit/Adafruit Unified Sensor
    h2zero/BleMouse
    

Code for esp32 Arduino IDE


#include <Arduino.h>
#include <Wire.h>
#include <Adafruit_MPU6050.h>
#include <Adafruit_Sensor.h>
#include <BleMouse.h>

Adafruit_MPU6050 mpu;
BleMouse bleMouse("ESP32-Gyro-Mouse");

// buttons
#define BTN_LEFT  32
#define BTN_RIGHT 33

// settings
#define DEADZONE 0.12
#define SPEED    3

void setup() {
  Serial.begin(115200);

  pinMode(BTN_LEFT, INPUT_PULLUP);
  pinMode(BTN_RIGHT, INPUT_PULLUP);

  Wire.begin(21, 22);

  if (!mpu.begin()) {
    Serial.println("MPU6050 not found!");
    while (1) delay(10);
  }

  mpu.setAccelerometerRange(MPU6050_RANGE_4_G);
  mpu.setFilterBandwidth(MPU6050_BAND_21_HZ);

  bleMouse.begin();
  Serial.println("BLE Mouse started");
}

void loop() {
  if (!bleMouse.isConnected()) {
    delay(20);
    return;
  }

  sensors_event_t a, g, temp;
  mpu.getEvent(&a, &g, &temp);

  int moveX = 0;
  int moveY = 0;

  // LEFT / RIGHT
  if (abs(a.acceleration.x) > DEADZONE) {
    moveX = a.acceleration.x * SPEED;
  }

  // UP / DOWN
  if (abs(a.acceleration.y) > DEADZONE) {
    moveY = -a.acceleration.y * SPEED;
  }

  if (moveX != 0 || moveY != 0) {
    bleMouse.move(moveX, moveY);
  }

  // LEFT CLICK (drag)
  if (digitalRead(BTN_LEFT) == LOW) {
    bleMouse.press(MOUSE_LEFT);
  } else {
    bleMouse.release(MOUSE_LEFT);
  }

  // RIGHT CLICK
  if (digitalRead(BTN_RIGHT) == LOW) {
    bleMouse.press(MOUSE_RIGHT);
  } else {
    bleMouse.release(MOUSE_RIGHT);
  }

  delay(10);
}