#include <WiFi.h>
#include <PubSubClient.h>
#include "DHT.h"
/* ======= WIFI (WOKWI) ======= */
const char* ssid = "Wokwi-GUEST";
const char* password = "";
/* ======= MQTT (HIVEMQ – NUVEM) ======= */
const char* mqtt_server = "broker.hivemq.com";
const int mqtt_port = 1883;
const char* mqtt_topic = "sala/status";
/* ======= PINOS ======= */
#define DHTPIN 15
#define DHTTYPE DHT22
#define PIR_PIN 4
#define BUZZER_PIN 18
DHT dht(DHTPIN, DHTTYPE);
WiFiClient espClient;
PubSubClient client(espClient);
/* ======= CONTROLE DE TEMPO ======= */
unsigned long lastMotionTime = 0;
const unsigned long noMotionDelay = 15000; // 15 segundos
bool salaVaziaEnviada = false;
/* ======= CONEXÃO WIFI ======= */
void setup_wifi() {
delay(10);
Serial.print("Conectando ao WiFi (Wokwi)");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi conectado");
Serial.print("IP: ");
Serial.println(WiFi.localIP());
}
/* ======= CONEXÃO MQTT ======= */
void reconnect_mqtt() {
while (!client.connected()) {
Serial.print("Conectando ao broker MQTT...");
if (client.connect("ESP32-Wokwi-Sala")) {
Serial.println("Conectado ao HiveMQ");
} else {
Serial.print("Falha, rc=");
Serial.print(client.state());
Serial.println(" tentando novamente em 3s");
delay(3000);
}
}
}
void setup() {
Serial.begin(115200);
pinMode(PIR_PIN, INPUT);
pinMode(BUZZER_PIN, OUTPUT);
digitalWrite(BUZZER_PIN, LOW);
dht.begin();
setup_wifi();
client.setServer(mqtt_server, mqtt_port);
lastMotionTime = millis();
}
void loop() {
if (!client.connected()) {
reconnect_mqtt();
}
client.loop();
int motionDetected = digitalRead(PIR_PIN);
if (motionDetected == HIGH) {
Serial.println("Movimento detectado!");
lastMotionTime = millis();
digitalWrite(BUZZER_PIN, LOW);
salaVaziaEnviada = false;
client.publish("sala/movimento", "Movimento detectado");
}
if ((millis() - lastMotionTime > noMotionDelay) && !salaVaziaEnviada) {
digitalWrite(BUZZER_PIN, HIGH);
Serial.println("Sala Vazia");
client.publish("sala/status", "Sala Vazia");
salaVaziaEnviada = true;
}
float humidity = dht.readHumidity();
float temperature = dht.readTemperature();
if (!isnan(humidity) && !isnan(temperature)) {
char payload[64];
snprintf(payload, sizeof(payload),
"Temp: %.1f C | Umidade: %.1f %%", temperature, humidity);
Serial.println(payload);
client.publish("sala/clima", payload);
} else {
Serial.println("Erro ao ler DHT22");
}
delay(2000);
}