/////////--------IOT--------FIAP------------///////////
#include <WiFi.h>
#include <ArduinoJson.h>
#include <DHTesp.h>
#include <PubSubClient.h>
const char *SSID = "Wokwi-GUEST";
const char *PASSWORD = "";
const char *BROKER_MQTT = "broker.hivemq.com";
const int BROKER_PORT = 1883;
const char *ID_MQTT = "rgfrnoqwrivuo";
const char *TOPIC_SUB_LED = "fiap/iot/led";
const char *TOPIC_PUB_TH = "fiap/iot/temphumi";
#define PIN_DHT 12
#define PIN_LED 15
#define PUBLISH_DELAY 2000
WiFiClient espClient;
PubSubClient MQTT(espClient);
DHTesp dht;
unsigned long publishUpdate = 0;
TempAndHumidity sensorValues;
void initWiFi() {
Serial.printf("Conectando com a rede: %s\n", SSID);
WiFi.begin(SSID, PASSWORD);
while (WiFi.status() != WL_CONNECTED) delay(100);
Serial.printf("Conectado com sucesso: %s\nIP: %s\n", SSID, WiFi.localIP().toString().c_str());
}
void initMQTT() {
MQTT.setServer(BROKER_MQTT, BROKER_PORT);
MQTT.setCallback([](char *t, byte *p, unsigned int l) {
String msg = String((char*)p).substring(0, l);
Serial.printf("Mensagem recebida via MQTT: %s do tópico: %s\n", msg.c_str(), t);
if (!strcmp(t, TOPIC_SUB_LED)) {
digitalWrite(PIN_LED, atoi(msg.c_str()) == 1 ? HIGH : LOW);
Serial.println(atoi(msg.c_str()) == 1 ? "LED ligado via MQTT" : "LED desligado via MQTT");
}
});
}
void reconnectMQTT() {
while (!MQTT.connected()) {
Serial.printf("Tentando conectar com o Broker MQTT: %s\n", BROKER_MQTT);
if (MQTT.connect(ID_MQTT)) {
Serial.println("Conectado ao broker MQTT!");
MQTT.subscribe(TOPIC_SUB_LED);
} else delay(2000);
}
}
void setup() {
Serial.begin(115200);
pinMode(PIN_LED, OUTPUT);
digitalWrite(PIN_LED, LOW);
dht.setup(PIN_DHT, DHTesp::DHT22);
initWiFi();
initMQTT();
}
void loop() {
if (WiFi.status() != WL_CONNECTED) initWiFi();
if (!MQTT.connected()) reconnectMQTT();
MQTT.loop();
if ((millis() - publishUpdate) >= PUBLISH_DELAY) {
publishUpdate = millis();
sensorValues = dht.getTempAndHumidity();
if (!isnan(sensorValues.temperature) && !isnan(sensorValues.humidity)) {
StaticJsonDocument<200> doc;
doc["temperatura"] = sensorValues.temperature;
doc["umidade"] = sensorValues.humidity;
char buffer[200];
serializeJson(doc, buffer);
MQTT.publish(TOPIC_PUB_TH, buffer);
Serial.println(buffer);
}
}
}