#include <WiFi.h>
#include <HTTPClient.h>
#include <Wire.h>
const int MPU_addr = 0x68; // I2C do GY-521 - MPU-6050
int16_t AcX, AcY, AcZ, GyX, GyY, GyZ, Tmp;
#define USE_SERIAL Serial
// Informacoes do WiFi
const char* ssid = "";
const char* password = "";
const char* servidorWeb = "http://192.168.0.104/giracel/recebedados.php"; // IP do servidor Web
bool primeiravez = true;
unsigned long tempoDaOperacao = 20000; // tempo de envio para o Servidor - 20 seg.
unsigned long ultimaVez = 0;
void setup() {
int tentativas_conexao = 0;
Serial.begin(115200);
// Iniciando o modulo GY-521 - MPU-6050
Wire.begin();
Wire.beginTransmission(MPU_addr);
Wire.write(0x6B); // Registro PWR_MGMT_1
Wire.write(0); // definido como zero ativa o modulo MPU
Wire.endTransmission(true);
Serial.println("Escreveu para IMU");
WiFi.begin(ssid, password);
Serial.println("Conectando a ");
Serial.print(ssid);
while (WiFi.status() != WL_CONNECTED && tentativas_conexao < 30) {
tentativas_conexao++;
Serial.print(".");
delay(250);
}
if (WiFi.status() == WL_CONNECTED) {
Serial.println("WiFi conectado");
Serial.println("Endereco IP ESP32: ");
Serial.println(WiFi.localIP());
} else {
Serial.println("Erro de conexao...");
Serial.println("Verifique o usuario e a senha \ndo WiFi ou reinicie o ESP32");
}
}
void loop() {
// if (primeiravez) {
// conecta_obtem_dados_WEB(); // chama funcao que conecta e obtem dados do Servidor Web
// primeiravez = false;
// }
// controle de tempo sem delay para enviar dados para Web a cada 20 segundos
if ((millis() - ultimaVez) > tempoDaOperacao) {
mpu_read();
envia_dados_para_WEB();
ultimaVez = millis();
}
}
// com base no artigo: https://capsistema.com.br/index.php/2021/02/21/mpu6050-gyro-sensor-interface-com-placa-esp32/
void mpu_read() {
Wire.beginTransmission(MPU_addr);
Wire.write(0x3B); // comecando com o registro 0x3B (ACCEL_XOUT_H)
Wire.endTransmission(false);
Wire.requestFrom(MPU_addr, 14, true); // solicitar um total de 14 registros
AcX = Wire.read() << 8 | Wire.read(); // 0x3B (ACCEL_XOUT_H) & 0x3C (ACCEL_XOUT_L)
AcY = Wire.read() << 8 | Wire.read(); // 0x3D (ACCEL_YOUT_H) & 0x3E (ACCEL_YOUT_L)
AcZ = Wire.read() << 8 | Wire.read(); // 0x3F (ACCEL_ZOUT_H) & 0x40 (ACCEL_ZOUT_L)
Tmp = Wire.read() << 8 | Wire.read(); // 0x41 (TEMP_OUT_H) & 0x42 (TEMP_OUT_L)
GyX = Wire.read() << 8 | Wire.read(); // 0x43 (GYRO_XOUT_H) & 0x44 (GYRO_XOUT_L)
GyY = Wire.read() << 8 | Wire.read(); // 0x45 (GYRO_YOUT_H) & 0x46 (GYRO_YOUT_L)
GyZ = Wire.read() << 8 | Wire.read(); // 0x47 (GYRO_ZOUT_H) & 0x48 (GYRO_ZOUT_L)
Serial.print("Valores do acelerometro: \n");
Serial.print("AcX: ");
Serial.print(AcX);
Serial.print("\nAcY: ");
Serial.print(AcY);
Serial.print("\nAcZ: ");
Serial.print(AcZ);
Serial.print("\nTemperatura: " );
Serial.print(Tmp / 340.00 + 36.53);
Serial.print("ºC");
Serial.print("\nValores do giroscopio: \n");
Serial.print("GyX: ");
Serial.print(GyX);
Serial.print("\nGyY: ");
Serial.print(GyY);
Serial.print("\nGyZ: ");
Serial.print(GyZ);
Serial.print("\n");
delay(3000);
}
// funcao que obtem os dados da WEB
void conecta_obtem_dados_WEB() {
// se estiver conectado ao WiFi
if ((WiFi.status() == WL_CONNECTED)) {
HTTPClient http; // instancia objeto do tipo HTTPClient
int httpCode = http.GET();
if (httpCode > 0) { // obteve resposta do servidor
Serial.println("[HTTP] Encontrou o Servidor.");
Serial.println("[HTTP] GET... codigo recebido: " + httpCode);
if (httpCode == HTTP_CODE_OK) { // se for 200 esta OK
String res = http.getString(); // armazena o resultado do servidor
Serial.println("===============================================");
Serial.println(".......... Resultado recebido da pagina ........");
Serial.println(res);
Serial.println("********* Final do conteudo recebido **********");
// Chama a funcao que filtra e ajusta o resultado da pagina para executar a funcao necessaria
filtro_dados(res);
} // finaliza se nao obteve resposta do servidor
} else {
// mostra erro se a pagina nao for encontrada mas obteve resposta
Serial.printf("[HTTP] erro: %s\n", http.errorToString(httpCode).c_str());
}
http.end();
} else {
// se nao conectar no WiFI, nao faz nada
Serial.printf("[HTTP] Sem conexao WiFi, reinicie o ESP32 ou\nverifique o nome e a senha da Rede WiFi.\r\n");
}
}
// funcao que envia dados para a pagina WEB PHP de forma segura com POST
// Com base no material do curso e no artigo: https://randomnerdtutorials.com/esp32-esp8266-mysql-database-php/
void envia_dados_para_WEB() {
// se estiver conectado ao WiFi
if (WiFi.status() == WL_CONNECTED) {
WiFiClient cliente; // instancia objeto tipo WiFiClient
HTTPClient http; // instancia objeto tipo HTTPClient
http.begin(cliente, servidorWeb);
http.addHeader("Content-Type", "application/x-www-form-urlencoded");
String dados = "acx=" + (String)AcX + "&acy=" + (String)AcY +
"&acz=" + (String)AcZ + "&gyx=" + (String)GyX +
"&gyy=" + (String)GyY + "&gyz=" + (String)GyZ +
"&tmp=" + (String)Tmp;
String httpRequestData = dados;
uint8_t httpCode = http.POST(httpRequestData);
if (httpCode > 0) { // obteve resposta do servidor
Serial.printf("[HTTP] GET... codigo recebido: %d\n", httpCode);
// se a pagina existe no endereco URL e o codigo for 200 - OK
if (httpCode == HTTP_CODE_OK) {
String res = http.getString(); // armazena o resultado do servidor
Serial.println("===============================================");
Serial.println(".......... Resultado recebido da pagina ........");
res.trim();
Serial.println(res);
Serial.println("********* Final do conteudo recebido **********");
} // aqui nao obteve resposta do servidor e termina
} else {
//erro se a página não for encontrada mas obteve resposta e mostra o erro
Serial.printf("[HTTP] não envio ou dados, ERRO : %s\n", http.errorToString(httpCode).c_str());
}
http.end();
} else {
// se nao conectar no WiFi, nao faz nada
Serial.println("[HTTP] Sem conexao WiFi, reinicie o ESP32 ou verifique o nome e senha da Rede WiFi");
}
}
// funcao que filtra a ajusta os dados recebidos da Internet
void filtro_dados(String valorBrutoWeb) {
valorBrutoWeb.trim(); // remove os espacos em branco em torno do texto
String sAcX = separaString(valorBrutoWeb, ':', 0);
String sAcY = separaString(valorBrutoWeb, ':', 1);
String sAcZ = separaString(valorBrutoWeb, ':', 2);
String sGyX = separaString(valorBrutoWeb, ':', 3);
String sGyY = separaString(valorBrutoWeb, ':', 4);
String sGyZ = separaString(valorBrutoWeb, ':', 5);
String sTmp = separaString(valorBrutoWeb, ':', 6);
AcX = sAcX.toInt();
AcY = sAcY.toInt();
AcZ = sAcZ.toInt();
GyX = sGyX.toInt();
GyY = sGyY.toInt();
GyZ = sGyZ.toInt();
Tmp = sTmp.toInt();
}
// funcao que separa a String pelo sinal separador
String separaString(String data, char separator, int indice) {
int found = 0;
int strIndex[] = { 0, -1 };
int maxIndex = data.length() - 1;
for (int i = 0; i <= maxIndex && found <= indice; i++) {
if (data.charAt(i) == separator || i == maxIndex) {
found++;
strIndex[0] = strIndex[1] + 1;
strIndex[1] = (i == maxIndex) ? i + 1 : i;
}
}
return found > indice ? data.substring(strIndex[0], strIndex[1]) : "";
}