#include <Adafruit_MPU6050.h> // Biblioteca para o sensor MPU6050
#include <Adafruit_Sensor.h> // Biblioteca base para trabalhar com sensores
#include <Wire.h> // Biblioteca para comunicação I2C
#include <WiFi.h> // Biblioteca para conexão WiFi em placas ESP32
#include <WiFiClient.h> // Biblioteca que permite a conexão com servidores
#include "ThingSpeak.h" // Biblioteca para comunicação com o servidor ThingSpeak
//########### configuração do wifi
#define WIFI_SSID "Wokwi-GUEST" // Nome da rede WiFi
#define WIFI_PASSWORD "" // Senha da rede (vazia neste caso)
// Definir o canal do WiFi acelera a conexão:
#define WIFI_CHANNEL 6 // Canal WiFi definido como 6
int status = WL_IDLE_STATUS; // Status inicial do rádio WiFi
// Configuração do ThingSpeak
const int myChannelNumber = 2690640; // Número do canal no ThingSpeak
const char* myApiKey = "DE9QMYQA6J3J533S"; // Chave de API para enviar dados
const char* server = "api.thingspeak.com"; // Endereço do servidor ThingSpeak
unsigned long ultimaAtualizacao = 0; // Marca o último momento de envio de dados
const unsigned long intervaloEnvio = 15000; // Intervalo de 15 segundos para envio dos dados
WiFiClient client; // Objeto cliente WiFi usado na conexão
Adafruit_MPU6050 mpu; // Objeto para interagir com o sensor MPU6050
void setup() {
Serial.begin(115200); // Inicia comunicação serial com a velocidade de 115200 bps
while (!mpu.begin()) {
Serial.println("MPU6050 não conectado!"); // Se o sensor não for detectado, exibe esta mensagem
delay(1000); // Aguarda 1 segundo antes de tentar reconectar
}
Serial.println("MPU6050 pronto!"); // Confirma que o sensor foi conectado corretamente
conectawifi(); // Chama a função para conectar-se à rede WiFi
}
void loop() {
sensors_event_t a, g, temp; // Estruturas para armazenar dados de aceleração, giroscópio e temperatura
mpu.getEvent(&a, &g, &temp); // Obtém os dados dos sensores
Serial.print("[");
Serial.print(millis()); // Imprime o tempo desde que o programa iniciou
Serial.print("] X: ");
// Força em unidades "g", onde 1g = 9,80665 m/s²
Serial.print(a.acceleration.x / 9.80665, 2); // Aceleração no eixo X em g
Serial.print(", Y: ");
Serial.print(a.acceleration.y / 9.80665, 2); // Aceleração no eixo Y em g
Serial.print(", Z: ");
Serial.print(a.acceleration.z); // Aceleração no eixo Z
Serial.println(" m/s^2"); // Imprime os valores de aceleração no monitor serial
// Rotação em radianos por segundo (conversão para graus por segundo)
Serial.print("Rotation X: ");
Serial.print(g.gyro.x * 57.2957795130931, 2); // Rotação no eixo X em graus por segundo
Serial.print(", Y: ");
Serial.print(g.gyro.y * 57.2957795130931, 2); // Rotação no eixo Y em graus por segundo
Serial.print(", Z: ");
Serial.print(g.gyro.z); // Rotação no eixo Z
Serial.println(" rad/s"); // Imprime valores do giroscópio
Serial.print("Temperature: ");
Serial.print(temp.temperature); // Temperatura atual
Serial.println(" degC"); // Imprime temperatura em graus Celsius
delay(500); // Aguarda 500 milissegundos antes de repetir o loop
// Verifica se 15 segundos se passaram desde a última atualização
if (millis() - ultimaAtualizacao >= intervaloEnvio) {
// Preenche os campos no ThingSpeak com os dados coletados e normalizados
ThingSpeak.setField(1, static_cast<float>(a.acceleration.x / 9.80665)); // Envia aceleração X
ThingSpeak.setField(2, static_cast<float>(a.acceleration.y / 9.80665)); // Envia aceleração Y
ThingSpeak.setField(3, static_cast<float>(a.acceleration.z / 9.80665)); // Envia aceleração Z
ThingSpeak.setField(4, static_cast<float>(g.gyro.x * 57.2957795130931)); // Envia rotação X
ThingSpeak.setField(5, static_cast<float>(g.gyro.y * 57.2957795130931)); // Envia rotação Y
ThingSpeak.setField(6, static_cast<float>(g.gyro.z * 57.2957795130931)); // Envia rotação Z
ThingSpeak.setField(7, temp.temperature); // Envia a temperatura
// Envia os dados para o ThingSpeak e armazena o código de resposta
int x = ThingSpeak.writeFields(myChannelNumber, myApiKey);
// Verifica se o envio foi bem-sucedido
if (x == 200) {
Serial.println("Dado enviado com sucesso");
} else {
Serial.println("Erro de envio: " + String(x)); // Se houver erro, imprime o código do erro
}
// Atualiza o tempo da última atualização
ultimaAtualizacao = millis();
}
}
// Função para conectar ao WiFi
void conectawifi() {
WiFi.begin(WIFI_SSID, WIFI_PASSWORD, WIFI_CHANNEL); // Inicia a conexão com o WiFi
Serial.print("Conectando ao WiFi ");
Serial.print(WIFI_SSID);
// Aguarda até que a conexão WiFi seja estabelecida
while (WiFi.status() != WL_CONNECTED) {
delay(100); // Pausa de 100ms entre tentativas
Serial.print("."); // Indica que está tentando conectar
}
Serial.println(" Conectado!"); // Mensagem de sucesso na conexão
Serial.print("IP address: ");
Serial.println(WiFi.localIP()); // Imprime o endereço IP obtido
WiFi.mode(WIFI_STA); // Configura o modo WiFi como estação (não ponto de acesso)
ThingSpeak.begin(client); // Inicia a comunicação com o ThingSpeak
}