#include <WiFi.h>
#include <PubSubClient.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <DHT.h> // Librería para el sensor DHT11
#include <Wire.h>
#include <stdlib.h>
// Configuración OLED
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
// Configuración de los LEDs
const int ledPin1 = 27;
const int ledPin2 = 26; // Pin para el segundo LED
// Configuración del DHT11
#define DHTPIN 4 // Pin de conexión del DHT11
#define DHTTYPE DHT22 // Tipo de sensor
DHT dht(DHTPIN, DHTTYPE);
// Configuración WiFi
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// Configuración MQTT
const char* mqtt_server = "broker.hivemq.com"; // broker.emqx.io - broker.hivemq.com
const char* tempTopic = "iupascualbravo/bloque04/temp";
const char* humeTopic = "iupascualbravo/bloque04/hume";
const char* contTopic = "iupascualbravo/bloque04/conta";
const char* led1Topic = "iupascualbravo/bloque04/led1"; // Tópico MQTT para el primer LED
const char* led2Topic = "iupascualbravo/bloque04/led2"; // Tópico MQTT para el segundo LED
WiFiClient espClient;
PubSubClient client(espClient);
long lastMsg = 0;
int contador = 0;
float temperatura = 0;
float humedad = 0;
void setup_wifi() {
delay(10);
Serial.println();
Serial.print("Conectando a ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi conectado");
Serial.println("Dirección IP: ");
Serial.println(WiFi.localIP());
}
void callback(char* topic, byte* message, unsigned int length) {
Serial.print("Mensaje recibido en el tópico: ");
Serial.print(topic);
String msg;
for (int i = 0; i < length; i++) {
msg += (char)message[i];
}
Serial.println(" Mensaje: " + msg);
// Control del LED1 según el mensaje recibido en el tópico "casa/led1"
if (String(topic) == led1Topic) {
if (msg == "ON") {
digitalWrite(ledPin1, HIGH);
Serial.println("LED1 encendido");
} else if (msg == "OFF") {
digitalWrite(ledPin1, LOW);
Serial.println("LED1 apagado");
}
}
// Control del LED2 según el mensaje recibido en el tópico "casa/led2"
if (String(topic) == led2Topic) {
if (msg == "ON") {
digitalWrite(ledPin2, HIGH);
Serial.println("LED2 encendido");
} else if (msg == "OFF") {
digitalWrite(ledPin2, LOW);
Serial.println("LED2 apagado");
}
}
}
void reconnect() {
while (!client.connected()) {
Serial.print("Conectando al servidor MQTT...");
if (client.connect("ESP32Client1233")) {
Serial.println("Conectado");
// Suscribirse a los tópicos para controlar los LEDs
client.subscribe(led1Topic);
client.subscribe(led2Topic);
} else {
Serial.print("Fallo, rc=");
Serial.print(client.state());
Serial.println(" Intentando de nuevo en 5 segundos...");
delay(5000);
}
}
}
void setup() {
// Configuración serial
Serial.begin(115200);
// Configuración de los LEDs
pinMode(ledPin1, OUTPUT);
digitalWrite(ledPin1, LOW);
pinMode(ledPin2, OUTPUT);
digitalWrite(ledPin2, LOW);
// Inicialización del sensor DHT11
dht.begin();
// Configuración de la pantalla OLED
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("No se encuentra la pantalla OLED"));
while (true);
}
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0, 0);
display.print("Conectando WiFi...");
display.display();
// Conectar a WiFi
setup_wifi();
// Configurar MQTT
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
// Mostrar en la pantalla OLED
display.clearDisplay();
display.setCursor(0, 0);
display.print("Conectado a WiFi");
display.display();
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
long now = millis();
if (now - lastMsg > 2000) {
lastMsg = now;
// Leer datos de temperatura y humedad del sensor DHT11
temperatura = random(10,500)/10.000; // dht.readTemperature();
humedad = random(10,999)/10.000; //dht.readHumidity();
contador++;
// Publicar los datos de temperatura, humedad y contador en los tópicos MQTT
char tempString[8];
dtostrf(temperatura, 1, 2, tempString);
client.publish(tempTopic, tempString);
char humeString[8];
dtostrf(humedad, 1, 2, humeString);
client.publish(humeTopic, humeString);
char contString[8];
itoa(contador, contString, 10);
client.publish(contTopic, contString);
// Mostrar los datos en el puerto serial
Serial.print("Temperatura: ");
Serial.print(temperatura);
Serial.print(" °C, Humedad: ");
Serial.print(humedad);
Serial.print(" %, Contador: ");
Serial.println(contador);
// Mostrar los datos en la pantalla OLED
display.clearDisplay();
display.setCursor(0, 0);
display.print("Temp: ");
display.print(temperatura);
display.println(" 'C");
display.print("Humedad: ");
display.print(humedad);
display.println(" %");
display.print("Contador: ");
display.print(contador);
display.display();
}
}