Close Menu
  • Articles
    • Learn Electronics
    • Product Review
    • Tech Articles
  • Electronics Circuits
    • 555 Timer Projects
    • Op-Amp Circuits
    • Power Electronics
  • Microcontrollers
    • Arduino Projects
    • STM32 Projects
    • AMB82-Mini IoT AI Camera
    • BLE Projects
  • IoT Projects
    • ESP8266 Projects
    • ESP32 Projects
    • ESP32 MicroPython
    • ESP32-CAM Projects
    • LoRa/LoRaWAN Projects
  • Raspberry Pi
    • Raspberry Pi Projects
    • Raspberry Pi Pico Projects
    • Raspberry Pi Pico W Projects
  • Electronics Calculator
Facebook X (Twitter) Instagram
  • About Us
  • Disclaimer
  • Privacy Policy
  • Contact Us
  • Advertise With Us
Facebook X (Twitter) Instagram Pinterest YouTube LinkedIn
How To Electronics
  • Articles
    • Learn Electronics
    • Product Review
    • Tech Articles
  • Electronics Circuits
    • 555 Timer Projects
    • Op-Amp Circuits
    • Power Electronics
  • Microcontrollers
    • Arduino Projects
    • STM32 Projects
    • AMB82-Mini IoT AI Camera
    • BLE Projects
  • IoT Projects
    • ESP8266 Projects
    • ESP32 Projects
    • ESP32 MicroPython
    • ESP32-CAM Projects
    • LoRa/LoRaWAN Projects
  • Raspberry Pi
    • Raspberry Pi Projects
    • Raspberry Pi Pico Projects
    • Raspberry Pi Pico W Projects
  • Electronics Calculator
How To Electronics
Home » Measure Tilt Angle with MPU6050 & STM32 Microcontroller
STM32 Projects

Measure Tilt Angle with MPU6050 & STM32 Microcontroller

Mamtaz AlamBy Mamtaz AlamUpdated:August 21, 20221 Comment4 Mins Read
Share Facebook Twitter LinkedIn Telegram Reddit WhatsApp
STM32 MPU6050
Share
Facebook Twitter LinkedIn Pinterest Email Reddit Telegram WhatsApp

We will interface MPU6050 Gyro/Accelerometer Sensor with STM32 Microcontroller (STM32F103C8) & measure tilt angle. The measured till angle is displayed on OLED Display.


Overview

In this post we will learn how to Measure Tilt Angle using MPU6050 & STM32F103C8 Microcontroller. This can be done by simply interfacing MPU6050 6 axis Gyro/Accelerometer Sensor with STM32. The Accelerometer sends X, Y, and Z acceleration forces. We need to convert the forces into X, Y, Z 3D angle to determine the 3D Orientation of the sensor. The measured tilt angle is sent to the Blynk Application using the Blynk cloud. Hence the tilting position can be monitored over IoT.

The gyroscope measures rotational velocity or rate of change of the angular position over time, along the X, Y and Z-axis. It uses MEMS technology and the Coriolis Effect for measuring. The outputs of the gyroscope are in degrees per second, so in order to get the angular position, we just need to integrate the angular velocity.

You can refer to the previous post where we measured tilt angle using MPU6050 Gyro/Accelerometer & Arduino:
Measure Tilt Angle Using MPU6050. Apart from this the MPU6050 can also be used to measure and control speed of DC Motor.



Bill of Materials

Following are the components required for making this project. All the components can be easily purchased from Amazon. The component purchased link is added.

S.N.Components QuantityPurchase Links
1STM32F103C Microcontroller1Amazon | AliExpress
2MPU60501Amazon | AliExpress
30.96" I2C OLED Display1Amazon | AliExpress
4Connecting Wires10Amazon | AliExpress
5Breadboard1Amazon | AliExpress

MPU6050 Gyro/Accelerometer Sensor

Introduction:

MPU6050 Gyro/Accelerometer

The InvenSense MPU-6050 sensor contains a MEMS accelerometer and a MEMS gyro in a single chip. It is very accurate, as it contains 16-bits analog to digital conversion hardware for each channel. Therefor it captures the x, y, and z channel at the same time. The sensor uses the I2C-bus to interface with the Arduino.

