#include <Wire.h> // Librería para la comunicación I2C
#include <Adafruit_GFX.h> // Librería para gráficos básicos (GFX)
#include <Adafruit_SSD1306.h> // Librería para controlar la pantalla OLED SSD1306
#include <DHT.h> // Librería para sensores DHT (temperatura y humedad)
// Definimos las dimensiones de la pantalla OLED
#define SCREEN_WIDTH 128 // Ancho de la pantalla OLED en píxeles
#define SCREEN_HEIGHT 64 // Altura de la pantalla OLED en píxeles
// Definimos el pin donde está conectado el sensor DHT22
#define DHT22_PIN 13 // Pin al que está conectado el sensor DHT22
// Creamos un objeto para la pantalla OLED con las dimensiones especificadas y conectado vía I2C
Adafruit_SSD1306 oled(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
// Creamos un objeto para el sensor DHT22 especificando el pin y el tipo de sensor
DHT dht22(DHT22_PIN, DHT22);
// Variable para almacenar la cadena de texto que se mostrará
String displayString;
void setup() {
// Iniciamos la comunicación serial a 9600 baudios
Serial.begin(9600);
// Inicializamos la pantalla OLED con la dirección I2C 0x3C y las dimensiones 128x64
if (!oled.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Verifica si la pantalla OLED se inicializa correctamente
Serial.println(F("Error Display")); // Si hay un error, imprime un mensaje en el monitor serial
while (true); // Se queda en un bucle infinito si no se puede inicializar la pantalla
}
// Espera 2 segundos para asegurar que todo el hardware esté inicializado
delay(2000);
oled.clearDisplay(); // Limpia cualquier contenido anterior en la pantalla
// Configuramos el estilo del texto en la pantalla
oled.setTextSize(2); // Tamaño del texto
oled.setTextColor(WHITE); // Color del texto (blanco)
oled.setCursor(0, 10); // Posiciona el cursor en la pantalla (x=0, y=10)
// Inicializamos el sensor DHT22
dht22.begin(); // Inicia el sensor de temperatura y humedad DHT22
// Reservamos espacio en la memoria para evitar fragmentación cuando usamos la clase String
displayString.reserve(10);
}
void loop() {
// Leemos la humedad desde el sensor DHT22
float humi = dht22.readHumidity();
// Leemos la temperatura en grados Celsius desde el sensor DHT22
float tempC = dht22.readTemperature();
// Verificamos si hubo algún error en la lectura de la humedad o la temperatura
if (isnan(humi) || isnan(tempC)) {
displayString = "Error"; // Si hay un error, mostramos "Error"
} else {
// Si las lecturas son correctas, convertimos los valores de temperatura y humedad en texto
displayString = String(tempC, 1); // Convertimos la temperatura a una cadena con 1 decimal
displayString += " C "; // Añadimos " C " (grados Celsius) al texto
displayString += String(humi, 1); // Convertimos la humedad a una cadena con 1 decimal
displayString += " % "; // Añadimos " %" (porcentaje de humedad) al texto
}
// Mostramos la cadena en el monitor serial para visualizar la temperatura y la humedad
Serial.println(displayString);
// Llamamos a la función que centra y muestra el texto en la pantalla OLED
oledDisplayCenter(displayString);
}
// Función para centrar y mostrar el texto en la pantalla OLED
void oledDisplayCenter(String text) {
// Variables para almacenar las coordenadas y el tamaño del texto
int16_t x1;
int16_t y1;
uint16_t width;
uint16_t height;
// Obtenemos las dimensiones del texto (ancho, alto) y su posición en la pantalla
oled.getTextBounds(text, 0, 0, &x1, &y1, &width, &height);
// Limpiamos la pantalla antes de mostrar el nuevo texto
oled.clearDisplay();
// Calculamos la posición para centrar el texto horizontal y verticalmente
oled.setCursor((SCREEN_WIDTH - width) / 2, (SCREEN_HEIGHT - height) / 2);
// Mostramos el texto centrado en la pantalla
oled.println(text);
// Refrescamos la pantalla para que el texto se vea en la OLED
oled.display();
}