Exibindo dados do sensor MPU-6050 em LCD 1602 ou LCD2004 com Arduino
Neste tutorial, aprenderemos como exibir dados do sensor MPU-6050 em um LCD 1602 ou LCD2004 usando Arduino. O MPU-6050 é um sensor versátil que combina um giroscópio de 3 eixos e um acelerômetro de 3 eixos, tornando-o ideal para várias aplicações, como detecção de movimento e orientação. Ao conectar esse sensor a um display LCD, podemos visualizar os dados do sensor em tempo real, incluindo ângulos e temperatura.

À medida que avançamos neste projeto, abordaremos os componentes de hardware necessários, os detalhes da fiação e a implementação do código. Isso ajudará você a entender como configurar o MPU-6050 e exibir sua saída em um LCD. Para esclarecimentos adicionais sobre o código, não deixe de conferir o vídeo (em 00:00).
Hardware Explicado
Os componentes principais para este projeto são a placa Arduino, o sensor MPU-6050 e o display LCD (1602 ou 2004). O Arduino serve como o microcontrolador que processa os dados do MPU-6050 e os envia para o LCD.
O sensor MPU-6050 utiliza comunicação I2C para enviar dados ao Arduino. Inclui um acelerómetro e um giroscópio, que lhe permitem detetar movimento e orientação. O ecrã LCD é usado para mostrar os ângulos derivados dos dados do sensor. Também se conecta ao Arduino via I2C, o que simplifica a fiação e a comunicação.
Detalhes da ficha técnica
| Fabricante | Invensense |
|---|---|
| Número da peça | MPU-6050 |
| Tensão lógica/E/S | 3.3 V / 5 V |
| Tensão de alimentação | 3.3 V a 5 V |
| Taxa de dados de saída | 1 kHz (máx.) |
| Faixa de temperatura | -40 a +85 °C |
| Pacote | QFN |
| Notas / variantes | Giroscópio e acelerômetro integrados |
- Garanta uma fonte de alimentação adequada dentro da faixa de tensão especificada.
- Use resistores pull-up nas linhas I2C, se necessário.
- Verifique se o endereço I2C é compatível com a sua configuração.
- Calibre o sensor para leituras precisas.
- Tenha cuidado com a fiação para evitar curtos-circuitos.
Instruções de fiação

Para ligar o MPU-6050 ao Arduino, comece conectando o pino VCC do MPU-6050 ao pino 5V do Arduino. Em seguida, conecte o pino GND do MPU-6050 a um dos pinos GND do Arduino. Para comunicação I2C, conecte o pino SDA do MPU-6050 ao pino analógico A4 do Arduino e conecte o pino SCL ao pino analógico A5.
Para o display LCD, conecte o pino VCC ao pino 5V do Arduino e o pino GND também ao pino GND do Arduino. Conecte o pino SDA do LCD ao mesmo pino A4 usado pelo MPU-6050, e o pino SCL do LCD ao pino A5. Dessa forma, tanto o MPU-6050 quanto o LCD compartilham as mesmas linhas I2C, simplificando a fiação.

Certifique-se de que as conexões estão seguras e de que não há fios soltos. Se o seu LCD ou sensor não ligar, verifique novamente a fiação e as conexões.
Exemplos de código e guia passo a passo
No código, começamos incluindo as bibliotecas necessárias para o MPU-6050 e o LCD:
#include
#include
#include
Aqui, criamos instâncias tanto do MPU-6050 quanto do LCD. O MPU-6050 é inicializado com a biblioteca Wire para comunicação I2C, enquanto o LCD é configurado com seu endereço e dimensões.
Na função setup, inicializamos o sensor e o LCD:

