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);
}