#include <WiFi.h>
#include <HTTPClient.h>
#include <ArduinoJson.h>
// 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;
}
}