void setup() {
Serial.begin(9600);
Wire.begin();
mpu6050.begin();
lcd.begin();
lcd.backlight();
lcd.clear();
}
Este código configura a comunicação serial para depuração, inicializa a comunicação I2C e prepara o LCD para exibição. A retroiluminação é ligada para tornar o display visível.
Na função loop, lemos continuamente os dados do MPU-6050 e os exibimos no LCD:
void loop() {
mpu6050.update();
lcd.clear();
lcdDisplay(mpu6050.getAngleX(), mpu6050.getAngleY(), mpu6050.getAngleZ());
delay(100);
}
Este trecho atualiza os dados do sensor e limpa o LCD para novas leituras a cada 100 milissegundos. A função lcdDisplay é chamada para mostrar os ângulos no LCD.
Para uma compreensão completa, assista ao vídeo correspondente onde o código completo é demonstrado (no vídeo em 00:00).
Demonstração / O que esperar
Quando tudo estiver configurado corretamente, o LCD deverá exibir os ângulos dos eixos X, Y e Z em tempo real. Você pode inclinar o sensor MPU-6050 para ver as alterações no display. Se encontrar problemas, verifique se a polaridade da fiação não está invertida ou certifique-se de que os endereços I2C estão configurados corretamente.
Monitorar os valores no LCD permitirá que você veja como o sensor responde a movimentos e alterações de orientação. Se os valores parecerem estáticos ou incorretos, verifique as conexões e certifique-se de que o sensor está funcionando corretamente.
/*
*
* This code is basic usage of the MPU-6050 accelerometer and gyroscope.
* Running this code, you will get angles only.
* The angles at X, Y, and Z are displayed on the LCD2004-I2C display module.
*
* Library and code have been taken from:
* https://github.com/tockn/MPU6050_tockn
*
* Updated by Ahmad Shamshiri on July 07, 2018 at 13:43 in Ajax, Ontario, Canada
* for Robojax.com
* Get this code from Robojax.com
* Watch video instruction for this code at: https://youtu.be/ixe--SXemp8
*
* You will need to watch two videos before following the instructions in this video:
* 1-MPU6050 Introduction video and code: https://youtu.be/uhh7ik02aDc
* 2-LCD1602 with I2C module video and code: https://youtu.be/q9YC_GVHy5A
*/
#include <MPU6050_tockn.h>
#include <Wire.h>
MPU6050 mpu6050(Wire);
#include <LiquidCrystal_I2C.h>
// Set the LCD address to 0x27 for a 20 chars and 4 line display
LiquidCrystal_I2C lcd(0x27, 20, 4);
void setup() {
Serial.begin(9600);
Wire.begin();
mpu6050.begin();
mpu6050.calcGyroOffsets(false);
// initialize the LCD,
lcd.begin();
// Turn on the backlight and print a message.
lcd.backlight();
lcd.clear();
lcd.setCursor (0,0); //
lcd.print("Robojax MPU-6050");
lcd.setCursor (0,1); //
lcd.print("Please Wait - 3");
lcd.setCursor (0,1); //
delay(1000);
lcd.print("Please Wait - 2");
delay(1000);
lcd.setCursor (0,1); //
lcd.print("Please Wait - 1");
delay(1000);
}
void loop() {
mpu6050.update();
Serial.print("angleX : ");
Serial.print(mpu6050.getAngleX());
Serial.print("\tangleY : ");
Serial.print(mpu6050.getAngleY());
Serial.print("\tangleZ : ");
Serial.println(mpu6050.getAngleZ());
lcd.clear();// clearn previous values from screen
lcdDisplay(
mpu6050.getAngleX(), // send angle X
mpu6050.getAngleY(), // send angle Y
mpu6050.getAngleZ() // send angle Z
);
delay(100);
}// loop end
/*
* Written by Ahmad Shamshiri for Robojax.com
* lcdDisplay(float x, float y, float z)
* displays value and title on LCD2004-I2C display
* How to use:
* just pass the three values and it will display them.
* lcdDisplay(mpu6050.getAngleX() , mpu6050.getAngleY() , mpu6050.getAngleZ() )
*/
void lcdDisplay(float x, float y, float z)
{
// Robojax.com MPU6050 Demo with LCD2004-I2C Display
lcd.setCursor (0,0); //
lcd.print("Robojax MPU-6050");
lcd.setCursor (0,1); //character zero, line 1
lcd.print("Angle X:");
lcd.setCursor (9,1); //
lcd.print(x);
lcd.setCursor (0,2); //character zero, line 2
lcd.print("Angle Y:");
lcd.setCursor (9,2); //
lcd.print(y);
lcd.setCursor (0,3); //character zero, line 3
lcd.print("Angle Z:");
lcd.setCursor (9,3); //
lcd.print(z);
}
/*
*
* This code is basic usage of the MPU-6050 accelerometer and gyroscope.
*
* This code displays data on the LCD2004 display based on
* the option you set. See below.
*
*
* Library and code have been taken from:
* https://github.com/tockn/MPU6050_tockn
*
* Updated by Ahmad Shamshiri on July 03, 2018 in Ajax, Ontario, Canada
* for Robojax.com
* Get this code from Robojax.com
* Watch video instructions for this code at: https://youtu.be/ixe--SXemp8
*
* You will need to watch two videos before following the instructions in this video:
* 1-MPU6050 Introduction video and code: https://youtu.be/uhh7ik02aDc
* 2-LCD1602 with I2C module video and code: https://youtu.be/q9YC_GVHy5A
*/
#include <MPU6050_tockn.h>
#include <Wire.h>
MPU6050 mpu6050(Wire);
long timer = 0;
#include <LiquidCrystal_I2C.h>
// Set the LCD address to 0x27 for a 20 chars and 4 line display
LiquidCrystal_I2C lcd(0x27, 20, 4);
int typeSelect = 6;// select type . See below
String type[]={ "GyroAng and Ang",// select 0
"GyroAng and Acc",// select 1
"GyroAng and Gyro",// select 2
"AccAng and Acc",// select 3
"AccAng & Gyro",// select 4
"AccAng and Ang",// select 5
"Angle and Temp"// select 6
};
void setup() {
Serial.begin(9600);
Wire.begin();
mpu6050.begin();
mpu6050.calcGyroOffsets(true);
// initialize the LCD,
lcd.begin();
// Turn on the backlight and print a message.
lcd.backlight();
}
void loop() {
mpu6050.update();
if(millis() - timer > 1000){
Serial.println("=======================================================");
Serial.print("temp : ");Serial.println(mpu6050.getTemp());
Serial.print("accX : ");Serial.print(mpu6050.getAccX());
Serial.print("\taccY : ");Serial.print(mpu6050.getAccY());
Serial.print("\taccZ : ");Serial.println(mpu6050.getAccZ());
Serial.print("gyroX : ");Serial.print(mpu6050.getGyroX());
Serial.print("\tgyroY : ");Serial.print(mpu6050.getGyroY());
Serial.print("\tgyroZ : ");Serial.println(mpu6050.getGyroZ());
Serial.print("accAngleX : "); Serial.print(mpu6050.getAccAngleX());
Serial.print("\taccAngleY : ");Serial.println(mpu6050.getAccAngleY());
Serial.print("gyroAngleX : ");Serial.print(mpu6050.getGyroAngleX());
Serial.print("\tgyroAngleY : ");Serial.print(mpu6050.getGyroAngleY());
Serial.print("\tgyroAngleZ : ");Serial.println(mpu6050.getGyroAngleZ());
Serial.print("angleX : ");Serial.print(mpu6050.getAngleX());
Serial.print("\tangleY : ");Serial.print(mpu6050.getAngleY());
Serial.print("\tangleZ : ");Serial.println(mpu6050.getAngleZ());
Serial.println("=======================================================\n");
timer = millis();
}// if
lcd.clear();// clearn previous values from screen
switch (typeSelect)
{
case 0:// display GyroAngle and Angle
lcdDisplay(mpu6050.getGyroAngleX(),mpu6050.getGyroAngleY(),mpu6050.getGyroAngleZ(),
mpu6050.getAngleX(),mpu6050.getAngleY(),mpu6050.getAngleZ()
);
break;
case 1:// display GyroAngle and Acceleration value
lcdDisplay(mpu6050.getAngleX(),mpu6050.getAngleY(),mpu6050.getAngleZ(),
mpu6050.getAccX(),mpu6050.getAccY(),mpu6050.getAccZ()
);
break;
case 2:// display GyroAngle and Gyroscope value
lcdDisplay(mpu6050.getAngleX(),mpu6050.getAngleY(),mpu6050.getAngleZ(),
mpu6050.getGyroX(),mpu6050.getGyroY(),mpu6050.getGyroZ()
);
break;
case 3:// display Acceleration Angle and Acceleration value
lcdDisplay(mpu6050.getAccAngleX(),mpu6050.getAccAngleY(),0.0,
mpu6050.getAccX(),mpu6050.getAccY(),mpu6050.getAccZ()
);
break;
case 4:// display Acceleration Angle and Gyro value
lcdDisplay(mpu6050.getAccAngleX(),mpu6050.getAccAngleY(), 0.0,
mpu6050.getGyroX(),mpu6050.getGyroY(),mpu6050.getGyroZ()
);
break;
case 5:// display Acceleration Angle and Angle
lcdDisplay(mpu6050.getAccAngleX(),mpu6050.getAccAngleY(), 0.0,
mpu6050.getAngleX(),mpu6050.getAngleY(),mpu6050.getAngleZ()
);
break;
case 6:// display angle and Temperature
lcdDisplay(mpu6050.getAngleX(),mpu6050.getAngleY(),mpu6050.getAngleZ(),
mpu6050.getTemp(), 0.0, 0.0
);
break;
}// switch end
delay(100);
}// loop
/*
* Written by Ahmad Shamshiri for Robojax.com
* lcdDisplay(lcdDisplay(float x, float y, float z, float x1, float y1, float z1)
* displays values and titles on the LCD2004-I2C display.
* How to use:
* just pass the 6 values and it will display them.
lcdDisplay(mpu6050.getAccAngleX(),mpu6050.getAccAngleY(),mpu6050.getAccAngleZ(),
mpu6050.getAngleX(),mpu6050.getAngleY(),mpu6050.getAngleZ()
);
*/
void lcdDisplay(float x, float y, float z, float x1, float y1, float z1)
{
// Robojax.com MPU6050 Demo with LCD2004-I2C Display
lcd.setCursor (0,0); //
lcd.print(type[typeSelect]);
lcd.setCursor (17,0); //
String dis = "("+String(typeSelect)+")";
lcd.print(dis);
if(typeSelect !=6){
lcd.setCursor (0,1); //character zero, line 1
lcd.print("X:");
lcd.setCursor (2,1); //
lcd.print(x);
/////////////////////
lcd.setCursor (10,1); //character zero, line 1
lcd.print("X1:");
lcd.setCursor (13,1); //
lcd.print(x1);
lcd.setCursor (0,2); //character zero, line 2
lcd.print("Y:");
lcd.setCursor (2,2); //
lcd.print(y);
////////////////////////
lcd.setCursor (10,2); //character zero, line 1
lcd.print("Y1:");
lcd.setCursor (13,2); //
lcd.print(y1);
lcd.setCursor (0,3); //character zero, line 3
lcd.print("Z:");
lcd.setCursor (2,3); //
lcd.print(z);
//////////////////////
lcd.setCursor (10,3); //character zero, line 3
lcd.print("Z1:");
lcd.setCursor (13,3); //
lcd.print(z1);
}else{
lcd.setCursor (0,1); //character zero, line 1
lcd.print("X:");
lcd.setCursor (2,1); //
lcd.print(x);
/////////////////////
lcd.setCursor (10,1); //character zero, line 1
lcd.print("TMP: ");
lcd.setCursor (15,1); //
lcd.print(x1);
lcd.setCursor (0,2); //character zero, line 2
lcd.print("Y:");
lcd.setCursor (2,2); //
lcd.print(y);
lcd.setCursor (0,3); //character zero, line 3
lcd.print("Z:");
lcd.setCursor (2,3); //
lcd.print(z);
}
}
Recursos e referências
-
ExternoBaixe a biblioteca do GitHubgithub.com
-
ExternoSite do fabricanteinvensense.com
Arquivos📁
Bibliotecas do Arduino (zip)
-
Biblioteca Arduino para MPU9250
robojax-MPU9250-master.zip3.38 MB
Arquivo Fritzing
-
Módulo LCD LCD1602-I2C com 4 fios
LCD1602-I2C.fzpz0.01 MB -
Placa MPU-6050 GY-521
MPU-6050 Board GY-521.fzpz0.01 MB -
LCD2004-I2C
LCD2004-I2C.fzpz0.02 MB
Outros arquivos
-
Biblioteca LiquidCrystal LCD1602
robojax-LCD1602_LiquidCrystal.zip