/* Incluimos las librerías necesarias */
#include <WiFi.h>
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <DHT.h>
#include <LiquidCrystal_I2C.h>
#include <WebServer.h>
/* Definición de las credenciales de la red WiFi */
const char *ssid = "Wokwi-GUEST";
const char *password = "";
/* Definición de los pines para los dispositivos */
const int pinRele = 2; // GPIO2 en ESP32
const int pinLedVerde = 13; // GPIO13 en ESP32
const int pinLedRojo = 12; // GPIO12 en ESP32
const int pinDHT = 4; // GPIO4 en ESP32 para DHT22
/* Definición de constantes para la comunicación con la aplicación */
const char comandoTemperaturaMaxima = 'A'; ////
const char comandoEncendido = 'B'; ////
const char comandoApagado = 'C'; ////
/* Definición de objetos para el sensor DHT y el display LCD */
#define DHTTYPE DHT22
DHT dht(pinDHT, DHTTYPE);
LiquidCrystal_I2C lcd(0x27, 16, 2); // Dirección I2C del LCD: 0x27, 16 columnas y 2 filas
/* Inicializa la libreria WebServer, el puerto 80 esta por defecto para HTTP */
WebServer servidorWeb(80);
/* Variables globales */
bool sistemaEncendido = false;
float temperaturaMaxima = 21.0;
void setup() {//////////////////////////////////////////////////////////////////////////
Serial.begin(9600);
/* Inicialización del sensor, display, LEDs, etc. */
pinMode(pinRele, OUTPUT);
pinMode(pinLedVerde, OUTPUT);
pinMode(pinLedRojo, OUTPUT);
lcd.init();
lcd.backlight();
dht.begin();
/* Conexión a la red WiFi */
WiFi.begin(ssid, password);
Serial.print("Conectando a la red WiFi ");
Serial.println(ssid);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.print(".");
}
Serial.println();
Serial.println("Conexión exitosa a la red WiFi");
Serial.print("Dirección IP asignada por el enrutador: ");
Serial.println(WiFi.localIP());
/* Inicialización del servidor web y rutas que manejan de las solicitudes HTTP */
servidorWeb.begin();
servidorWeb.on("/", HTTP_GET, handleRaiz);
servidorWeb.on("/temperatura-maxima", HTTP_GET, handleTemperaturaMaxima);
servidorWeb.on("/encendido", HTTP_GET, handleEncendido);
servidorWeb.on("/apagado", HTTP_GET, handleApagado);
servidorWeb.onNotFound(handleNotFound); //por si no se encuentra la página
Serial.print("El servidor HTTP está en: ");
Serial.println(WiFi.localIP());
}
void loop() {///////////////////////////////////////////////////////////////////////////
/* Lectura de temperatura */
float temperatura = obtenerTemperatura();
mostrarTemperatura(temperatura);
/* Recepción de comandos desde la aplicación */
servidorWeb.handleClient();
/* Control del sistema */
if (sistemaEncendido && temperatura < temperaturaMaxima) {
encenderCaldera();
} else {
apagarCaldera();
}
delay(1000);
}
/* Lectura de la temperatura del sensor DHT */
float obtenerTemperatura() {
return dht.readTemperature();
}
/* Mostrar temperatura en el display LCD y en el monitor serie */
void mostrarTemperatura(float temperatura) {
if (isnan(temperatura)) { // isnan(data.temperature) //Si lo que recibe no es un número
Serial.println("Fallo al leer el sensor DHT");
lcd.clear();
lcd.print("Error-Temp");
} else {
Serial.print("Temperatura: ");
Serial.print(temperatura);
Serial.println(" ºC");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Temp: ");
lcd.print(temperatura);
lcd.print((char)223); //simbolo º
lcd.print("C");
}
}
/* Funciones para dar respuesta a las peticiones http de los equipos clientes */
void handleRaiz() { //responde a la url raiz "/"
servidorWeb.send(200, "text/html", "Bienvenido al servidor ESP32");
}
/* Lógica para manejar la temperatura máxima */
void handleTemperaturaMaxima() { //responde a la url "/temperatura-maxima"
if (servidorWeb.hasArg("temperatura")) {
String temperaturaStr = servidorWeb.arg("temperatura");
temperaturaMaxima = temperaturaStr.toFloat();
Serial.print("Temperatura máxima establecida: ");
Serial.println(temperaturaMaxima);
servidorWeb.send(200, "text/plain", "Temperatura máxima recibida: " + temperaturaStr);
} else { //en caso de que la respuesta sea incorrecta, manda un mensaje de error
servidorWeb.send(400, "text/plain", "Parámetro 'temperatura' no encontrado");
}
}
/* Lógica para activar el sistema */
void handleEncendido() { //responde a la url "/encendido"
sistemaEncendido = true;
digitalWrite(pinLedRojo, HIGH);
servidorWeb.send(200, "text/plain", "Sistema activado");
Serial.println("El sistema se ha encendido");
}
/* Lógica para desactivar el sistema */
void handleApagado() { //responde a la url "/apagado"
sistemaEncendido = false;
digitalWrite(pinLedRojo, LOW);
servidorWeb.send(200, "text/plain", "Sistema desactivado");
Serial.println("El sistema se ha apagado");
}
/* responde a la urls de paginas no disponibles */
void handleNotFound()
{
servidorWeb.send(404, "text/html", "not found");
Serial.println("Error en la recepción de datos...");
}
/* Enciende la caldera */
void encenderCaldera() {
digitalWrite(pinRele, LOW);
digitalWrite(pinLedVerde, HIGH);
Serial.println("Se ha encendido la caldera");
}
/* Apaga la caldera */
void apagarCaldera() {
digitalWrite(pinRele, HIGH);
digitalWrite(pinLedVerde, LOW);
Serial.println("Se ha apagado la caldera");
}