#include #include #include #include // Configuração global da rede wi-fi const char* ssid = "************"; // MODIFICAR ESTA LINHA...... const char* password = "**********"; // MODIFICAR ESTA LINHA...... int btnGPIO = 0; int btnState = false; // Configuração global da api const char* FKhorta = "1"; // MODIFICAR ESTA LINHA...... const char* apikey = "****************************************************"; // MODIFICAR ESTA LINHA...... /* CONFIGURARÇÕES GLOBAIS DE SENSORES. */ Adafruit_BMP280 bmp; // I2C do BMP280. // 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(); void bmpStart(); // Estrutura para informações de sensores struct SensorInfo { int FK; int success; float lastValue; int pin; }; const int totalSensores = 2; // possui 'totalSensores+1' posições começando do índice zero. SensorInfo sensorLista[totalSensores]; void configureSensors() { // Configurar sensores aqui float valueConsideredNull = -10000; // Sensor de temperatura BMP sensorLista[0] = {27, 1, valueConsideredNull, -1}; // -1 indica que não usa pino específico // Sensor de pressão BMP sensorLista[1] = {28, 1, valueConsideredNull, -1}; } void setup() { conectar(); configureSensors(); bmpStart(); } void loop() { verifiqueInternetReconecte(2000); float readTempC = bmp.readTemperature(); // ler temperatura em Graus Celsius. compararEnviar(0, readTempC, 0.1); float readPressaoHPA = bmp.readPressure() / 100; /* pressão menor ar úmido forçado para cima unidade: hPa */; compararEnviar(1, readPressaoHPA, 0.05); delay(1000); } // Se não tiver Internet reestabelecer conexão após 2 segundos. 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(); } } /* Envia dados do sensor para um determinado ID */ 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)); } } /* * Conecta ao wi-fi */ void conectar() { Serial.begin(9600); delay(100); 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--; } } } /* Sensor BMP 280 que possui pressão, temperatura e altitude. Ligar BMP 280 na GPIO 22 (slc) e 21 (sda) */ 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); } /* * Enviar os dados para a api. */ 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; } }