// Simple ESP32 Tilt Detection with MPU-6050
// Detects tilt using accelerometer and triggers alert
#include <Wire.h>
int ledPin = 2; // LED connected to GPIO 2 (D2)
int buzzerPin = 5; // Buzzer connected to GPIO 5 (D5)
// MPU-6050 I2C address
const int MPU = 0x68;
// Tilt threshold (adjust sensitivity)
float tiltThreshold = 30.0; // degrees
void setup() {
Serial.begin(115200);
Wire.begin(21, 22); // SDA=21, SCL=22 for ESP32
pinMode(ledPin, OUTPUT);
pinMode(buzzerPin, OUTPUT);
// Initialize MPU-6050
Wire.beginTransmission(MPU);
Wire.write(0x6B); // PWR_MGMT_1 register
Wire.write(0); // Wake up MPU-6050
Wire.endTransmission(true);
Serial.println("MPU-6050 Tilt Detection Ready!");
Serial.println("Tilt threshold: " + String(tiltThreshold) + " degrees");
// Test components
digitalWrite(ledPin, HIGH);
digitalWrite(buzzerPin, HIGH);
delay(300);
digitalWrite(ledPin, LOW);
digitalWrite(buzzerPin, LOW);
}
void loop() {
// Read accelerometer data
Wire.beginTransmission(MPU);
Wire.write(0x3B); // Starting register for accelerometer
Wire.endTransmission(false);
Wire.requestFrom(MPU, 6, true);
// Read X, Y, Z acceleration values
int16_t AcX = Wire.read() << 8 | Wire.read();
int16_t AcY = Wire.read() << 8 | Wire.read();
int16_t AcZ = Wire.read() << 8 | Wire.read();
// Convert to angles (tilt calculation)
float angleX = atan2(AcY, AcZ) * 180.0 / PI;
float angleY = atan2(AcX, AcZ) * 180.0 / PI;
// Calculate total tilt angle
float totalTilt = sqrt(angleX * angleX + angleY * angleY);
// Check if tilted beyond threshold
if (totalTilt > tiltThreshold) {
// TILT DETECTED!
digitalWrite(ledPin, HIGH); // Turn on LED
digitalWrite(buzzerPin, HIGH); // Turn on buzzer
Serial.print("⚠️ TILT DETECTED! Angle: ");
Serial.print(totalTilt, 1);
Serial.println("°");
} else {
// DEVICE LEVEL
digitalWrite(ledPin, LOW); // Turn off LED
digitalWrite(buzzerPin, LOW); // Turn off buzzer
Serial.print("Device level - Tilt: ");
Serial.print(totalTilt, 1);
Serial.println("°");
}
delay(200);
}
/*
WOKWI CIRCUIT CONNECTIONS - MPU-6050 TILT DETECTION:
Components needed:
- ESP32 DevKit V1
- MPU-6050 Accelerometer/Gyroscope
- LED
- 220Ω resistor
- Buzzer (Active buzzer)
Simple connections:
MPU-6050 (I2C connection):
1. MPU-6050 VCC → 3V3
2. MPU-6050 GND → GND
3. MPU-6050 SDA → GPIO 21 (SDA pin)
4. MPU-6050 SCL → GPIO 22 (SCL pin)
LED:
5. LED long leg → GPIO 2 (D2 pin)
6. LED short leg → 220Ω resistor → GND
Buzzer:
7. Buzzer positive (+) → GPIO 5 (D5 pin)
8. Buzzer negative (-) → GND
How it works:
- MPU-6050 measures acceleration in X, Y, Z axes
- Code calculates tilt angle from acceleration data
- Alert triggers when tilt > 30 degrees (adjustable)
- Shows exact tilt angle in serial monitor
Test: In Wokwi, rotate the MPU-6050 to simulate tilting
*/