#include <WiFi.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <PubSubClient.h> // Incluye la biblioteca PubSubClient
// Configuración de la red Wi-Fi
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// Configuración del servidor MQTT
const char* mqtt_server = "broker.emqx.io";
const int mqtt_port = 1883;
const char* mqtt_topic = "gerson/humedad";
// Configuración de la pantalla OLED
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
// Pines de los LEDs
const int ledPin1 = 33;
const int ledPin2 = 16;
WiFiClient espClient;
PubSubClient client(espClient);
unsigned long lastMsgTime = 0;
#define MSG_INTERVAL 3000 // Intervalo de 3 segundos
void setup() {
Serial.begin(115200);
// Inicializar los pines de los LEDs como salidas
pinMode(ledPin1, OUTPUT);
pinMode(ledPin2, OUTPUT);
// Inicializar la pantalla OLED
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
for(;;);
}
// Conectar a la red Wi-Fi
WiFi.begin(ssid, password);
Serial.println("Conectando a la red Wi-Fi...");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi conectado");
Serial.println("Dirección IP: ");
Serial.println(WiFi.localIP());
// Mostrar la IP en la pantalla OLED
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println("IP: ");
display.println(WiFi.localIP());
display.display();
// Mostrar la intensidad de la señal en la pantalla OLED
int signalStrength = WiFi.RSSI();
display.setCursor(0, 20);
display.println("Senal: ");
display.print(signalStrength);
display.println(" dBm");
display.display();
// Configurar el cliente MQTT
client.setServer(mqtt_server, mqtt_port);
client.setCallback(callback);
// Conectar al servidor MQTT
if (client.connect("ESP32Client")) {
Serial.println("Conectado al servidor MQTT");
// Suscribirse al topic
client.subscribe(mqtt_topic);
Serial.println("Suscrito al topic: " + String(mqtt_topic));
} else {
Serial.print("Fallo en la conexión MQTT, rc=");
Serial.print(client.state());
Serial.println(" Intentando de nuevo en 5 segundos");
delay(5000);
}
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
unsigned long now = millis();
if (now - lastMsgTime > MSG_INTERVAL) {
lastMsgTime = now;
publishRandomHumidityAndTemperature();
}
}
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Mensaje recibido [");
Serial.print(topic);
Serial.print("] ");
String message = "";
for (int i = 0; i < length; i++) {
message += (char)payload[i];
}
Serial.println(message);
// Controlar los LEDs según el mensaje recibido
if (message == "ON1") {
digitalWrite(ledPin1, HIGH);
Serial.println("Encendido LED 1 (Pin 33)");
} else if (message == "OFF1") {
digitalWrite(ledPin1, LOW);
Serial.println("Apagado LED 1 (Pin 33)");
} else if (message == "ON2") {
digitalWrite(ledPin2, HIGH);
Serial.println("Encendido LED 2 (Pin 16)");
} else if (message == "OFF2") {
digitalWrite(ledPin2, LOW);
Serial.println("Apagado LED 2 (Pin 16)");
}
// Imprimir el estado actual de los pines 33 y 16
Serial.println("Estado actual del pin 33: " + String(digitalRead(ledPin1)));
Serial.println("Estado actual del pin 16: " + String(digitalRead(ledPin2)));
// Mostrar el mensaje en la pantalla OLED
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println("Topic: " + String(topic));
display.setCursor(0, 20);
display.print("Mensaje: ");
display.println(message);
display.display();
}
void reconnect() {
// Bucle hasta que estemos reconectados
while (!client.connected()) {
Serial.print("Intentando conexión MQTT...");
// Intentar conectar
if (client.connect("ESP32Client")) {
Serial.println("Conectado");
// Una vez conectado, suscribirse al topic
client.subscribe(mqtt_topic);
Serial.println("Suscrito al topic: " + String(mqtt_topic));
} else {
Serial.print("Fallo, rc=");
Serial.print(client.state());
Serial.println(" Intentando de nuevo en 5 segundos");
// Esperar 5 segundos antes de reintentar
delay(5000);
}
}
}
void publishRandomHumidityAndTemperature() {
// Generar valores aleatorios de humedad y temperatura
int humidity = random(0, 101);
int temperature = random(10, 41); // Temperatura entre 10°C y 40°C
// Crear el mensaje combinado
char msg[32];
snprintf(msg, sizeof(msg), "Humedad: %d %%, Temperatura: %d °C", humidity, temperature);
// Publicar el mensaje en el topic
client.publish(mqtt_topic, msg);
Serial.print("Publicado en topic: ");
Serial.print(mqtt_topic);
Serial.print(" Valor: ");
Serial.println(msg);
// Mostrar los valores en la pantalla OLED
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.print("Humedad: ");
display.print(humidity);
display.println(" %");
display.setCursor(0, 20);
display.print("Temperatura: ");
display.print(temperature);
display.println(" °C");
display.display();
}