#include <WiFi.h>
#include <PubSubClient.h>
// --- Configurações da rede Wi-Fi ---
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// --- Configurações do broker MQTT ---
const char* mqtt_server = "test.mosquitto.org";
const char* topic_publish = "aq_pedro_poha/nivel";
WiFiClient espClient;
PubSubClient client(espClient);
// --- Pinos do Sensor Ultrassônico ---
const int trigPin = 5;
const int echoPin = 18;
// --- Pinos dos LEDs indicadores ---
const int LED_BAIXO = 23;
const int LED_MEDIO = 22;
const int LED_ALTO = 21;
const int LED_ERRO = 19;
// --- Variáveis globais ---
String nivelAtual = "";
unsigned long ultimoEnvio = 0;
void setup_wifi() {
delay(10);
Serial.println();
Serial.print("Conectando ao WiFi: ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi conectado");
Serial.println("Endereço IP: ");
Serial.println(WiFi.localIP());
}
void setup() {
Serial.begin(115200);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(LED_BAIXO, OUTPUT);
pinMode(LED_MEDIO, OUTPUT);
pinMode(LED_ALTO, OUTPUT);
pinMode(LED_ERRO, OUTPUT);
setup_wifi();
client.setServer(mqtt_server, 1883);
// Envia mensagem de teste
reconnect();
client.publish(topic_publish, "ESP32 iniciado com sucesso!");
Serial.println("Mensagem de teste publicada.");
}
void reconnect() {
while (!client.connected()) {
Serial.print("Tentando conexão MQTT...");
if (client.connect("ESP32Client_12345")) {
Serial.println("conectado");
} else {
Serial.print("falhou, rc=");
Serial.print(client.state());
Serial.println(" tentando novamente em 5 segundos");
delay(5000);
}
}
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
unsigned long agora = millis();
if (agora - ultimoEnvio >= 2000) {
ultimoEnvio = agora;
float distancia = medirDistancia();
Serial.print("Distância medida: ");
Serial.println(distancia);
String nivel = verificarNivel(distancia);
Serial.print("Nivel: ");
Serial.print(nivel);
Serial.print(" ");
Serial.print (" nivelAtual: ");
Serial.println(nivelAtual);
//if (nivel != nivelAtual) {
//nivelAtual = nivel;
// Cria a string de nível no formato similar ao tempString
char nivelString[8];
dtostrf(distancia, 1, 2, nivelString); // Converte a distância para string com 2 casas decimais
// Publica tanto o nível quanto a distância
client.publish(topic_publish, nivelAtual.c_str()); // Publica "ALTO", "MEDIO", etc.
client.publish("aq_pedro_poha/distancia", nivelString); // Publica o valor numérico
Serial.print("Publicado - Nível: ");
Serial.print(nivelAtual);
Serial.print(", Distância: ");
Serial.println(nivelString);
// Aciona os LEDs conforme o nível
acionarLEDs(nivelAtual);
//}
}
}
void acionarLEDs(String nivel) {
// Desliga todos os LEDs primeiro
digitalWrite(LED_BAIXO, LOW);
digitalWrite(LED_MEDIO, LOW);
digitalWrite(LED_ALTO, LOW);
digitalWrite(LED_ERRO, LOW);
// Aciona o LED correspondente
if (nivel == "BAIXO") {
digitalWrite(LED_BAIXO, HIGH);
} else if (nivel == "MEDIO") {
digitalWrite(LED_MEDIO, HIGH);
} else if (nivel == "ALTO") {
digitalWrite(LED_ALTO, HIGH);
} else if (nivel == "FORA") {
digitalWrite(LED_ERRO, HIGH);
}
}
float medirDistancia() {
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
long duracao = pulseIn(echoPin, HIGH, 30000);
if (duracao == 0) return -1;
return duracao * 0.034 / 2;
}
String verificarNivel(float distancia) {
if (distancia < 0 || distancia > 100) {
return "FORA";
}
if (distancia <= 17.0) {
return "BAIXO";
}
else if (distancia <= 30.0) {
return "MEDIO";
}
else if (distancia <= 43.0) {
return "ALTO";
}
return "FORA";
}