The MPU-6050 is not expensive, especially given the fact that it combines both an accelerometer and a gyro.

MPU6050 Pinout:

The MPU-6050 module has 8 pins:
INT: Interrupt digital output pin.
AD0: I2C Slave Address LSB pin. This is the 0th bit in the 7-bit slave address of device. If connected to VCC then it is read as logic one and slave address changes.
XCL: Auxiliary Serial Clock pin. This pin is used to connect other I2C interface enabled sensors SCL pin to MPU-6050.
XDA: Auxiliary Serial Data pin. This pin is used to connect other I2C interface enabled sensors SDA pin to MPU-6050.
SCL: Serial Clock pin. Connect this pin to the microcontroller SCL pin.
SDA: Serial Data pin. Connect this pin to the microcontroller SDA pin.
GND: Ground pin. Connect this pin to the ground connection.
VCC: Power supply pin. Connect this pin to a +5V DC supply.



3-Axis Gyroscope:

The MPU6050 consist of 3-axis Gyroscope with Micro Electro Mechanical System(MEMS) technology. It is used to detect rotational velocity along the X, Y, Z axes as shown in the below figure.
3-Axis Gyroscope

3-Axis Accelerometer:

The MPU6050 consist 3-axis Accelerometer with Micro Electro Mechanical (MEMs) technology. It used to detect angle of tilt or inclination along the X, Y, and Z axes as shown the below figure.
3-Axis Accelerometer


Circuit: Measure Tilt Angle with MPU6050 & STM32

Here is the circuit diagram for interfacing MPU6050 Gyro/Accelerometer with STM32 Microcontroller (STM32F103C8). The circuit can be assembled on breadboard.

STM32F103C8 MPU6050

Both the MPU6050 & OLED display are I2C Module. So we need only 2 wires for interfacing them with STM32. So, connect the Serial Data (SDA) pins to STM32F103C8 B7 pin & Serial Clock (SCL) to STM32F103C8 B6 pin. Supply 3.3V power to both modules.


Source Code/Program

The source code/program for interfacing MPU6050 with STM32 is given below. We will need few libraries to compile the code. So download the libraries from the link below and add it to Arduino Library.

  1. Adafruit_SSD1306 : https://github.com/adafruit/Adafruit_SSD1306
  2. Adafruit_GFX : https://github.com/adafruit/Adafruit-GFX-Library

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
#include<Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
 
#define SCREEN_WIDTH 128  // OLED display width, in pixels
#define SCREEN_HEIGHT 64  // OLED display height, in pixels
#define OLED_RESET    -1  // Reset pin # (or -1 if sharing reset pin)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
 
const int MPU_addr=0x68;
int16_t AcX,AcY,AcZ,Tmp,GyX,GyY,GyZ;
 
int minVal=265;
int maxVal=402;
 
double x;
double y;
double z;
 
void setup(){
Wire.begin();
Wire.beginTransmission(MPU_addr);
Wire.write(0x6B);
Wire.write(0);
Wire.endTransmission(true);
Serial.begin(9600);
 
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C))
{
    Serial.println(F("SSD1306 allocation failed"));
    for(;;); // Don't proceed, loop forever
}
display.display();
delay(2);
display.clearDisplay();
 
display.clearDisplay();
display.setTextColor(WHITE);
display.setTextSize(2);
display.setCursor(0,5);
display.print("MPU Angles");
display.display();
delay(3000);
}
void loop()
{
Wire.beginTransmission(MPU_addr);
Wire.write(0x3B);
Wire.endTransmission(false);
Wire.requestFrom(MPU_addr,14,true);
AcX=Wire.read()<<8|Wire.read();
AcY=Wire.read()<<8|Wire.read();
AcZ=Wire.read()<<8|Wire.read();
int xAng = map(AcX,minVal,maxVal,-90,90);
int yAng = map(AcY,minVal,maxVal,-90,90);
int zAng = map(AcZ,minVal,maxVal,-90,90);
 
x= RAD_TO_DEG * (atan2(-yAng, -zAng)+PI);
y= RAD_TO_DEG * (atan2(-xAng, -zAng)+PI);
z= RAD_TO_DEG * (atan2(-yAng, -xAng)+PI);
 
Serial.print("AngleX= ");
Serial.println(x);
 
Serial.print("AngleY= ");
Serial.println(y);
 
Serial.print("AngleZ= ");
Serial.println(z);
Serial.println("-----------------------------------------");
 
display.clearDisplay();
display.setTextSize(2);
display.setCursor(0,0);
display.print("X: ");
display.println(x);
 
display.setTextSize(2);
display.setCursor(0,20);
display.print("Y: ");
display.println(y);
 
display.setTextSize(2);
display.setCursor(0,40);
display.print("Z: ");
display.println(z);
display.display();
 
delay(1000);
}



