//versão 1.0.0 #include #include #include #include #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; } }