#include <WiFi.h>
#include <PubSubClient.h>
#include <ESP32Servo.h>
#define MQTTSERVER "test.mosquitto.org" // Servidor MQTT
#define PORT 1883 // Porta do servidor MQTT
Servo servo;
WiFiClient espClient;
PubSubClient client(espClient);
const int servoPin = 18;
const int relePin = 12;
int leituraTDS = 0; // Variável que receberá o valor via MQTT
String valveStatus = "aberta"; // Estado inicial da válvula
boolean deactivation = false; // Estado inicial da válvula
void setup() {
Serial.begin(9600);
pinMode(relePin, OUTPUT);
digitalWrite(relePin, LOW);
servo.attach(servoPin, 500, 2400);
WiFi.begin("Wokwi-GUEST", "", 6);
while (WiFi.status() != WL_CONNECTED) {
delay(100);
}
client.setServer(MQTTSERVER, PORT);
client.setCallback(callback);
establishConnection();
client.subscribe("sensor/distance");
client.subscribe("valve/controller");
Serial.println("Receptor iniciado.");
}
void loop() {
if (!client.connected()) {
establishConnection();
}
client.loop();
client.publish("valve/status", valveStatus.c_str());
if (leituraTDS > 50 && deactivation == false) {
Serial.println("Válvula aberta");
valveStatus = "aberta";
servo.write(-180);
delay(1000);
} else {
Serial.println("Válvula fechada");
servo.write(90);
valveStatus = "fechada";
delay(1000);
}
}
void callback(char* topic, byte* message, unsigned int length) {
String stMessage;
for (int i = 0; i < length; i++) {
stMessage += (char)message[i];
}
Serial.println("Mensagem: " + stMessage);
// Verifica o tópico e executa a lógica correspondente
if (String(topic) == "sensor/distance") {
leituraTDS = stMessage.toInt();
} else if (String(topic) == "valve/controller") {
if (stMessage == "abrir") {
deactivation = false; // Atualiza o status
Serial.println("Válvula aberta pelo comando.");
} else if (stMessage == "fechar") {
digitalWrite(relePin, LOW); // Desliga o rele
deactivation = true; // Atualiza o status
Serial.println("Válvula fechada pelo comando.");
}
}
}
void establishConnection() {
while (!client.connected()) {
if (client.connect("ESP32_Mediator")) {
Serial.println("Conectado ao broker MQTT");
client.subscribe("sensor/distance");
client.subscribe("valve/controller");
} else {
delay(2000);
}
}
}