#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <DallasTemperature.h>
#include <OneWire.h>
#define TEMP_UPPER_THRESHOLD 30.0 // Umbral de temperatura superior en grados Celsius
#define SENSOR_PIN 22 // Pin GPIO22 de ESP32 conectado al pin DQ del sensor DS18B20
#define RELAY_FAN_PIN 19 // Pin GPIO19 de ESP32 conectado al relé
#define SCREEN_WIDTH 128 // Ancho de la pantalla OLED
#define SCREEN_HEIGHT 64 // Altura de la pantalla OLED
#define OLED_RESET -1 // Reset pin # (o -1 si se comparte el pin de reinicio de Arduino)
#define SCREEN_ADDRESS 0x3C ///< Ver la hoja de datos para la Dirección; 0x3D para 128x64, 0x3C para 128x32
// Conexión para la pantalla OLED SSD1306
#define OLED_SDA 23
#define OLED_SCL 18
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
OneWire oneWire(SENSOR_PIN);
DallasTemperature DS18B20(&oneWire);
void setup() {
Serial.begin(9600);
pinMode(RELAY_FAN_PIN, OUTPUT);
// Inicialización de la pantalla OLED
Wire.begin(OLED_SDA, OLED_SCL);
if(!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
Serial.println(F("Error al inicializar la pantalla OLED"));
while(true);
}
display.clearDisplay();
display.setTextColor(SSD1306_WHITE);
display.setTextSize(1);
// Inicialización del sensor DS18B20
DS18B20.begin();
}
void loop() {
display.clearDisplay(); // Limpiar la pantalla antes de actualizar
display.setCursor(30, 5); // Ajustar la posición del cursor para "Termometro"
display.println("TERMOMETRO");
DS18B20.requestTemperatures(); // Solicitar la temperatura al sensor DS18B20
float temperature = DS18B20.getTempCByIndex(0); // Leer la temperatura en grados Celsius
// Calibrar la temperatura para evitar valores negativos
if (temperature < 0) {
temperature = 0; // Ajustar valores negativos a cero
}
display.setTextSize(1);
display.setCursor(0, 25); // Ajustar la posición del cursor para la temperatura
display.print("Temperat: ");
display.print(temperature);
display.println(" C");
display.setCursor(0, 45); // Ajustar la posición del cursor para la alarma
// Mostrar el estado del ventilador (prendido o apagado)
if (temperature >= TEMP_UPPER_THRESHOLD) {
display.println("Alarma: Prendido");
digitalWrite(RELAY_FAN_PIN, HIGH); // Encender el relé
} else {
display.println("Alarma: Apagado");
digitalWrite(RELAY_FAN_PIN, LOW); // Apagar el relé
}
display.display(); // Mostrar los cambios en la pantalla
delay(1000); // Esperar un segundo antes de volver a leer la temperatura
}