#include <WiFi.h>
#include <WiFiClient.h>
#include <WebServer.h>
#include <DHT.h>
#include <LiquidCrystal_I2C.h>

// Configuración de la red WiFi
const char* ssid = "Wokwi-GUEST";
const char* password = "";

// Configuración del servidor web
WebServer server(80);

// Configuración del sensor DHT22
#define DHTPIN 15
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);

// Configuración del LCD I2C
LiquidCrystal_I2C lcd(0x27, 16, 2);

// Declaración de las variables de temperatura y humedad
float temperature = 0.0;
float humidity = 0.0;

// Manejador de la ruta /humidity
void handleHumidity() {
  // Lectura de la humedad del sensor DHT22
  humidity = dht.readHumidity();

  // Comprobar si la lectura del sensor fue exitosa
  if (isnan(humidity)) {
    Serial.println("Error al leer la humedad desde el sensor DHT22");
    server.send(500, "text/plain", "Error al leer la humedad desde el sensor DHT22");
    return;
  }

  // Creación del contenido de la página web de respuesta
  String html = "<html><head><title>ESP32 DHT22</title>";
  html += "<style> body { font-family: Arial, Helvetica, sans-serif; }";
  html += "h1 { text-align: center; }";
  html += "table { border-collapse: collapse; width: 50%; margin: 0 auto; }";
  html += "th, td { text-align: left; padding: 8px; }";
  html += "th { background-color: #4CAF50; color: white; }";
  html += "</style></head><body>";
  html += "<h1>Información del sensor DHT22</h1>";
  html += "<table><tr><th>Parámetro</th><th>Valor</th></tr>";
  html += "<tr><td>Temperatura</td><td>" + String(temperature) + "C</td></tr>";
  html += "<tr><td>Humedad</td><td>" + String(humidity) + "%</td></tr>";
  html += "</table>";
  html += "</body></html>";

  // Envío de la respuesta al cliente
  server.send(200, "text/html", html);
}

void setup() {
  // Inicialización del puerto serial
  Serial.begin(115200);

  // Inicialización del sensor DHT22
  dht.begin();

  // Inicialización del LCD
  lcd.init();
  lcd.backlight();

  // Conexión a la red WiFi
  Serial.println();
  Serial.print("Conectando a ");
  Serial.println(ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi conectado");
  Serial.println("Dirección IP: ");
  Serial.println(WiFi.localIP());

  // Manejadores de ruta del servidor web
server.on("/", [](){
  String html = "<html><head><title>ESP32 DHT22</title></head><body>";
  html += "<h1>ESP32 DHT22</h1>";
  html += "<ul>";
  html += "<li><a href=\"/temperature\">Temperatura</a></li>";
  html += "<li><a href=\"/humidity\">Humedad</a></li>";
  html += "</ul>";
  html += "</body></html>";
  server.send(200, "text/html", html);
});

server.on("/temperature", [](){
  // Lectura de la temperatura del sensor DHT22
  temperature = dht.readTemperature();

  // Comprobar si la lectura del sensor fue exitosa
  if (isnan(temperature)) {
    Serial.println("Error al leer la temperatura desde el sensor DHT22");
    server.send(500, "text/plain", "Error al leer la temperatura desde el sensor DHT22");
    return;
  }

  // Creación del contenido de la página web de respuesta
  String html = "<html><head><title>ESP32 DHT22</title>";
  html += "<style> body { font-family: Arial, Helvetica, sans-serif; }";
  html += "h1 { text-align: center; }";
  html += "table { border-collapse: collapse; width: 50%; margin: 0 auto; }";
  html += "th, td { text-align: left; padding: 8px; }";
  html += "th { background-color: #4CAF50; color: white; }";
  html += "</style></head><body>";
  html += "<h1>Información del sensor DHT22</h1>";
  html += "<table><tr><th>Parámetro</th><th>Valor</th></tr>";
  html += "<tr><td>Temperatura</td><td>" + String(temperature) + "C</td></tr>";
  html += "<tr><td>Humedad</td><td>" + String(humidity) + "%</td></tr>";
  html += "</table>";
  html += "</body></html>";

  // Envío de la respuesta al cliente
  server.send(200, "text/html", html);
});

server.on("/humidity", handleHumidity);

server.begin();
}

void loop() {
// Manejo de conexiones entrantes del servidor web
server.handleClient();

// Lectura de la temperatura del sensor DHT22
temperature = dht.readTemperature();

// Actualización del LCD con la temperatura y humedad
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("TEMP: ");
lcd.print(temperature);
lcd.print("C");
lcd.setCursor(0, 1);
lcd.print("HUM: ");
lcd.print(humidity);
lcd.print("%");

// Espera de 2 segundos para evitar lecturas demasiado frecuentes del sensor
delay(2000);
}