#include <WiFi.h>
#include <PubSubClient.h>
#include <DHT.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define DHTPIN 15
#define DHTTYPE DHT22
#define LED_ROJO 19
#define LED_VERDE 4
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
#define OLED_SDA 21
#define OLED_SCL 22
// WiFi y MQTT config
const char* ssid = "Wokwi-GUEST";
const char* password = "";
const char* mqtt_server = "broker.hivemq.com";
const int mqtt_port = 1883;
const char* clientID = "esp32nodoredZAZA"; // Cambia si hay conflicto
WiFiClient espClient;
PubSubClient client(espClient);
DHT dht(DHTPIN, DHTTYPE);
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
void setup_wifi() {
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
}
}
void callback(char* topic, byte* payload, unsigned int length) {
String msg;
for (int i=0; i<length; i++) {
msg += (char)payload[i];
}
msg.toUpperCase();
if (String(topic) == "casa/led1") {
digitalWrite(LED_ROJO, msg == "ON" ? HIGH : LOW);
} else if (String(topic) == "casa/led2") {
digitalWrite(LED_VERDE, msg == "ON" ? HIGH : LOW);
}
}
void reconnect() {
while (!client.connected()) {
if (client.connect(clientID)) {
client.subscribe("casa/led1");
client.subscribe("casa/led2");
} else {
delay(5000);
}
}
}
void mostrarOLED(float temp, float hum) {
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0,0);
display.print("Temp: ");
display.print(temp);
display.println(" C");
display.print("Humedad: ");
display.print(hum);
display.println(" %");
display.display();
}
void setup() {
Serial.begin(115200);
pinMode(LED_ROJO, OUTPUT);
pinMode(LED_VERDE, OUTPUT);
Wire.begin(OLED_SDA, OLED_SCL);
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
while(1);
}
display.clearDisplay();
display.display();
dht.begin();
setup_wifi();
client.setServer(mqtt_server, mqtt_port);
client.setCallback(callback);
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
float temp = dht.readTemperature();
float hum = dht.readHumidity();
if (!isnan(temp) && !isnan(hum)) {
client.publish("casa/temperatura", String(temp).c_str());
client.publish("casa/humedad", String(hum).c_str());
mostrarOLED(temp, hum);
}
delay(3000);
}