#include #include #include // Configuração global da rede wi-fi const char* ssid = "***"; const char* password = "***"; int btnGPIO = 0; int btnState = false; /* Pinos GPIO Disponíveis: GPIO 2 GPIO 4 a GPIO 21 GPIO 34 a GPIO 39 (Alguns destes podem ter funções especiais) */ // Configuração global da api const char* FKhorta = "***"; // MODIFICAR ESTA LINHA...... const char* apikey = "***"; // MODIFICAR ESTA LINHA...... // Protótipos das funções int enviar(int inFKsensor, float inValor, int posicaoSensorLista); void compararEnviar(int posicaoSensorLista, float valor, float diferenca); void verifiqueInternetReconecte(int espera); int getchanges(int FKsensor); void conectar(); // 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; // Valor aleatório INDEX 0 sensorLista[0] = {39, 1, valueConsideredNull, 4}; pinMode(sensorLista[0].pin, OUTPUT); // Configura o pino do LED como saída } int lastStatusChange = -1; // Valor inicial, pode ser 0 ou 1 dependendo do seu caso int contadorLoop = 0; // Variável contadora void setup() { configureSensors(); void conectar(); delay(2000); //RESGATAR O STATUS ANTERIOR AO REINICIAR.(ATÉ 15 DIAS) int inicial = getchanges(sensorLista[0].FK); if (inicial == 1){ digitalWrite(sensorLista[0].pin, HIGH); }else{ digitalWrite(sensorLista[0].pin, LOW); } } void loop() { verifiqueInternetReconecte(2000); // Obter o novo valor de statuschange int novoStatusChange = getchanges(sensorLista[0].FK); // Verificar se houve uma mudança no valor if (novoStatusChange != lastStatusChange) { // Atualizar o último valor lastStatusChange = novoStatusChange; // Tomar ação com base no novo valor if (lastStatusChange == 0) { // Desligar o LED Serial.println("Desligado....."); digitalWrite(sensorLista[0].pin, LOW); compararEnviar(0, lastStatusChange, 0); } else if (lastStatusChange == 1) { // Ligar o LED Serial.println("Ligado....."); digitalWrite(sensorLista[0].pin, HIGH); compararEnviar(0, lastStatusChange, 0); } } // A cada 60 iterações do loop enviar status. contadorLoop++; if (contadorLoop >= 60) { compararEnviar(0, lastStatusChange, 0); contadorLoop = 0; // Reinicia o contador } 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--; } } } int getchanges(int FKsensor) { // Faça a requisição HTTP HTTPClient http; // Informe a URL desejada String url = "https://horta.gvsoftwares.com.br/api/get_sensoresstatuschange/?FKsensor=" + String(FKsensor); http.begin(url); // Obtenha e imprima o código de status da resposta int httpCode = http.GET(); Serial.print("Código de Status HTTP: "); Serial.println(httpCode); // Inicialize a variável de retorno int statusChange = -1; // Defina um valor padrão // Se a resposta for bem-sucedida, analise o JSON if (httpCode > 0) { String payload = http.getString(); Serial.println("Resposta do servidor: "); Serial.println(payload); // Tamanho suficiente para armazenar o JSON const size_t capacity = JSON_ARRAY_SIZE(1) + JSON_OBJECT_SIZE(1) + 10; // Aloque o JSONBuffer DynamicJsonDocument doc(capacity); // Deserializar a string JSON DeserializationError error = deserializeJson(doc, payload); // Verificar erros de desserialização if (error) { Serial.print(F("Erro ao desserializar JSON: ")); Serial.println(error.c_str()); } else { // Obter o valor da chave "statuschange" statusChange = doc[0]["statuschange"]; } } http.end(); return statusChange; // Retorna o valor, mesmo que seja o padrão -1 em caso de erro } /* * 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; } }