//versão 1.0.0
#include <HTTPClient.h>
#include <WiFi.h>
#include <Wire.h>
#include <Adafruit_BMP280.h>
#include "DHT.h"
#define DHT_PIN 25
#define DHT_TYPE DHT22
DHT dht(DHT_PIN, DHT_TYPE);
// Configuração global da rede Wi-Fi
const char* ssid = "WIFI_PRIVADO"; // MODIFICAR ESTA LINHA
const char* password = "educacao24"; // MODIFICAR ESTA LINHA
int btnGPIO = 0;
int btnState = false;
// Configuração global da API
const char* FKhorta = "20"; // MODIFICAR ESTA LINHA
const char* apikey = "**************************************"; // MODIFICAR ESTA LINHA
Adafruit_BMP280 bmp; // I2C do BMP280 (SDA = PINO 21 E SCL = PINO 22)
// Protótipos das funções
void bmpStart();
int enviar(int inFKsensor, float inValor, int posicaoSensorLista);
void compararEnviar(int posicaoSensorLista, float valor, float diferenca);
void verifiqueInternetReconecte(int espera);
void conectar();
// Estrutura para informações de sensores
struct SensorInfo {
int FK;
int success;
float lastValue;
int pin;
};
const int totalSensores = 4; // possui 'totalSensores+1' posições começando do índice zero.
SensorInfo sensorLista[totalSensores];
void configureSensors() {
float valueConsideredNull = -10000;
// Sensor de temperatura DHT22
sensorLista[0] = {60, 1, valueConsideredNull, -1}; // -1 indica que não usa pino específico
// Sensor de temperatura bmp
sensorLista[3] = {63, 1, valueConsideredNull, -1};
// Sensor de umidade
sensorLista[1] = {61, 1, valueConsideredNull, -1};
// Sensor de pressão
sensorLista[2] = {62, 1, valueConsideredNull, -1}; // MODIFICAR ESTA LINHA. ID 30 // -1 indica que não usa pino específico
}
void setup() {
Serial.begin(9600); // Inicializando a comunicação serial
pinMode(DHT_PIN, INPUT);
dht.begin(); // Inicializa o sensor DHT22
conectar();
configureSensors();
bmpStart();
}
void loop() {
verifiqueInternetReconecte(2000);
float readTempC = dht.readTemperature(); // ler temperatura em Graus Celsius.
//compararEnviar(0, readTempC, 0.2);
enviar(sensorLista[0].FK, readTempC, 0);
// Sensor de umidade
float readUmidade = dht.readHumidity(); // ler umidade em %
//compararEnviar(1, readUmidade, 2);
enviar(sensorLista[1].FK, readUmidade, 1);
float readPressaoHPA = bmp.readPressure() / 100; // pressão menor ar úmido forçado para cima unidade: hPa
//compararEnviar(2, readPressaoHPA, 0.05);
enviar(sensorLista[2].FK, readPressaoHPA, 2);
float readTempCbmp = bmp.readTemperature(); // ler temperatura em Graus Celsius.
//compararEnviar(3, readTempCbmp, 0.2);
enviar(sensorLista[3].FK, readTempCbmp, 3);
delay(30000);
}
void verifiqueInternetReconecte(int espera) {
if (WiFi.status() != WL_CONNECTED) {
Serial.print("Sem internet. Tentar conexão em ");
Serial.print(espera);
Serial.println(" segundos...");
delay(espera);
conectar();
}
}
void compararEnviar(int sensorIndex, float valor, float limite) {
float temp[3] = {sensorLista[sensorIndex].FK, sensorLista[sensorIndex].success, sensorLista[sensorIndex].lastValue};
float FKsensor = temp[0];
float sucesso = temp[1];
float anterior = temp[2];
if (abs(valor - anterior) >= limite) {
int result = enviar(FKsensor, valor, sensorIndex);
if (result == 1) {
sensorLista[sensorIndex].success = 1;
sensorLista[sensorIndex].lastValue = valor;
}
} else {
// Não envia
Serial.println("Diferença pequena no sensor de ID:" + String(FKsensor) +" Valor: "+String(valor));
}
}
void conectar() {
pinMode(btnGPIO, INPUT);
Serial.print("[WiFi] Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
int tryDelay = 500;
int numberOfTries = 20;
while (true) {
switch (WiFi.status()) {
case WL_NO_SSID_AVAIL:
Serial.println("[WiFi] SSID not found");
break;
case WL_CONNECT_FAILED:
Serial.print("[WiFi] Failed - WiFi not connected! Reason: ");
return;
break;
case WL_CONNECTION_LOST:
Serial.println("[WiFi] Connection was lost");
break;
case WL_SCAN_COMPLETED:
Serial.println("[WiFi] Scan is completed");
break;
case WL_DISCONNECTED:
Serial.println("[WiFi] WiFi is disconnected");
break;
case WL_CONNECTED:
Serial.println("[WiFi] WiFi is connected!");
Serial.print("[WiFi] IP address: ");
Serial.println(WiFi.localIP());
return;
break;
default:
Serial.print("[WiFi] WiFi Status: ");
Serial.println(WiFi.status());
break;
}
delay(tryDelay);
if (numberOfTries <= 0) {
Serial.print("[WiFi] Failed to connect to WiFi!");
WiFi.disconnect();
return;
} else {
numberOfTries--;
}
}
}
void bmpStart() {
unsigned status;
status = bmp.begin(0x76);
if (!status) {
Serial.println(F("Could not find a valid BMP280 sensor, check wiring or "
"try a different address!"));
Serial.print("SensorID was: 0x");
Serial.println(bmp.sensorID(), 16);
Serial.print(" ID of 0xFF probably means a bad address, a BMP 180 or BMP 085\n");
Serial.print(" ID of 0x56-0x58 represents a BMP 280,\n");
Serial.print(" ID of 0x60 represents a BME 280.\n");
Serial.print(" ID of 0x61 represents a BME 680.\n");
Serial.print(" ID of 0x76 Funcionou no Esp 32 wroom 38 pinos.\n");
while (1)
delay(10);
}
bmp.setSampling(Adafruit_BMP280::MODE_NORMAL,
Adafruit_BMP280::SAMPLING_X2,
Adafruit_BMP280::SAMPLING_X16,
Adafruit_BMP280::FILTER_X16,
Adafruit_BMP280::STANDBY_MS_500);
}
int enviar(int inFKsensor, float inValor, int sensorIndex) {
btnState = digitalRead(btnGPIO);
if (btnState == LOW) {
Serial.println("[WiFi] Disconnecting from WiFi!");
if (WiFi.disconnect(true, false)) {
Serial.println("[WiFi] Disconnected from WiFi!");
}
delay(1000);
}
if (WiFi.status() == WL_CONNECTED) {
HTTPClient http;
String data_to_send = "apikey=" + String(apikey) + "&FKhorta=" + String(FKhorta) + "&FKsensor=" + String(inFKsensor) + "&c=" + String(inValor);
//Serial.println(data_to_send);
http.begin("https://horta.gvsoftwares.com.br/api/set_leiturapost/");
http.addHeader("Content-type", "application/x-www-form-urlencoded; charset=utf-8");
int codigo_resposta = http.POST(data_to_send);
if (codigo_resposta > 0) {
Serial.println("Código HTTP -> " + String(codigo_resposta));
if (codigo_resposta == 200) {
String corpo_resposta = http.getString();
Serial.println("O servidor Respondeu:");
Serial.println(corpo_resposta);
sensorLista[sensorIndex].success = 1;
sensorLista[sensorIndex].lastValue = inValor;
return 1;
}
} else {
Serial.println("Erro ao enviar POST:");
Serial.println(codigo_resposta);
sensorLista[sensorIndex].success = 0;
return 0;
}
http.end();
} else {
Serial.println("Erro na conexão WIFI.");
sensorLista[sensorIndex].success = 0;
return 0;
}
}