#include <WiFi.h>
#include <PubSubClient.h>
/* ===== WIFI ===== */
const char* ssid = "Wokwi-GUEST";
const char* password = "";
/* ===== MQTT ===== */
const char* mqtt_server = "broker.hivemq.com";
const int mqtt_port = 1883;
const char* mqtt_topic = "projeto/uniforme/alert";
/* ===== HARDWARE ===== */
const int ledPin = 2; // LED onboard
const int buzzerPin = 15; // buzzer ativo
WiFiClient espClient;
PubSubClient client(espClient);
/* ===== CONTROLE DO ALARME ===== */
unsigned long alarmStart = 0;
bool alarmActive = false;
const unsigned long ALARM_DURATION = 1000; // ms
/* ===== CALLBACK MQTT ===== */
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Mensagem recebida [");
Serial.print(topic);
Serial.print("]: ");
for (unsigned int i = 0; i < length; i++) {
Serial.print((char)payload[i]);
}
Serial.println();
// Ativa alarme
digitalWrite(ledPin, HIGH);
tone(buzzerPin, 2000);
alarmActive = true;
alarmStart = millis();
}
/* ===== CONEXÃO MQTT ===== */
void reconnect() {
while (!client.connected()) {
Serial.print("Conectando ao MQTT...");
String clientId = "ESP32-" + String(random(0xffff), HEX);
if (client.connect(clientId.c_str())) {
Serial.println(" conectado!");
client.subscribe(mqtt_topic);
} else {
Serial.print(" falhou, rc=");
Serial.print(client.state());
Serial.println(" tentando novamente...");
delay(2000);
}
}
}
/* ===== SETUP ===== */
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(buzzerPin, OUTPUT);
Serial.begin(115200);
// Conecta WiFi
Serial.print("Conectando ao WiFi");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi conectado!");
Serial.print("IP: ");
Serial.println(WiFi.localIP());
// Configura MQTT
client.setServer(mqtt_server, mqtt_port);
client.setCallback(callback);
}
/* ===== LOOP ===== */
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
// Desliga alarme sem bloquear
if (alarmActive && millis() - alarmStart >= ALARM_DURATION) {
noTone(buzzerPin);
digitalWrite(ledPin, LOW);
alarmActive = false;
}
}