#include <WiFi.h>
#include <HTTPClient.h>
#include <ArduinoJson.h>
// --- Configurações de Tempo Otimizadas ---
const unsigned long intervaloComunicacao = 400;
const unsigned long intervaloSimulacao = 500;
// --- Configurações WiFi ---
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// --- Pinos do Projeto ---
const int fluxoPin = 26;
const int bombaPin = 25;
const int ledFluxoPin = 33;
const int ledRegistroPin = 32;
// --- Níveis para Simulação ---
const int nivelMaximo = 4;
int nivelAtual = 2;
// --- Variáveis de Controle ---
volatile unsigned int pulsosFluxo = 0;
bool bombaLigada = false;
bool registroAberto = false;
bool manutencaoAtiva = false;
// --- Variáveis de Tempo ---
unsigned long tempoAnteriorComunicacao = 0;
unsigned long tempoAnteriorSimulacao = 0;
// --- URL DA API ---
// MUDANÇA IMPORTANTE: Agora só precisamos de uma URL para sincronizar.
const char* apiUrlSync = "https://4729f3c9-ba25-4482-b1df-8b6c892d63c4-00-2m7uq6359lv1d.kirk.replit.dev/sync";
void IRAM_ATTR contaPulsos() {
if (registroAberto) {
pulsosFluxo++;
}
}
void setup() {
Serial.begin(115200);
pinMode(fluxoPin, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(fluxoPin), contaPulsos, FALLING);
pinMode(bombaPin, OUTPUT);
pinMode(ledFluxoPin, OUTPUT);
pinMode(ledRegistroPin, OUTPUT);
digitalWrite(bombaPin, LOW);
digitalWrite(ledFluxoPin, LOW);
digitalWrite(ledRegistroPin, LOW);
conectarWiFi();
}
void loop() {
unsigned long agora = millis();
if (agora - tempoAnteriorComunicacao > intervaloComunicacao) {
tempoAnteriorComunicacao = agora;
if(WiFi.status() == WL_CONNECTED) {
comunicarComAPI();
} else {
Serial.println("!!! WiFi desconectado. Tentando reconectar...");
WiFi.reconnect();
}
}
if (agora - tempoAnteriorSimulacao > intervaloSimulacao) {
tempoAnteriorSimulacao = agora;
simularNivelEAtualizarPinos();
}
}
void conectarWiFi() {
Serial.print("Conectando ao WiFi...");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi conectado! Sistema pronto.");
}
void comunicarComAPI() {
HTTPClient http;
// MUDANÇA IMPORTANTE: Uma única chamada para a rota /sync
String url = String(apiUrlSync) + "?nivel=" + String(nivelAtual) + "&fluxo=" + String(pulsosFluxo);
Serial.printf("-> Sincronizando: Nivel=%d, Fluxo=%d\n", nivelAtual, pulsosFluxo);
http.begin(url);
int httpCode = http.GET();
if (httpCode == HTTP_CODE_OK) {
String payload = http.getString();
StaticJsonDocument<256> doc;
DeserializationError error = deserializeJson(doc, payload);
if (!error) {
bool ordem_bomba = (doc["bomba"] == 1);
bool ordem_registro = (doc["registro"] == 1);
bool ordem_manutencao = (doc["manutencao"] == 1);
Serial.printf("<- Ordens Recebidas: Bomba=%s, Registro=%s, Manutencao=%s\n",
(ordem_bomba ? "ON" : "OFF"),
(ordem_registro ? "ON" : "OFF"),
(ordem_manutencao ? "ON" : "OFF"));
if (registroAberto && !ordem_registro) {
pulsosFluxo = 0;
}
registroAberto = ordem_registro;
bombaLigada = ordem_bomba;
manutencaoAtiva = ordem_manutencao;
} else {
Serial.println("!!! Erro ao decodificar JSON da API.");
}
} else {
Serial.printf("!!! Falha na sincronização, HTTP: %d\n", httpCode);
}
http.end();
}
void simularNivelEAtualizarPinos() {
if (bombaLigada && nivelAtual < nivelMaximo) {
nivelAtual++;
} else if (!bombaLigada && nivelAtual > 0) {
nivelAtual--;
}
digitalWrite(bombaPin, bombaLigada);
digitalWrite(ledRegistroPin, registroAberto);
digitalWrite(ledFluxoPin, (registroAberto && pulsosFluxo > 0));
}