#include <WiFi.h>
#include <PubSubClient.h>
#include "DHT.h"
// ===== CONFIG =====
const char* ssid = "Wokwi-GUEST";
const char* password = "";
const char* mqtt_server = "test.mosquitto.org"; // Broker público
const uint16_t mqtt_port = 1883;
// TÓPICOS MQTT (iguais no Node-RED!)
const char* TOPIC_TEMP = "projeto/sensor/temperature";
const char* TOPIC_HUM = "projeto/sensor/humidity";
const char* TOPIC_LED_SET = "projeto/led/set";
#define DHTPIN 4 // Pino DHT22 no Wokwi
#define DHTTYPE DHT22
#define LED_PIN 2 // Pino LED no Wokwi
DHT dht(DHTPIN, DHTTYPE);
WiFiClient espClient;
PubSubClient client(espClient);
unsigned long lastPublishMillis = 0;
const unsigned long publishInterval = 3000; // 3s
void callback(char* topic, byte* payload, unsigned int length) {
String msg;
for (unsigned int i = 0; i < length; i++) msg += (char)payload[i];
msg.trim();
Serial.print("[MQTT] ");
Serial.print(topic);
Serial.print(" -> ");
Serial.println(msg);
if (String(topic) == TOPIC_LED_SET) {
if (msg.equalsIgnoreCase("ON") || msg.equalsIgnoreCase("1")) {
digitalWrite(LED_PIN, HIGH);
Serial.println("🔴 LED LIGADO");
} else if (msg.equalsIgnoreCase("OFF") || msg.equalsIgnoreCase("0")) {
digitalWrite(LED_PIN, LOW);
Serial.println("⚪ LED DESLIGADO");
}
}
}
void connectWiFi() {
Serial.print("📶 WiFi ");
Serial.print(ssid);
WiFi.begin(ssid, password);
int tries = 0;
while (WiFi.status() != WL_CONNECTED && tries < 40) {
delay(250);
Serial.print(".");
tries++;
}
Serial.println();
if (WiFi.status() == WL_CONNECTED) {
Serial.print("✅ WiFi OK, IP: ");
Serial.println(WiFi.localIP());
}
}
void reconnectMQTT() {
while (!client.connected()) {
Serial.print("🔗 MQTT...");
String clientId = "Wokwi-Projeto-";
clientId += String(random(0xffff), HEX);
if (client.connect(clientId.c_str())) {
Serial.println("✅ conectado");
client.subscribe(TOPIC_LED_SET);
Serial.print("📡 Subscribed: ");
Serial.println(TOPIC_LED_SET);
} else {
Serial.print("❌ rc=");
Serial.print(client.state());
Serial.println(" (2s)");
delay(2000);
}
}
}
void setup() {
Serial.begin(115200);
pinMode(LED_PIN, OUTPUT);
digitalWrite(LED_PIN, LOW);
dht.begin();
connectWiFi();
client.setServer(mqtt_server, mqtt_port);
client.setCallback(callback);
randomSeed(analogRead(0));
Serial.println("🚀 Projeto iniciado!");
}
void publishSensors() {
float t = dht.readTemperature();
float h = dht.readHumidity();
if (isnan(t) || isnan(h)) {
Serial.println("❌ DHT falhou");
return;
}
char buf[32];
snprintf(buf, sizeof(buf), "%.1f", t);
client.publish(TOPIC_TEMP, buf, true);
snprintf(buf, sizeof(buf), "%.1f", h);
client.publish(TOPIC_HUM, buf, true);
Serial.print("📤 Temp=");
Serial.print(t);
Serial.print("°C Hum=");
Serial.print(h);
Serial.println("%");
}
void loop() {
if (WiFi.status() != WL_CONNECTED) connectWiFi();
if (!client.connected()) reconnectMQTT();
client.loop();
unsigned long now = millis();
if (now - lastPublishMillis >= publishInterval) {
lastPublishMillis = now;
publishSensors();
}
}