#include <WiFi.h>
#include <PubSubClient.h>
#include <DHTesp.h>
// ============================================
// ESP32 + DHT22 -> Publica por MQTT cada X ms
//
// Topic: mat_utec/pais/zona
// Ejemplo: mat_utec/uy/atlantida
//
// Payload (JSON):
// {"temp_c":24.1,"hum_pct":55.0}
// ============================================
// WiFi (Wokwi)
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// MQTT (Mosquitto público)
const char* mqtt_server = "test.mosquitto.org";
const int mqtt_port = 1883;
// Definí tu ubicación
const char* PAIS = "uy";
const char* ZONA = "Atlántida"; // ciudad/zona
// DHT22
const int DHT_PIN = 12;
DHTesp dht;
WiFiClient espClient;
PubSubClient client(espClient);
// ======================================================
// CONFIGURACIÓN
// 1000 = 1 segundo
// 2000 = 2 segundos
// ======================================================
const unsigned long INTERVALO_MS = 2000;
// Timer
unsigned long lastPub = 0;
// Topic
String topic;
void conectarWiFi() {
Serial.print("Conectando a WiFi");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(250);
Serial.print(".");
}
Serial.println("\nWiFi conectado OK");
Serial.print("IP: ");
Serial.println(WiFi.localIP());
}
void conectarMQTT() {
while (!client.connected()) {
// ClientID único por país/zona
String clientId = String("ESP32_") + PAIS + "_" + ZONA;
Serial.print("Conectando a MQTT... ");
Serial.println(clientId);
if (client.connect(clientId.c_str())) {
Serial.println("MQTT conectado OK");
} else {
Serial.print("Falló MQTT, rc=");
Serial.print(client.state());
Serial.println(" -> reintentando en 1s");
delay(1000);
}
}
}
void setup() {
Serial.begin(115200);
// Armamos el topic
topic = String("mat_utec/") + PAIS + "/" + ZONA;
// Sensor
dht.setup(DHT_PIN, DHTesp::DHT22);
// WiFi + MQTT
conectarWiFi();
client.setServer(mqtt_server, mqtt_port);
conectarMQTT();
Serial.print("Publicando en topic: ");
Serial.println(topic);
Serial.print("Intervalo de publicación: ");
Serial.print(INTERVALO_MS);
Serial.println(" ms");
}
void loop() {
// Mantener conexión MQTT
if (!client.connected()) {
conectarMQTT();
}
client.loop();
// Publicar cada INTERVALO_MS
if (millis() - lastPub >= INTERVALO_MS) {
lastPub = millis();
TempAndHumidity data = dht.getTempAndHumidity();
if (isnan(data.temperature) || isnan(data.humidity)) {
Serial.println("Error leyendo DHT22");
return;
}
// Payload JSON
String payload = "{";
payload += "\"temp_c\":" + String(data.temperature, 1) + ",";
payload += "\"hum_pct\":" + String(data.humidity, 1);
payload += "}";
bool ok = client.publish(topic.c_str(), payload.c_str());
// Debug
Serial.print("Enviado -> ");
Serial.print(topic);
Serial.print(" : ");
Serial.print(payload);
if (ok) Serial.println(" ✅");
else Serial.println(" ❌ (publish falló)");
}
}