#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <DHT.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define boton 25
#define switchPin 14
#define led 18 // Define el pin del LED, asegúrate de usar el pin correcto según tu configuración
#define DHTPIN 4 // Pin digital al que está conectado el sensor DHT22
#define DHTTYPE DHT22 // Tipo de sensor DHT (DHT22 o DHT11)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
DHT dht(DHTPIN, DHTTYPE);
boolean estadoBoton;
boolean estadoSwitch;
void setup() {
pinMode(led, OUTPUT); // Asigna el pin del LED como salida
pinMode(boton, INPUT); // Asigna el pin del botón como entrada
pinMode(switchPin, INPUT); // Asigna el pin del interruptor como entrada
Serial.begin(115200); // Inicia la comunicación serial a 115200 baudios
Serial.println("Hello, GR2 ET DEMERA"); // Imprime un mensaje inicial por el puerto serial
// Inicia la comunicación I2C para la pantalla OLED
Wire.begin(21, 22); // Inicia el bus I2C con los pines GPIO 21 (SDA) y GPIO 22 (SCL)
// Inicia la pantalla OLED
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Inicia la pantalla OLED con dirección I2C 0x3C
Serial.println(F("SSD1306 allocation failed")); // Imprime un mensaje de error si falla la inicialización
for (;;); // Bucle infinito si falla la inicialización
}
display.clearDisplay(); // Borra el contenido actual de la pantalla OLED
display.setTextSize(1); // Establece el tamaño del texto en 1 (pequeño)
display.setTextColor(SSD1306_WHITE); // Establece el color del texto en blanco
display.setCursor(0,0); // Coloca el cursor en la posición (0, 0)
// Lectura de la humedad relativa
float h = dht.readHumidity();
// Lectura de la temperatura en grados Celsius
float t = dht.readTemperature();
// Verifica si la lectura fue exitosa
if (isnan(h) || isnan(t)) {
display.println("Error al leer el sensor DHT!"); // Muestra un mensaje de error si la lectura falla
} else {
display.print("Humedad: ");
display.print(h);
display.println(" %");
display.print("Temperatura: ");
display.print(t);
display.println(" *C");
}
display.display(); // Muestra en la pantalla OLED lo que se ha preparado hasta ahora
digitalWrite(led, LOW); // Asegura que el LED esté apagado al inicio
}
void loop() {
estadoSwitch = digitalRead(switchPin); // Lee el estado del interruptor y lo guarda en estadoSwitch
if (estadoSwitch == HIGH) { // Si el interruptor está cerrado (HIGH)
estadoBoton = digitalRead(boton); // Lee el estado del botón y lo guarda en estadoBoton
if (estadoBoton == HIGH) { // Si el botón está presionado (HIGH)
PrenderLed(); // Llama a la función para encender el LED y mostrar los datos del sensor
} else {
ApagarLed(); // Llama a la función para apagar el LED y limpiar la pantalla OLED
}
} else { // Si el interruptor está abierto (LOW)
ApagarLed(); // Llama a la función para apagar el LED y limpiar la pantalla OLED
}
}
void PrenderLed() {
display.clearDisplay(); // Borra el contenido actual de la pantalla OLED
display.setTextSize(1); // Establece el tamaño del texto en 1 (pequeño)
display.setTextColor(SSD1306_WHITE); // Establece el color del texto en blanco
display.setCursor(0,0); // Coloca el cursor en la posición (0, 0)
display.println("LED ENCENDIDO"); // Imprime un mensaje indicando que el botón está presionado
display.display(); // Muestra en la pantalla OLED lo que se ha preparado hasta ahora
digitalWrite(led, HIGH); // Enciende el LED en el pin especificado
Serial.println("LED PRENDIDO"); // Imprime un mensaje en el puerto serial indicando que el LED está encendido
// Puedes ajustar el tiempo de encendido del LED aquí
delay(1000); // Espera 1 segundo (1000 milisegundos)
}
void ApagarLed() {
display.clearDisplay(); // Borra el contenido actual de la pantalla OLED
display.display(); // Muestra en la pantalla OLED lo que se ha preparado hasta ahora
digitalWrite(led, LOW); // Apaga el LED en el pin especificado
Serial.println("LED APAGADO"); // Imprime un mensaje en el puerto serial indicando que el LED está apagado
}