Output/Results

So once the code is uploaded, you can click on serial monitor to check the outputs. You need to tilt the MPU6050 Gyro/Accelerometer to detect the angular position of X, Y & Z axis.

The same tilting angles can be observed on OLED Display as well.

STM32 OLED Accelerometer

Share. Facebook Twitter Pinterest LinkedIn Tumblr Email Reddit Telegram WhatsApp
Previous ArticleESP8266 & MPU6050 Tilt Angle Monitor on IoT Blynk
Next Article DIY Ph Meter using PH Sensor & Arduino with OLED Display

Related Posts

PIR Motion Detection using Bluetooth & STM32 Board

PIR Motion Detection using Bluetooth & STM32 Board

Updated:December 23, 20234K
STM32 SHT85 Humidity Temperature Sensor

Collecting SHT85 Sensor Data using STM32 & Bluetooth Low Energy

Updated:August 20, 20222K
SX1276 STM32

Interfacing LoRa SX1276 with STM32 Microcontroller | LR1276-915MHz

Updated:May 29, 2023112K
BLE enabled Smart Bulb with STM32 & Javascript

BLE enabled Smart Bulb with STM32 & Javascript

Updated:August 20, 20222K
Create BLE Project using STM32 Microcontroller & BlueIO

Create BLE Project using STM32 Microcontroller & BlueIO

Updated:August 20, 202212K
DS18B20 STM32

Interfacing DS18B20 Temperature Sensor with STM32

Updated:August 21, 2022110K
View 1 Comment

1 Comment

  1. Andrew Reisinger on August 1, 2020 8:08 PM

    i get this error while trying to compile this sketch

    Arduino: 1.8.13 (Windows 10), Board: “Generic STM32F103C series, STM32F103C8 (20k RAM. 64k Flash), STM32duino bootloader, 72Mhz (Normal), Smallest (default)”

    C:\Users\reisi\Documents\Arduino\libraries\Adafruit_BusIO-master\Adafruit_SPIDevice.cpp: In member function ‘void Adafruit_SPIDevice::transfer(uint8_t*, size_t)’:

    C:\Users\reisi\Documents\Arduino\libraries\Adafruit_BusIO-master\Adafruit_SPIDevice.cpp:115:31: error: no matching function for call to ‘SPIClass::transfer(uint8_t*&, size_t&)’

    C++
    1
    2
    3
    4
    <code> _spi->transfer(buffer, len);
     
                               ^
    </code>

    C:\Users\reisi\Documents\Arduino\libraries\Adafruit_BusIO-master\Adafruit_SPIDevice.cpp:115:31: note: candidate is:

    In file included from C:\Users\reisi\Documents\Arduino\libraries\Adafruit_BusIO-master/Adafruit_SPIDevice.h:1:0,

    C++
    1
    2
    <code>             from C:\Users\reisi\Documents\Arduino\libraries\Adafruit_BusIO-master\Adafruit_SPIDevice.cpp:1:
    </code>

    C:\Users\reisi\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F1\2020.6.20\libraries\SPI\src/SPI.h:286:11: note: uint8 SPIClass::transfer(uint8) const

    C++
    1
    2
    3
    4
    <code> uint8 transfer(uint8 data) const;
     
           ^
    </code>

    C:\Users\reisi\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F1\2020.6.20\libraries\SPI\src/SPI.h:286:11: note: candidate expects 1 argument, 2 provided

    Multiple libraries were found for “Wire.h”

    Used: C:\Users\reisi\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F1\2020.6.20\libraries\Wire

    Not used: C:\Users\reisi\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F1\2020.6.20\libraries\WireSlave

    exit status 1

    Error compiling for board Generic STM32F103C series.

    This report would have more information with
    “Show verbose output during compilation”
    option enabled in File -> Preferences.

    Reply

