#include <ArduinoJson.h>
#include <WiFi.h>
#include <PubSubClient.h>
#include "DHTesp.h"
// ------------------- Configurações de WiFi -------------------
const char *SSID = "Wokwi-GUEST";
const char *PASSWORD = "";
// ------------------- Configurações de MQTT -------------------
const char *BROKER_MQTT = "broker.hivemq.com";
const int BROKER_PORT = 8884; // Porta sem TLS
const char *ID_MQTT = "esp32_mqtt";
const char *TOPIC_PUBLISH = "Fiap/iot/3ESOA/plugify/DHT22";
const char *TOPIC_SUBSCRIBE = "Fiap/iot/3ESOA/plugify/DHT22";
// ------------------- Configuração do Sensor -------------------
#define PIN_DHT 12
#define PIN_LED 15
#define PUBLISH_DELAY 2000
WiFiClient espClient; // <-- cliente simples, sem TLS
PubSubClient MQTT(espClient);
DHTesp dht;
unsigned long publishUpdate = 0;
TempAndHumidity sensorValues;
const int TAMANHO = 200;
// ------------------- Funções -------------------
void updateSensorValues() {
sensorValues = dht.getTempAndHumidity();
}
void initWifi() {
Serial.print("Conectando com a Rede: ");
Serial.println(SSID);
WiFi.begin(SSID, PASSWORD);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi conectado!");
Serial.print("IP: ");
Serial.println(WiFi.localIP());
}
void initMQTT() {
MQTT.setServer(BROKER_MQTT, BROKER_PORT);
MQTT.setCallback(callbackMQTT);
}
void callbackMQTT(char *topic, byte *payload, unsigned int length) {
String msg;
for (int i = 0; i < length; i++) {
msg += (char)payload[i];
}
StaticJsonDocument<TAMANHO> json;
DeserializationError error = deserializeJson(json, msg);
if (error) {
Serial.println("Falha na deserialização do JSON");
return;
}
if (json.containsKey("led")) {
int valor = json["led"];
if (valor == 1) {
digitalWrite(PIN_LED, HIGH);
Serial.println("LED Ligado via comando MQTT");
} else if (valor == 0) {
digitalWrite(PIN_LED, LOW);
Serial.println("LED Desligado via comando MQTT");
}
}
}
void reconnectMQTT() {
while (!MQTT.connected()) {
Serial.print("Tentando conectar com o Broker MQTT: ");
Serial.println(BROKER_MQTT);
// Sem usuário/senha, só ID
if (MQTT.connect(ID_MQTT)) {
Serial.println("Conectado ao broker MQTT público!");
MQTT.subscribe(TOPIC_SUBSCRIBE);
} else {
Serial.print("Falha, rc=");
Serial.print(MQTT.state());
Serial.println(" tentando novamente em 5s");
delay(5000);
}
}
}
void checkWifiAndMQTT() {
if (WiFi.status() != WL_CONNECTED) {
initWifi();
}
if (!MQTT.connected()) {
reconnectMQTT();
}
}
void setup() {
Serial.begin(115200);
pinMode(PIN_LED, OUTPUT);
dht.setup(PIN_DHT, DHTesp::DHT22);
initWifi();
initMQTT();
}
void loop() {
checkWifiAndMQTT();
MQTT.loop();
if ((millis() - publishUpdate) >= PUBLISH_DELAY) {
publishUpdate = millis();
updateSensorValues();
if (isnan(sensorValues.temperature) || isnan(sensorValues.humidity)) {
Serial.println("Falha ao ler o DHT22");
return; // <- poderia ser continue ou apenas ignorar
}
StaticJsonDocument<TAMANHO> json;
json["umidade"] = sensorValues.humidity;
json["temperatura"] = sensorValues.temperature;
char payload[200];
size_t n = serializeJson(json, payload, sizeof(payload));
payload[n] = '\0';
Serial.print("JSON gerado: ");
Serial.println(payload);
if (MQTT.publish(TOPIC_PUBLISH, payload)) {
Serial.println("Mensagem enviada via MQTT:");
Serial.println(payload);
} else {
Serial.println("Falha ao enviar MQTT");
}
}
}