#include <Adafruit_MPU6050.h>
#include <Adafruit_Sensor.h>
#include <Wire.h>
#include <WiFi.h>
#include <WiFiClient.h>
#include "ThingSpeak.h"
///########### configuração do wifi
#define WIFI_SSID "Wokwi-GUEST"
#define WIFI_PASSWORD ""
// Defining the WiFi channel speeds up the connection:
#define WIFI_CHANNEL 6
int status = WL_IDLE_STATUS; // the Wifi radio's status
//configuração do thingspeak
const int myChannelNumber = 2570523;
const char* myApiKey = "OAVGA2HQ5EWH1QPV";
const char* server = "api.thingspeak.com";
unsigned long ultimaAtualizacao = 0;
const unsigned long intervaloEnvio = 15000; // Intervalo de envio em milissegundos (15 segundos)
WiFiClient client;
Adafruit_MPU6050 mpu; // Objeto para interagir com o sensor MPU6050
void setup() {
Serial.begin(115200); // Inicia a comunicação serial com uma taxa de 115200 bps
while (!mpu.begin()) {
Serial.println("MPU6050 não conectado!"); // Mensagem de aviso se o MPU6050 não estiver conectado
delay(1000); // Aguarda 1 segundo antes de tentar novamente
}
Serial.println("MPU6050 pronto!"); // Mensagem indicando que o MPU6050 está pronto
conectawifi(); // Chama a função para conectar-se à rede WiFi
}
void loop() {
sensors_event_t a, g, temp; // Estruturas para armazenar dados do acelerômetro, giroscópio e temperatura
mpu.getEvent(&a, &g, &temp); // Obtém dados do acelerômetro, giroscópio e temperatura
Serial.print("[");
Serial.print(millis());
Serial.print("] X: ");
//unidades de força g, onde 1g = 9,80665 m/s².
Serial.print(a.acceleration.x/9.80665,2);//Imprime com 2 casas decimais
Serial.print(", Y: ");
Serial.print(a.acceleration.y/9.80665,2);//Imprime com 2 casas decimais
Serial.print(", Z: ");
Serial.print(a.acceleration.z);
Serial.println(" m/s^2"); // Imprime dados do acelerômetro no monitor serial
//1 Radiano por Segundo = 57.2957795130931 Grau por Segundo
Serial.print("Rotation X: ");
Serial.print(g.gyro.x*57.2957795130931,2); //Imprime com 2 casas decimais
Serial.print(", Y: ");
Serial.print(g.gyro.y*57.2957795130931,2);//Imprime com 2 casas decimais
Serial.print(", Z: ");
Serial.print(g.gyro.z);
Serial.println(" rad/s"); // Imprime dados do giroscópio no monitor serial
Serial.print("Temperature: ");
Serial.print(temp.temperature);
Serial.println(" degC"); // Imprime dados de temperatura no monitor serial
delay(500); // Aguarda 500 milissegundos antes de repetir o loop
// Verifica se passou o intervalo de 15 segundos desde a última atualização
if (millis() - ultimaAtualizacao >= intervaloEnvio) {
// Configura os campos no ThingSpeak para enviar os dados normalizados
ThingSpeak.setField(1, static_cast<float>( a.acceleration.x / 9.80665)); // Substitua pelo valor que deseja enviar
ThingSpeak.setField(2, static_cast<float>( a.acceleration.y / 9.80665));
ThingSpeak.setField(3, static_cast<float>( a.acceleration.z / 9.80665));
ThingSpeak.setField(4, static_cast<float>( g.gyro.x * 57.2957795130931));
ThingSpeak.setField(5, static_cast<float>( g.gyro.y * 57.2957795130931));
ThingSpeak.setField(6, static_cast<float>( g.gyro.z * 57.2957795130931));
ThingSpeak.setField(7, temp.temperature);
// Envia os dados para o ThingSpeak e verifica o código de resposta
int x = ThingSpeak.writeFields(myChannelNumber, myApiKey);
// Verifica se o envio foi bem-sucedido ou se houve algum erro
if (x == 200) {
Serial.println("Dado enviado com sucesso");
} else {
Serial.println("Erro de envio: " + String(x));
}
// Atualiza o tempo da última atualização para controlar o próximo envio
ultimaAtualizacao = millis();
}
}//fim do loop()
// Função para conectar-se à rede WiFi
void conectawifi() {
WiFi.begin(WIFI_SSID, WIFI_PASSWORD, WIFI_CHANNEL);
Serial.print("Conectando ao WiFi ");
Serial.print(WIFI_SSID);
// Aguarda a conexão
while (WiFi.status() != WL_CONNECTED) {
delay(100);
Serial.print(".");
}
Serial.println(" Conectado!");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
WiFi.mode(WIFI_STA);
ThingSpeak.begin(client);
}