/****************************************************************************************
Programa: Este programa permite una conexión por wifi a un servidor(broker) con protocilo MQTT
Permitiendo enviar y recibir indormación desde cualquier parte del mundo, el
ejemplo simula la temperatura con valores aleatorios, recomiendo descargar la aplicación
MQTT explorer para verificar el envio y recepción de datos por este medio
Realizado: Javier Saldarriaga Cano ([email protected])
Fecha: OCTUBRE de 2024
Versión: 1.0
************************************************************************************/
#include <WiFi.h>
#include <PubSubClient.h>
// Configuración de la red WiFi
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// Configuración del servidor MQTT https://www.hivemq.com/mqtt/public-mqtt-broker/
//const char* mqtt_server = "broker.hivemq.com";
const char* mqtt_server = "asidi.pro";
const int mqtt_port = 1883;
const char* mqtt_user = "";
const char* mqtt_password = "";
// ID único del cliente MQTT
const char* client_id = "esp32_temperatura_led2023";
// Tópico MQTT para enviar la temperatura simulada
const char* temperatura_topic = "pdmh/us0001/temp";
// Tópico MQTT para controlar el LED
const char* led_control_topic = "hogar/dispositivo/";
const char* conta_topic = "pdmh/us0001/activo";
// Pin para la generación de valores de temperatura simulados
const int temperatura_pin = 34;
const int PinLED = 27;// Pin del LED
long lastMsg2 = 0;
WiFiClient espClient;
PubSubClient client(espClient); // instancia del cliente MQTT
void setup_wifi() {
delay(10);
Serial.println("Conectando a WiFi...");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Conectando a WiFi...");
}
Serial.println("Conectado a WiFi");
}
void reconnect() {
while (!client.connected()) {
Serial.println("Intentando conexión MQTT...");
if (client.connect(client_id, mqtt_user, mqtt_password)) {
Serial.println("Conectado al servidor MQTT");
// Suscribirse al tópico de control del LED al conectarse
client.subscribe(led_control_topic);
} else {
Serial.print("Error de conexión, rc=");
Serial.print(client.state());
Serial.println(" Intentando de nuevo en 5 segundos");
delay(5000);
}
}
}
void setup() {
Serial.begin(9600);
setup_wifi();
client.setServer(mqtt_server, mqtt_port);
client.setCallback(callback);
pinMode(PinLED, OUTPUT);
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
// Generar valor de temperatura simulada (entre 20 y 30 grados Celsius)
long now = millis();
if (now - lastMsg2 > 2000) {
lastMsg2 = now;
float temperatura_simulada = random(1000, 5000) / 100.0;
// Enviar valor de temperatura al servidor MQTT
char mensaje[10];
dtostrf(temperatura_simulada, 4, 2, mensaje);
client.publish(temperatura_topic, mensaje);
Serial.print("Temperatura enviada: ");
Serial.println(temperatura_simulada);
}
//delay(5000); // Esperar 5 segundos antes de enviar el siguiente valor
}
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Mensaje recibido en el tópico: ");
Serial.println(topic);
String msg="" ;
for (int i = 0; i < length; i++) {
//Serial.print((char)payload[i]);
msg += (char)payload[i];
}
//********************* control de LED ********************
if (msg.substring(0,3) == "on1") { Serial.print("LAMPARA1 ON "); digitalWrite(PinLED, HIGH);}
if (msg.substring(0,3) == "of1") { Serial.print("LAMPARA1 Off "); digitalWrite(PinLED, LOW);}
Serial.print(msg.substring(0,3));
Serial.print("-----------------------");
Serial.print(msg.length());
}