/*Resitores LED
LED VERDE = U=2V ,I=2mA -> I=0,002A
R = U/I -> R = (3,3-2) / 0,002 -> R=650
LED VERMELHO = U=3,I=2mA -> I = 0.002A
R = U/I -> R = (3,3-3) / 0,002 -> R = 150
*/
#include <WiFi.h>
#include <PubSubClient.h>
#include <ESP32Servo.h>
// -------- WIFI --------
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// -------- MQTT --------
const char* mqtt_server = "broker.hivemq.com";
WiFiClient espClient;
PubSubClient client(espClient);
// -------- PINOS --------
#define TRIG 17
#define ECHO 16
#define LED_VERDE 12
#define LED_VERMELHO 14
#define SERVO_PIN 27
Servo servo;
// -------- CONTROLE --------
String estadoAtual = "";
// -------- WIFI --------
void setup_wifi() {
Serial.println("Conectando ao WiFi...");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi conectado!");
}
// -------- MQTT --------
void reconnect() {
while (!client.connected()) {
Serial.println("Conectando ao MQTT...");
if (client.connect("ESP32_SILO_CP1")) {
Serial.println("Conectado!");
} else {
Serial.print("Erro: ");
Serial.println(client.state());
delay(2000);
}
}
}
// -------- SENSOR --------
long medirDistancia() {
digitalWrite(TRIG, LOW);
delayMicroseconds(2);
digitalWrite(TRIG, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG, LOW);
long duracao = pulseIn(ECHO, HIGH);
long distancia = duracao * 0.034 / 2;
return distancia;
}
// -------- MQTT INTELIGENTE --------
void atualizarEstado(String novoEstado) {
if (novoEstado != estadoAtual) {
estadoAtual = novoEstado;
client.publish("cp1/silo/status", estadoAtual.c_str());
Serial.print("MQTT enviado: ");
Serial.println(estadoAtual);
}
}
// -------- SETUP --------
void setup() {
Serial.begin(115200);
pinMode(TRIG, OUTPUT);
pinMode(ECHO, INPUT);
pinMode(LED_VERDE, OUTPUT);
pinMode(LED_VERMELHO, OUTPUT);
servo.attach(SERVO_PIN);
setup_wifi();
client.setServer(mqtt_server, 1883);
}
// -------- LOOP --------
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
long distancia = medirDistancia();
Serial.print("Distancia: ");
Serial.println(distancia);
// -------- LÓGICA DO SILO --------
if (distancia < 10) {
// SILO CHEIO
servo.write(0); // FECHADO
digitalWrite(LED_VERDE, HIGH);
digitalWrite(LED_VERMELHO, LOW);
atualizarEstado("Silo abastecido");
}
else if (distancia > 30) {
// SILO VAZIO
servo.write(180); // ABERTO
digitalWrite(LED_VERDE, LOW);
digitalWrite(LED_VERMELHO, HIGH);
atualizarEstado("Silo vazio");
}
else {
// EM CONSUMO
digitalWrite(LED_VERDE, LOW);
digitalWrite(LED_VERMELHO, HIGH);
atualizarEstado("Silo em consumo");
}
delay(1500);
}