#include <WiFi.h>
#include <PubSubClient.h>
// Configuración WiFi
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// Configuración MQTT
const char* mqtt_server = "asidi.pro";
const int mqtt_port = 1883;
const char* client_id = "esp32_temperatura_led2023";
// Tópicos MQTT
const char* topic_temperatura = "pdmh/us0001/temp";
const char* topic_control_led = "hogar/dispositivo/";
// Pines
const int pin_temperatura = 34; // Pin analógico para sensor de temperatura
const int pin_led = 27; // Pin para LED
// Variables globales
WiFiClient espClient;
PubSubClient client(espClient);
unsigned long ultimo_envio = 0;
const unsigned long intervalo_envio = 2000; // 2 segundos
void setup() {
Serial.begin(115200);
Serial.println("Iniciando ESP32...");
// Configurar pines
pinMode(pin_led, OUTPUT);
digitalWrite(pin_led, LOW); // LED apagado inicialmente
// Inicializar generador de números aleatorios
randomSeed(analogRead(0));
// Conectar a WiFi
conectar_wifi();
// Configurar MQTT
client.setServer(mqtt_server, mqtt_port);
client.setCallback(callback_mqtt);
// Conectar a MQTT
conectar_mqtt();
Serial.println("Sistema iniciado correctamente");
}
void loop() {
// Mantener conexión MQTT
if (!client.connected()) {
conectar_mqtt();
}
client.loop();
// Verificar conexión WiFi
if (WiFi.status() != WL_CONNECTED) {
Serial.println("Conexión WiFi perdida. Reconectando...");
conectar_wifi();
}
// Enviar temperatura cada 2 segundos
unsigned long ahora = millis();
if (ahora - ultimo_envio > intervalo_envio) {
enviar_temperatura();
ultimo_envio = ahora;
}
delay(100); // Pequeña pausa para evitar saturar el procesador
}
void conectar_wifi() {
Serial.print("Conectando a la red WiFi: ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi conectado exitosamente");
Serial.print("Dirección IP: ");
Serial.println(WiFi.localIP());
}
void conectar_mqtt() {
while (!client.connected()) {
Serial.print("Conectando al servidor MQTT... ");
if (client.connect(client_id)) {
Serial.println("Conectado al servidor MQTT");
// Suscribirse al tópico de control del LED
client.subscribe(topic_control_led);
Serial.print("Suscrito al tópico: ");
Serial.println(topic_control_led);
} else {
Serial.print("Error de conexión MQTT, código: ");
Serial.print(client.state());
Serial.println(" Reintentando en 5 segundos...");
delay(5000);
}
}
}
void callback_mqtt(char* topic, byte* payload, unsigned int length) {
// Convertir payload a string
String mensaje = "";
for (int i = 0; i < length; i++) {
mensaje += (char)payload[i];
}
Serial.print("Mensaje recibido en el tópico [");
Serial.print(topic);
Serial.print("]: ");
Serial.println(mensaje);
// Verificar si es el tópico de control del LED
if (String(topic) == topic_control_led) {
controlar_led(mensaje);
}
}
void controlar_led(String comando) {
if (comando.startsWith("on1")) {
digitalWrite(pin_led, HIGH);
Serial.println("LED encendido");
} else if (comando.startsWith("of1")) {
digitalWrite(pin_led, LOW);
Serial.println("LED apagado");
} else {
Serial.print("Comando no reconocido: ");
Serial.println(comando);
}
}
void enviar_temperatura() {
// Simular lectura de temperatura (valor aleatorio entre 10.00 y 40.00)
float temperatura = random(1000, 4001) / 100.0; // 1000-4000 dividido por 100 = 10.00-40.00
// Convertir temperatura a string
String temp_str = String(temperatura, 2); // 2 decimales
// Publicar temperatura
if (client.publish(topic_temperatura, temp_str.c_str())) {
Serial.print("Temperatura enviada: ");
Serial.print(temperatura);
Serial.println(" °C");
} else {
Serial.println("Error al enviar temperatura");
}
}