#include <WiFi.h>
#include <PubSubClient.h>
#include <DHT.h>
// --- WIFI E MQTT ---
const char* ssid = "Wokwi-GUEST";
const char* password = "";
const char* mqtt_server = "test.mosquitto.org";
const char* topico_envio = "fiap/smartwork/dados";
const char* topico_recebe = "fiap/smartwork/alerta";
WiFiClient espClient;
PubSubClient client(espClient);
// --- PINOS ---
#define PIN_DHT 15
#define TIPO_DHT DHT22
DHT dht(PIN_DHT, TIPO_DHT);
const int PIN_LDR = 34;
const int PIN_TRIG = 5;
const int PIN_ECHO = 18;
const int PIN_BUZZER = 26;
const int LED_R = 13;
const int LED_G = 12;
const int LED_B = 14;
// --- VARIÁVEIS ---
long duracao;
int distancia;
unsigned long ultimoEnvio = 0;
char msg_buffer[200];
void setup_wifi() {
delay(10);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) { delay(500); }
}
void callback(char* topic, byte* payload, unsigned int length) {
String mensagem = "";
for (int i = 0; i < length; i++) { mensagem += (char)payload[i]; }
mensagem.trim();
if (String(topic) == topico_recebe) {
if (mensagem == "ALERTA_ON") {
digitalWrite(LED_R, HIGH);
digitalWrite(LED_G, LOW);
tone(PIN_BUZZER, 1000);
} else if (mensagem == "ALERTA_OFF") {
digitalWrite(LED_R, LOW);
digitalWrite(LED_G, HIGH);
noTone(PIN_BUZZER);
}
}
}
void reconnect() {
while (!client.connected()) {
String clientId = "ESP32-" + String(random(0xffff), HEX);
if (client.connect(clientId.c_str())) {
client.subscribe(topico_recebe);
} else { delay(5000); }
}
}
void setup() {
Serial.begin(115200);
pinMode(PIN_LDR, INPUT);
pinMode(PIN_TRIG, OUTPUT);
pinMode(PIN_ECHO, INPUT);
pinMode(PIN_BUZZER, OUTPUT);
pinMode(LED_R, OUTPUT);
pinMode(LED_G, OUTPUT);
pinMode(LED_B, OUTPUT);
digitalWrite(LED_G, HIGH);
digitalWrite(LED_R, LOW);
noTone(PIN_BUZZER);
dht.begin();
setup_wifi();
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
}
void loop() {
if (!client.connected()) { reconnect(); }
client.loop();
unsigned long agora = millis();
if (agora - ultimoEnvio > 2000) {
ultimoEnvio = agora;
float h = dht.readHumidity();
float t = dht.readTemperature();
int ldr = analogRead(PIN_LDR);
int luz = map(ldr, 0, 4095, 0, 100);
digitalWrite(PIN_TRIG, LOW); delayMicroseconds(2);
digitalWrite(PIN_TRIG, HIGH); delayMicroseconds(10);
digitalWrite(PIN_TRIG, LOW);
duracao = pulseIn(PIN_ECHO, HIGH);
distancia = duracao * 0.034 / 2;
if (isnan(h) || isnan(t)) return;
snprintf(msg_buffer, 200, "{\"temp\":%.2f, \"umidade\":%.2f, \"luz\":%d, \"distancia\":%d}", t, h, luz, distancia);
client.publish(topico_envio, msg_buffer);
}
}