#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <WiFi.h>
#include <Adafruit_MQTT.h>
#include <Adafruit_MQTT_Client.h>
#include <DHTesp.h>
#define SCREEN_WIDTH 128 // Ancho de pantalla
#define SCREEN_HEIGHT 64 // Largo de pantalla
// Credenciales de Adafruit
#define AIO_SERVER "io.adafruit.com"
#define AIO_PORT 1883
#define AIO_USERNAME "josecar"
#define AIO_KEY "aio_wzWV78jXFAKRsdc8eY0YkxZpGf7w"
// Información de Wi-Fi
const char* WIFI_SSID = "Wokwi-GUEST";
const char* WIFI_PASS = "";
WiFiClient client;
Adafruit_MQTT_Client mqtt(&client, AIO_SERVER, AIO_PORT, AIO_USERNAME, AIO_KEY);
// Feeds de Adafruit IO
Adafruit_MQTT_Subscribe luz = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/feeds/boton1");
Adafruit_MQTT_Subscribe luzz = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/feeds/boton2");
const int DHT_PIN = 25;
DHTesp dhtSensor;
// create an OLED display object connected to I2C
Adafruit_SSD1306 oled(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
const int led1Pin = 18;
const int led2Pin = 19;
bool temperatureControlEnabled = false;
bool humidityControlEnabled = false;
void setup() {
Serial.begin(115200);
dhtSensor.setup(DHT_PIN, DHTesp::DHT22);
// Conexión Wi-Fi
Serial.print("Conectando a Wi-Fi");
WiFi.begin(WIFI_SSID, WIFI_PASS);
while (WiFi.status() != WL_CONNECTED) {
delay(200);
Serial.print(".");
}
Serial.println(" Conectado a Wi-Fi!");
pinMode(led1Pin, OUTPUT);
pinMode(led2Pin, OUTPUT);
// Inicializa OLED
if (!oled.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("Falla al iniciar la pantalla LED"));
while (1);
}
delay(2000); // Tiempo para iniciar la pantalla
oled.clearDisplay(); // Limpiar pantalla
oled.setTextSize(2); // Tamaño del texto
oled.setTextColor(WHITE); // Cambiar el color del texto
oled.setCursor(0, 0); // Acomodar posición del texto
oled.display(); // Display on OLED
// Suscribirse a los feeds de control de los LEDs
mqtt.subscribe(&luz);
mqtt.subscribe(&luzz);
}
void loop() {
// Leer datos de temperatura y humedad
TempAndHumidity data = dhtSensor.getTempAndHumidity();
// Verificar si se ha recibido un mensaje en el feed de "Botón 1"
if (mqtt.readSubscription(5000)) {
if (strcmp((const char*)luz.lastread, "1") == 0) {
digitalWrite(led1Pin, HIGH); // Encender LED 1
// Indicar protocolo de seguridad activo en la pantalla
oled.clearDisplay();
oled.setCursor(0, 0);
oled.setTextSize(1);
oled.println("Security Protocol:");
oled.setTextSize(2);
oled.println("Activated!");
oled.display();
} else {
digitalWrite(led1Pin, LOW); // Apagar LED 1
}
}
// Verificar si se ha recibido un mensaje en el feed de "Botón 2"
if (mqtt.readSubscription(5000)) {
if (strcmp((const char*)luzz.lastread, "1") == 0) {
digitalWrite(led2Pin, HIGH); // Encender LED 2
// Reduce temperatura y humedad
data.temperature -= 20;
data.humidity -= 20;
} else {
digitalWrite(led2Pin, LOW); // Apagar LED 2
}
}
// Mostrar temperatura y humedad en el OLED
oled.clearDisplay();
oled.setCursor(0, 0);
oled.setTextSize(1);
oled.println("Temperatura:");
oled.setTextSize(2);
oled.println(String(data.temperature, 2) + "C");
oled.println("Humedad:");
oled.setTextSize(2);
oled.println(String(data.humidity, 2) + "%");
oled.display();
// Conectar al servidor MQTT de Adafruit
MQTT_connect();
}
void MQTT_connect() {
int8_t ret;
if (mqtt.connected()) {
return;
}
Serial.print("Conectando a MQTT...");
uint8_t retries = 3;
while ((ret = mqtt.connect()) != 0) {
Serial.print(mqtt.connectErrorString(ret));
Serial.print(" Reintentando en 5 segundos...");
mqtt.disconnect();
delay(5000);
retries--;
if (retries == 0) {
Serial.println(" No se pudo conectar a MQTT");
while (1);
}
}
Serial.println("Conectado a MQTT!");
}
FPS: 0
Power: 0.00W
Power: 0.00W