/**
* WiFi.ino - Servidor Web ESP32 con diseño atractivo en tonos azules.
*
* Se crea una interfaz web con estilo CSS moderno para controlar un relé
* y visualizar datos de sensores (lluvia, humedad del suelo, luz, temperatura y humedad).
*/
#include <WiFi.h>
#include <DHT.h>
// Creamos el Servidor Web en el puerto 80
WiFiServer server(80);
// Credenciales del WiFi
const char* ssid = "NOMBREDEMIWIFI";
const char* password = "CLAVEDEMIWIFI";
// Variable para gestionar el timeout de conexión a la red WiFi
int contconexion = 0;
// Variable para guardar la petición HTTP
String header;
// Configuración del sensor DHT (pin 17, modelo DHT22)
DHT sensorDHT(17, DHT22);
// Pin del relé
const int rele = 4;
// Pines de los sensores analógicos
const int sensorLluvia = 32;
const int sensorHumedadSuelo = 33;
const int sensorLuz = 34;
// Función que genera la página web con diseño en tonos azules
String crearPaginaWeb(int lecturaLluvia, int lecturaHumedadSuelo, int lecturaLuz, float lecturaTemperatura, float lecturaHumedad) {
//si tienes la imagen en un servidor url, utilizarías esto:
String favicon = "https://digitalcodesign.com/web/image/6195-c7408ed5/Recurso 11.svg";
String pagina = "<!DOCTYPE html>"
"<html>"
"<head>"
"<meta charset='utf-8'>"
"<meta name='viewport' content='width=device-width, initial-scale=1.0'>"
//agregamos la imagen a la pestaña de la web
//recuerda cambiar el formato, según si es svg, png...
"<link rel=\"icon\" type=\"image/svg+xml\" href=\"" + favicon + "\">"
//"<link rel=\"icon\" type=\"image/png\" href=\"" + favicon + "\">";
"<title>Sistema de Riego Inteligente</title>"
"<style>"
"body {"
"font-family: Arial, sans-serif;"
"text-align: center;"
"background: linear-gradient(to right, #0f4c75, #01FF8C);"
"color: white;"
"margin: 0;"
"padding: 0;"
"}"
".container {"
"margin-top: 50px;"
"}"
".card {"
"background: rgba(255, 255, 255, 0.2);"
"padding: 20px;"
"border-radius: 10px;"
"box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);"
"display: inline-block;"
"}"
".button {"
"display: inline-block;"
"margin: 10px;"
"padding: 10px 20px;"
"font-size: 18px;"
"color: white;"
"background: #1b262c;"
"border: none;"
"border-radius: 5px;"
"cursor: pointer;"
"transition: 0.3s;"
"text-decoration: none;"
"}"
".button:hover {"
"background: #bbd4ef;"
"color: #1b262c;"
"}"
"</style>"
"</head>"
"<body>"
"<div class='container'>"
"<h1>Sistema de Riego Inteligente con ESP32</h1>"
"<div class='card'>"
"<p><strong>Lluvia:</strong> " + String(lecturaLluvia) + "% | "
"<strong>Luz:</strong> " + String(lecturaLuz) + "% | "
"<strong>Temperatura:</strong> " + String(lecturaTemperatura) + "ºC</p>"
"<p><strong>Humedad:</strong> " + String(lecturaHumedad) + "% | "
"<strong>Humedad del Suelo:</strong> " + String(lecturaHumedadSuelo) + "%</p>"
"</div>"
"<br>"
"<a href='/on' class='button'>Encender</a>"
"<a href='/off' class='button'>Apagar</a>"
"</div>"
"</body>"
"</html>";
return pagina;
}
void setup() {
// Inicializar monitor serial
Serial.begin(115200);
Serial.println("");
// Inicialización de pines: sensores y relé
pinMode(sensorLluvia, INPUT);
pinMode(sensorHumedadSuelo, INPUT);
pinMode(sensorLuz, INPUT);
pinMode(rele, OUTPUT);
digitalWrite(rele, LOW);
// Inicializar Sensor DHT
sensorDHT.begin();
// Conectar a WiFi
WiFi.begin(ssid, password);
Serial.print("Conectando a WiFi");
while (WiFi.status() != WL_CONNECTED && contconexion < 50) {
contconexion++;
delay(500);
Serial.print(".");
}
if (WiFi.status() == WL_CONNECTED) {
Serial.println("");
Serial.println("WiFi conectado");
Serial.println("IP: " + WiFi.localIP().toString());
server.begin();
} else {
Serial.println("");
Serial.println("Error de conexión al WiFi");
}
}
void loop() {
// Espera a que un cliente se conecte
WiFiClient client = server.available();
if (client) {
Serial.println("Nuevo Cliente.");
String currentLine = "";
while (client.connected()) {
if (client.available()) {
char c = client.read();
Serial.write(c);
header += c;
if (c == '\n') {
if (currentLine.length() == 0) {
// Enviar encabezado HTTP de respuesta
client.println("HTTP/1.1 200 OK");
client.println("Content-type:text/html");
client.println("Connection: close");
client.println();
// Control del relé mediante la URL
if (header.indexOf("GET /on") >= 0) {
Serial.println("Relé Encendido");
digitalWrite(rele, HIGH);
} else if (header.indexOf("GET /off") >= 0) {
Serial.println("Relé Apagado");
digitalWrite(rele, LOW);
}
// Leer los valores de los sensores
int lecturaLluvia = map(analogRead(sensorLluvia), 0, 4095, 100, 0);
int lecturaHumedadSuelo = map(analogRead(sensorHumedadSuelo), 0, 4095, 100, 0);
int lecturaLuz = map(analogRead(sensorLuz), 0, 4095, 100, 0);
float lecturaTemperatura = sensorDHT.readTemperature();
float lecturaHumedad = sensorDHT.readHumidity();
// Generar y enviar la página web con diseño integrado
String paginaWeb = crearPaginaWeb(lecturaLluvia, lecturaHumedadSuelo, lecturaLuz, lecturaTemperatura, lecturaHumedad);
client.println(paginaWeb);
client.println();
break;
} else {
currentLine = "";
}
} else if (c != '\r') {
currentLine += c;
}
}
}
// Limpiar la variable header y cerrar la conexión
header = "";
client.stop();
Serial.println("Cliente desconectado.");
Serial.println("");
}
}