#include <WiFi.h>
#include <PubSubClient.h>
#include "DHTesp.h"
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 //Ancho del Display en Pixeles
#define SCREEN_HEIGHT 64 //Alto del Display en Pixeles
//Usa los pines I2C por defecto del ESP32
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
const int DHT_PIN = 19;
DHTesp dhtSensor;
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// Datos del Broker
//const char* mqtt_server = "66.29.142.107";
const char* mqtt_server = "broker.hivemq.com";
//const uint16_t MQTT_PORT = 1883;
WiFiClient espClientChaux;
PubSubClient client(espClientChaux);
long lastMsg = 0;
const int relePin=18;
String estado_rele;
void setup_wifi(){
delay(10);
Serial.println();
Serial.println("Conectando a ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED){
delay(500);
Serial.print(".");
}
Serial.print("IP: ");
Serial.println(WiFi.localIP());
}
void reconnect(){
while (!client.connected()){
Serial.print("Intentando conectar a MQTT broker ...");
if (client.connect("ESP32ClientChaux")){
Serial.println("Conectado");
client.subscribe("Prueba/Rele");
} else {
Serial.print("Fallido, rc=");
Serial.print(client.state());
Serial.println(" intente de nuevo en 5 s");
//Espera 5 segundos antes de reintentar
delay(5000);
}
}
}
void CallBackMqtt(char* topic, byte* payload, unsigned int lenght)
{
Serial.print("Callback -");
Serial.print("Message");
String messageTemp;
for(int i=0; i<lenght; i++)
{
Serial.print((char)payload[i]);
messageTemp+=(char)payload[i];
}
Serial.println();
if(String(topic)=="Prueba/Rele"){
Serial.print("Cambiando la salida a: ");
if(messageTemp=="on"){
Serial.println("on");
digitalWrite(relePin, HIGH);
estado_rele="on";
}
else if (messageTemp=="off"){
Serial.println("off");
digitalWrite(relePin, LOW);
estado_rele="off";
}
}
}
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
pinMode(relePin, OUTPUT);
setup_wifi();
client.setServer(mqtt_server, 1883);
client.setCallback(CallBackMqtt);
dhtSensor.setup(DHT_PIN, DHTesp::DHT22);
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)){
Serial.println(F("SSD1306 No se puede localizar"));
for(;;);
}
delay(2000);
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
}
void loop() {
if (!client.connected()){
reconnect();
}
client.loop();
long now = millis();
if (now - lastMsg > 1000) {
lastMsg = now;
}
TempAndHumidity data = dhtSensor.getTempAndHumidity();
char char_temp[10];
char char_hum[10];
//char * itoa( int valor, char * cadena_destino, int base )
//Esta función se utiliza para convertir un valor numérico en una cadena de texto, es decir,
//que permite convertir un número entero en un texto. La cadena contendrá tantos carácteres
//como dígitos tenga el resultado.
itoa(data.temperature, char_temp, 10);
itoa(data.humidity, char_hum, 10);
Serial.print("Temperatura: ");
Serial.println(char_temp);
Serial.print("Humedad: ");
Serial.println(char_hum);
display.clearDisplay();
display.setCursor(10, 10);
display.print("Temperatura: ");
display.print(char_temp);
display.setCursor(10, 30);
display.print("Humedad: ");
display.print(char_hum);
display.setCursor(10, 50);
display.print("Rele: ");
display.print(estado_rele);
display.display();
client.publish("Prueba/Temp", char_temp);
client.publish("Prueba/Hum", char_hum);
}