Light, distance and motion
MPU6050 with ESP32
An MPU6050 combines a 3-axis accelerometer and a 3-axis gyroscope on I2C. Use it to detect tilt, knocks or rotation, for example to flip a display when the device is turned over, or to log vibration on a machine.
The chip starts asleep, which is the first thing that catches people. Until you write 0 to register 0x6B (PWR_MGMT_1), the data registers return nothing useful. The address is 0x68, or 0x69 with AD0 pulled high. Leave AD0 connected properly, because a floating pin can cause intermittent 'not found' errors. Reading register 0x75 (WHO_AM_I) is a quick test: it should answer 0x68, though clones may report something else.
By default the ranges are ±2 g and ±250 °/s, giving 16384 counts per g and 131 counts per °/s. Accelerometer data starts at register 0x3B. Raw gyroscope values drift, so an accurate angle needs fusion with the accelerometer. Many boards already include an IMU such as a QMI8658, so check your board's page before adding a module.

Specifications
| Measures | 3-axis acceleration, 3-axis rotation |
|---|---|
| Module supply | 3.3 V typical, chip about 2.4–3.46 V |
| Default ranges | ±2 g, ±250 °/s |
| Sensitivity | 16384 LSB/g, 131 LSB/(°/s) |
| Interface | I2C |
| I2C address | 0x68, or 0x69 with AD0 high |
| WHO_AM_I | Register 0x75 = 0x68 |
Power and logic levels
3.3 V: safe to connect directly
| Supply | Chip up to 3.46 V, modules have a regulator |
|---|---|
| Signal level | 3.3 V |
| On an ESP32 | Run it from 3V3, so the I2C lines stay at 3.3 V. |
ESP32 pins, including those on a display board's connectors, work at 3.3 V and are not 5 V tolerant. Modules differ, so if in doubt, measure the signal before you connect it.
Wiring
| MPU6050 | Connect to | Note |
|---|---|---|
| VCC | 3V3 | |
| GND | GND | |
| SDA | GPIO 8 | Any free pin, set in Wire.begin() |
| SCL | GPIO 9 | Any free pin, set in Wire.begin() |
| AD0 | GND | Selects 0x68 |
Arduino code
#include <Wire.h>
const int SDA_PIN = 8, SCL_PIN = 9; // use your board's I2C pins
const uint8_t MPU = 0x68;
void setup() {
Serial.begin(115200);
Wire.begin(SDA_PIN, SCL_PIN);
Wire.beginTransmission(MPU);
Wire.write(0x6B); // PWR_MGMT_1
Wire.write(0); // wake up
Wire.endTransmission();
}
void loop() {
Wire.beginTransmission(MPU);
Wire.write(0x3B); // ACCEL_XOUT_H
Wire.endTransmission(false);
Wire.requestFrom(MPU, (uint8_t)6);
int16_t ax = (Wire.read() << 8) | Wire.read();
int16_t ay = (Wire.read() << 8) | Wire.read();
int16_t az = (Wire.read() << 8) | Wire.read();
Serial.printf("%.2f %.2f %.2f g\n", ax / 16384.0, ay / 16384.0, az / 16384.0);
delay(200);
}
No extra library needed. Compiled for ESP32-S3 with arduino-esp32 3.x. Not yet tested by us on a physical sensor. Change the pins to match your board.
On a display
Read the value in your sketch and pass it to a label, or send it over MQTT and show it with an MQTT value in the editor.
Design a display for MPU6050Boards with a ready connector
Only boards whose connectors we have surveyed. Others may still work on free GPIOs.
| Elecrow CrowPanel ESP32 HMI 2.4" | I2C port: SDA 22, SCL 21Not shared with the touch controller (it is on SPI) — free for sensors |
| Elecrow CrowPanel ESP32 HMI 2.8" | I2C port: SDA 22, SCL 21Not shared with the touch controller (it is on SPI) — free for sensors |
| Elecrow CrowPanel ESP32 HMI 3.5" | I2C port: SDA 22, SCL 21Not shared with the touch controller (it is on SPI) — free for sensors |
| Elecrow CrowPanel ESP32-S3 HMI 5.0" | I2C port: SDA 19, SCL 20Same I2C bus as the GT911 touch (0x14 / 0x5D) and, on V3.0 boards, the PCA9557 touch-reset expander (0x18) |
| Elecrow CrowPanel ESP32-S3 HMI 7.0" | I2C port: SDA 19, SCL 20Same I2C bus as the GT911 touch (0x14 / 0x5D) and, on V3.0 boards, the PCA9557 touch-reset expander (0x18) |
| LilyGO T-Display-S3-Pro 2.33" | QWIIC RIGHT: SDA 5, SCL 6I2C only — same bus as the touch, the PMU (SY6970) and the light sensor |
| M5Stack AtomS3 0.85" | Bottom I2C pins: SDA 38, SCL 39Same I2C bus as the built-in IMU (MPU6886, 0x68) |
| Makerfabs MaTouch ESP32-S3 Rotary IPS 2.1 Round | Mabee I2C (J1): SDA 17, SCL 18Same I2C bus as the touch controller (CST826) |
| Makerfabs MaTouch ESP32-S3 Parallel TFT 4.3" | Mabee I2C: SDA 17, SCL 18Same I2C bus as the touch controller (GT911) |
| Makerfabs MaTouch ESP32-S3 Parallel TFT with Touch 5.0" | Mabee I2C: SDA 17, SCL 18Same I2C bus as the touch controller (GT911) |
| Makerfabs MaTouch ESP32-S3 Parallel TFT with Touch 7.0" | Mabee I2C: SDA 17, SCL 18Same I2C bus as the touch controller (GT911) |
| Sunton ESP32-4827S043R/C 4.3" | I2C header (P3): SDA 19, SCL 20Same I2C bus as the GT911 touch controller. P3 also carries GPIO 17 / 18. |
| Sunton ESP32-8048S043C 4.3" | I2C header (P3): SDA 19, SCL 20Same I2C bus as the GT911 touch controller. P3 also carries GPIO 17 / 18. |
| Sunton ESP32-8048S050C 5.0" | I2C header (P3): SDA 19, SCL 20Same I2C bus as the GT911 touch controller. P3 also carries GPIO 17 / 18. |
| Sunton ESP32-8048S070C 7.0" | I2C header (P3): SDA 19, SCL 20Same I2C bus as the GT911 touch controller. P3 also carries GPIO 17 / 18. |
| Waveshare ESP32-S3 Touch LCD 2.1" round | I2C connector: SDA 15, SCL 7Same I2C bus as the touch controller, the IO expander, the RTC and the IMU (addresses 0x15/0x5D, 0x20, 0x51, 0x6B, 0x7E taken) |
| Waveshare ESP32-S3 Touch LCD 2.8" | I2C connector: SDA 11, SCL 10Same I2C bus as the RTC and the IMU (0x51, 0x6B, 0x7E taken) — the touch has its own bus |
| Waveshare ESP32-S3 Touch LCD 2.8" Type B | I2C connector: SDA 15, SCL 7Same I2C bus as the touch controller, the IO expander, the RTC and the IMU (addresses 0x15/0x5D, 0x20, 0x51, 0x6B, 0x7E taken) |
| Waveshare ESP32-S3-Touch-LCD-2.8C | I2C connector: SDA 15, SCL 7Same I2C bus as the touch controller, the IO expander, the RTC and the IMU (addresses 0x15/0x5D, 0x20, 0x51, 0x6B, 0x7E taken) |
| Waveshare ESP32-S3-LCD-7B | I2C connector (H1): SDA 8, SCL 9Same I2C bus as the touch controller (GT911) and the IO expander (CH422G) |
Good to know
- It starts asleep. Write 0 to register 0x6B first.
- Connect AD0. A floating pin can cause random errors.
- Gyro values drift. An accurate angle needs sensor fusion.
- Many display boards already have an IMU.
What it is good for
- Tilt and orientation detection
- Vibration and knock detection
- Handheld device gestures
FAQ
Why does my MPU6050 read all zeros?
It starts asleep. Write 0 to register 0x6B to wake it.
What is the MPU6050 I2C address?
0x68, or 0x69 with AD0 high.
Can it measure an exact angle?
Roughly from the accelerometer when still. For moving devices, combine it with the gyroscope.
Sources
Related parts
Use this information at your own risk. It is for general guidance only: the example code compiles, but it has not been tested on every part, and modules differ between sellers. Check the manufacturer's data before you build. Product names belong to their owners, and LCD Ultra Pro is not affiliated with them. See our Terms.