#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_ILI9341.h>
#include <MPU6050.h>
// Definições dos pinos do display
#define TFT_CS 10
#define TFT_RST 9
#define TFT_DC 8
// Inicialização do display
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_RST);
MPU6050 mpu;
#define REDRAW_DELAY 16 // atraso mínimo em milissegundos entre atualizações do display
#define HOR 172 // comprimento do vetor do horizonte
#define BROWN 0x5140
#define SKY_BLUE 0x02B5
#define XC 120 // coordenada x do centro do horizonte
#define YC 160 // coordenada y do centro do horizonte
#define DEG2RAD 0.0174532925
int last_roll = 0; // Últimos valores para comparação
int last_pitch = 0;
float last_temperature = 0; // Última temperatura para evitar piscadas
unsigned long redrawTime = 0;
// Função para desenhar o logo da Mitsubishi
void drawMitsubishiLogo(int x, int y) {
int size = 30; // Tamanho do losango
tft.fillTriangle(x, y - size, x - size, y, x + size, y, ILI9341_RED); // Losango de cima
tft.fillTriangle(x, y + size, x - size, y, x + size, y, ILI9341_RED); // Losango de baixo
tft.fillTriangle(x - size, y, x - 2 * size, y - size, x, y - size, ILI9341_RED); // Losango da esquerda
tft.fillTriangle(x + size, y, x + 2 * size, y - size, x, y - size, ILI9341_RED); // Losango da direita
}
void setup(void) {
Serial.begin(115200);
tft.begin();
tft.setRotation(0); // Defina a rotação correta para o seu display
// Exibe o logo da Mitsubishi na inicialização
tft.fillScreen(SKY_BLUE);
drawMitsubishiLogo(120, 160); // Centraliza o logo
delay(2000); // Mostra o logo por 2 segundos
tft.fillScreen(SKY_BLUE); // Limpa a tela após exibir o logo
// Configuração inicial do MPU6050
mpu.initialize();
if (!mpu.testConnection()) {
Serial.println("Falha na conexão com o MPU6050");
while (1);
}
// Desenhe o horizonte e as informações iniciais
drawHorizon(0, 0);
drawInfo();
delay(1000); // Atraso para verificação visual
tft.setTextColor(ILI9341_YELLOW, SKY_BLUE);
tft.setCursor(60, 20); // Ajuste a posição conforme necessário
tft.setTextSize(1);
tft.print("Iniciando...");
delay(2000); // Tempo para exibir "Iniciando"
tft.fillRect(60, 20, 100, 10, SKY_BLUE); // Apaga o texto "Iniciando"
}
void loop() {
if (millis() > redrawTime) {
redrawTime = millis() + REDRAW_DELAY;
// Leitura de dados do MPU6050
int16_t ax, ay, az, temp;
mpu.getAcceleration(&ax, &ay, &az);
temp = mpu.getTemperature();
// Calcule roll e pitch a partir dos dados de aceleração
float roll = atan2(ay, az) * 180 / PI;
float pitch = atan2(-ax, sqrt(ay * ay + az * az)) * 180 / PI;
updateHorizon(roll, pitch);
// Exibir a temperatura na tela
float temperature = temp / 340.00 + 36.53; // Conversão da leitura do sensor para °C
if (abs(temperature - last_temperature) > 0.1) { // Atualiza só se a variação for significativa
displayTemperature(temperature);
last_temperature = temperature;
}
}
}
void updateHorizon(int roll, int pitch) {
if (last_roll != roll || last_pitch != pitch) {
drawHorizon(roll, pitch);
last_roll = roll;
last_pitch = pitch;
}
drawInfo(); // Mantenha o display das informações atualizado
}
void drawHorizon(int roll, int pitch) {
// Apaga a tela anterior para evitar sobreposições
tft.fillScreen(SKY_BLUE);
// Calcule as coordenadas para a linha de horizonte inclinada
float sx = cos(roll * DEG2RAD);
float sy = sin(roll * DEG2RAD);
int16_t x0 = sx * HOR;
int16_t y0 = sy * HOR;
// Desenhar o céu acima da linha do horizonte
tft.fillTriangle(XC - x0, YC - y0 - pitch, XC + x0, YC + y0 - pitch, XC - x0, YC, SKY_BLUE);
tft.fillTriangle(XC - x0, YC, XC + x0, YC + y0 - pitch, XC + x0, YC - y0 - pitch, SKY_BLUE);
// Desenhar o solo abaixo da linha do horizonte
tft.fillTriangle(XC - x0, YC + y0 - pitch, XC + x0, YC + y0 - pitch, XC + x0, YC, BROWN);
tft.fillTriangle(XC - x0, YC, XC + x0, YC + y0 - pitch, XC + x0, YC + y0 - pitch, BROWN);
// Desenhar a linha do horizonte
tft.drawLine(XC - x0, YC - y0 - pitch, XC + x0, YC + y0 - pitch, ILI9341_WHITE);
}
void drawInfo(void) {
// Gráfico de asas niveladas
tft.fillRect(120 - 1, 160 - 1, 3, 3, ILI9341_RED);
tft.drawFastHLine(120 - 30, 160, 24, ILI9341_RED);
tft.drawFastHLine(120 + 30 - 24, 160, 24, ILI9341_RED);
tft.drawFastVLine(120 - 30 + 24, 160, 3, ILI9341_RED);
tft.drawFastVLine(120 + 30 - 24, 160, 3, ILI9341_RED);
// Exibir valor do roll
tft.setTextColor(ILI9341_YELLOW, SKY_BLUE); // Texto com fundo
tft.setCursor(120, 240 - 10); // Justificado ao centro
tft.setTextSize(1);
tft.print(last_roll);
// Exibir valor do pitch
tft.setTextColor(ILI9341_YELLOW, SKY_BLUE); // Texto com fundo
tft.setCursor(120, 230 - 10); // Justificado ao centro
tft.setTextSize(1);
tft.print(last_pitch);
}
void displayTemperature(float temperature) {
tft.setTextColor(ILI9341_YELLOW, SKY_BLUE);
tft.setCursor(0, 10); // Ajuste conforme necessário para posicionamento
tft.setTextSize(1);
// Apaga a temperatura anterior
tft.fillRect(0, 10, 80, 10, SKY_BLUE);
// Exibe a nova temperatura na tela
tft.print("Temp: ");
tft.print(temperature);
tft.print(" C");
}