#include <WiFi.h>
#include <PubSubClient.h>
#include <DHT.h>
//Conexión WiFi
const char* ssid = "Wokwi-GUEST"; //Modifica con el SSID de tu red
const char* password = ""; //Password de la red
//Broker MQTT
const char* mqtt_server = "broker.hivemq.com";
//LED para callback
const int ledPin = 2;
// Configuración del sensor DHT11
#define DHTPIN 4 // El pin de datos del sensor DHT11
#define DHTTYPE DHT22 // Tipo de sensor DHT (DHT11 en este caso)
// Inicializar el objeto DHT
DHT dht(DHTPIN, DHTTYPE);
// Inicializar espClient
WiFiClient espClient;
PubSubClient client(espClient);
struct SensDHT{
float temperatura;
float humedad;
} datos;
SensDHT leeDHT(){
SensDHT mediciones;
delay(2000);
mediciones.temperatura = dht.readTemperature();
mediciones.humedad = dht.readHumidity();
return mediciones;
}
void setup_wifi(){
delay(10);
//Imprimimos esto para poder ver en el monitor serie el estado de la conexión
Serial.println();
Serial.print("Conectando a ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while(WiFi.status() != WL_CONNECTED){
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi conectado");
Serial.println("IP asignada: ");
Serial.println(WiFi.localIP());
} // fin de setup_wifi
void reconnect(){
while (!client.connected()){
Serial.print("Conectando al broker MQTT");
// Intentamos conectarnos
if(client.connect("ESP-32")){
Serial.println("\nConectado");
// Nos suscribimos al tópico del LED
client.subscribe("Jeanette/LED");
}else{
Serial.print("falla en la conexión, rc=");
Serial.print(client.state());
Serial.println(" nuevo intento en 5 segundos");
// Colocamos un delay
delay(5000);
}
}
} //fin de reconnect
void callback(char* topico, byte* mensaje, unsigned int longitud){
Serial.print("Hay un mensaje nuevo en el tópico: ");
Serial.print(topico);
Serial.print(". Mensaje: ");
String mensajeTemp;
for (int i = 0; i < longitud; i++){
Serial.print((char)mensaje[i]);
mensajeTemp += (char)mensaje[i];
}
Serial.println();
if (String(topico) == "Jeanette/LED"){
Serial.print("Cambiando el led a ");
if(mensajeTemp == "hola-on"){
Serial.println("encendido");
digitalWrite(ledPin, HIGH);
}
else if(mensajeTemp == "off"){
Serial.println("apagado");
digitalWrite(ledPin, LOW);
}
}
}// fin de callback
void setup(){
pinMode(ledPin, OUTPUT);
Serial.begin(9600);
setup_wifi();
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
} //fin de setup
void loop(){
char temp[10], hum[10]; //arreglos de caracteres para enviar los datos al broker MQTT
if(!client.connected()){
reconnect();
}
client.loop();
datos = leeDHT();
Serial.print("Temperatura: ");
Serial.print(datos.temperatura);
Serial.print(" °C, Humedad: ");
Serial.print(datos.humedad);
Serial.println(" %");
// Enviamos la lectura de Temperatura al tópico
dtostrf(datos.temperatura, 1, 2, temp); //función para convertir de float a char
client.publish("Alex/tarea/Temperatura", temp);
// Enviamos la lectura de Humedad al tópico correspondiente
dtostrf(datos.humedad, 1, 2, hum);
client.publish("Alex/tarea/Humedad", hum);
//delay(5000);
}//fin de loop