CommentsCancel reply

Latest Posts
ESP32 Fingerprint Attendance System with Live Web Dashboard

ESP32 Fingerprint Attendance System with Live Web Dashboard

June 21, 2026
IoT Based PM & Air Quality Monitoring System using ESP32

IoT Based PM & Air Quality Monitoring System using ESP32

June 14, 2026
DIY ESP32 MLX90640 IR Thermal Camera with Live Web Display

DIY ESP32 MLX90640 IR Thermal Camera with Live Web Display

May 10, 2026
IoT Activity Tracker with ESP32 & Accelerometer Gyroscope

IoT Activity Tracker with ESP32 & Accelerometer/Gyroscope

May 2, 2026
A Guide to Sourcing Obsolete ICs for Vintage Projects

Beyond AliExpress: A Guide to Sourcing Obsolete ICs for Vintage Projects

April 21, 2026

ESP32 IoT Vehicle Motion Analyzer with MPU6050 & LIS3MDL

April 27, 2026
Building a Smart Sensor Node with a BLE Microcontroller

Building a Smart Sensor Node with a BLE Microcontroller

February 26, 2026
High-Accuracy Pitch, Roll, Yaw with ESP32 & BNO08x IMU

High-Accuracy Pitch, Roll, Yaw with ESP32 & BNO08x IMU

April 27, 2026
Top Posts & Pages
  • ESP32 Fingerprint Attendance System with Live Web Dashboard
    ESP32 Fingerprint Attendance System with Live Web Dashboard
  • Buck Converter: Basics, Working, Design & Application
    Buck Converter: Basics, Working, Design & Application
  • ESP32 CAN Bus Tutorial | Interfacing MCP2515 CAN Module with ESP32
    ESP32 CAN Bus Tutorial | Interfacing MCP2515 CAN Module with ESP32
  • 12V DC to 220V AC Inverter Circuit & PCB
    12V DC to 220V AC Inverter Circuit & PCB
  • IoT AC Energy Meter with PZEM-004T & ESP32 WebServer
    IoT AC Energy Meter with PZEM-004T & ESP32 WebServer
  • LD2410 Sensor with ESP32 - Human Presence Detection
    LD2410 Sensor with ESP32 - Human Presence Detection
  • DIY IoT Water pH Meter using pH Sensor & ESP32
    DIY IoT Water pH Meter using pH Sensor & ESP32
  • How to use ADS1115 16-Bit ADC Module with Arduino
    How to use ADS1115 16-Bit ADC Module with Arduino
Categories
  • Arduino Projects (197)
  • Articles (60)
    • Learn Electronics (19)
    • Product Review (15)
    • Tech Articles (28)
  • Electronics Circuits (46)
    • 555 Timer Projects (21)
    • Op-Amp Circuits (7)
    • Power Electronics (13)
  • IoT Projects (205)
    • ESP32 MicroPython (7)
    • ESP32 Projects (82)
    • ESP32-CAM Projects (15)
    • ESP8266 Projects (76)
    • LoRa/LoRaWAN Projects (22)
  • Microcontrollers (38)
    • AMB82-Mini IoT AI Camera (4)
    • BLE Projects (18)
    • STM32 Projects (19)
  • Raspberry Pi (93)
    • Raspberry Pi Pico Projects (57)
    • Raspberry Pi Pico W Projects (12)
    • Raspberry Pi Projects (24)
Follow Us
  • Facebook
  • Twitter
  • Pinterest
  • Instagram
  • YouTube
About Us

“‘How to Electronics’ is a vibrant community for electronics enthusiasts and professionals. We deliver latest insights in areas such as Embedded Systems, Power Electronics, AI, IoT, and Robotics. Our goal is to stimulate innovation and provide practical solutions for students, organizations, and industries. Join us to transform learning into a joyful journey of discovery and innovation.

Copyright © How To Electronics. All rights reserved.
  • About Us
  • Disclaimer
  • Privacy Policy
  • Contact Us
  • Advertise With Us

Type above and press Enter to search. Press Esc to cancel.

Ad Blocker Enabled!
Ad Blocker Enabled!
Looks like you're using an ad blocker. Please allow ads on our site. We rely on advertising to help fund our site.