#include <WiFi.h>
#include <WiFiClientSecure.h>
#include <PubSubClient.h>
#include <ArduinoJson.h>
#include <DHT.h>
// ===== CONFIGURACIÓN WI-FI (WOKWI) =====
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// ===== CONFIGURACIÓN HIVEMQ CLOUD =====
const char* mqtt_server = "jsiodjwaquikjdwdwbdwbddwaghjasilhjhvdaw"; // Coloca tu Host de HiveMQ Cloud
const int mqtt_port = 8883; // Puerto TLS seguro
const char* mqtt_user = "gfvdhwaudh"; // Coloca tu usuario
const char* mqtt_password = "Edhwiuddhyw"; // Coloca tu contraseña
// ===== CONFIGURACIÓN DE TÓPICOS =====
const char* device_id = "uees-esp32-Lucas";
const char* topic_telemetry = "uees/iot/Lucas/telemetry";
const char* topic_status = "uees/iot/Lucas/status";
#define DHTPIN 4
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
WiFiClientSecure espClient;
PubSubClient client(espClient);
unsigned long lastMsg = 0;
void setup_wifi() {
delay(10);
Serial.print("Conectando a Wi-Fi: ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\n[Wi-Fi] Conectado");
Serial.print("[Wi-Fi] IP: ");
Serial.println(WiFi.localIP());
Serial.print("[Wi-Fi] RSSI: ");
Serial.print(WiFi.RSSI());
Serial.println(" dBm");
}
void reconnect() {
while (!client.connected()) {
Serial.print("[MQTT] Conectando a HiveMQ Cloud...");
String clientId = String(device_id) + "-" + String(random(0xffff), HEX);
if (client.connect(clientId.c_str(), mqtt_user, mqtt_password)) {
Serial.println("\n[MQTT] Conectado");
StaticJsonDocument<128> docStatus;
docStatus["device_id"] = device_id;
docStatus["status"] = "online";
char statusBuffer[128];
serializeJson(docStatus, statusBuffer);
client.publish(topic_status, statusBuffer, true);
} else {
Serial.print("\n[MQTT] Error rc=");
Serial.print(client.state());
Serial.println(" - Reintentando en 5s...");
delay(5000);
}
}
}
void setup() {
Serial.begin(115200);
dht.begin();
setup_wifi();
espClient.setInsecure(); // Permite la conexión TLS en Wokwi omitiendo la verificación de certificado raíz
client.setServer(mqtt_server, mqtt_port);
}
void loop() {
if (WiFi.status() != WL_CONNECTED) {
setup_wifi();
}
if (!client.connected()) {
reconnect();
}
client.loop();
unsigned long now = millis();
if (now - lastMsg > 5000) {
lastMsg = now;
float temperature = dht.readTemperature();
float humidity = dht.readHumidity();
if (isnan(temperature) || isnan(humidity)) {
Serial.println("[ERROR] Lectura del sensor DHT22 fallida");
return;
}
Serial.println("----------------------------------------");
Serial.print("Temperatura: "); Serial.print(temperature); Serial.println(" °C");
Serial.print("Humedad: "); Serial.print(humidity); Serial.println(" %");
StaticJsonDocument<256> doc;
doc["device_id"] = device_id;
doc["temperature_c"] = serialized(String(temperature, 1));
doc["humidity_percent"] = serialized(String(humidity, 1));
doc["status"] = "online";
char jsonBuffer[256];
serializeJson(doc, jsonBuffer);
Serial.print("[MQTT] Publicando en ");
Serial.print(topic_telemetry);
Serial.print(": ");
Serial.println(jsonBuffer);
if (client.publish(topic_telemetry, jsonBuffer)) {
Serial.println("[MQTT] Publicado con éxito");
} else {
Serial.println("[ERROR] Falló la publicación");
}
}
}