Actividad 1: Funcionamiento del Sistema de Riego


Actividad 1: 


Funcionamiento del ESP32

Con el ESP32 inicializado, el software comienza a realizar las funciones principales que hará en bucle.

A continuación, te desglosamos cada una de las tareas que se encargará de ejecutar esta parte del código:

Esperar a cliente: Recuerda que el cliente es el usuario que entra en el servidor web. Para detectar que
ha entrado un cliente, se utiliza el siguiente código:

        WiFiClient client = server.available();

Detección de cliente: Una vez se ha detectado el cliente ( if (client) { ) se indica por Monitor Serial que ha
entrado un nuevo cliente:

        Serial.println("New Client.");
        String currentLine = "";
Bucle de conexión: El código se mantiene en un bucle mientras el cliente esté conectado:

           while (client.connected()) {
           }

A continuación, se crean variables para leer las peticiones del cliente:


       char c = client.read();
       Serial.write(c);
       header += c;

 

 

Si el byte es un carácter de salto de línea, indicado        con  if (c == '\n') {; y la nueva línea se encuentra vacía, indicado con  if (currentLine.length() == 0) {; se realizan las siguientes acciones:

Responder a la petición: Se responde a la petición con el código HTTP 200 Ok, lo que indica que el proceso
se ha realizado correctamente:

        client.println("HTTP/1.1 200 OK");
        client.println("Content-type:text/html");
        client.println("Connection: close");
        client.println();
Activar o desactivar relé: Dependiendo de si la petición viene por ruta /on o /off, se enciende o se apaga
el relé:

           if (header.indexOf("GET /on") >= 0) {

               Serial.println("GPIO on");
               digitalWrite(rele, HIGH);

                       
           } else if (header.indexOf("GET /off") >= 0) {

               Serial.println("GPIO off");
               digitalWrite(rele, LOW);

           }
Lectura de sensores: Se realiza la lectura de los diferentes sensores conectados, estos sensores son los
siguientes:

        int lecturaLluvia = map(analogRead(sensorLluvia), 0, 4095, 0, 100);
        int lecturaHumedadSuelo = map(analogRead(sensorHumedadSuelo), 04095, 0, 100);
        int lecturaLuz = map(analogRead(sensorLuz), 0, 4095, 0, 100);
        float lecturaTemperatura = sensorDHT.readHumidity();
        float lecturaHumedad = sensorDHT.readTemperature();
Transformación de lectura: Recuerda que estas lecturas se leen como números enteros y flotantes, y
para que se puedan mostrar en el servidor web, hay que pasarlo como cadenas String; para ello, se
cambian las lecturas a valores, aprovechando para indicar el sistema de medida utilizado:

        String titulo = "<h1>Servidor Web ESP32</h1>";
        String botonEncendido = "<p><a href='/on'><button style='height:
            50px;width:100px'>ON</button></a></p>";
        String botonApagado = "<p><a href='/off'><button style='height:
            50px;width:100px'>OFF</button></a></p>";
        String valoresSensorLluvia = "<p>Lluvia: " + String(lecturaLluvia)
            + "% | ";
        String valoresSensorLuz = "Luz: " + String(lecturaHumedadSuelo)
            + "% | ";
        String valoresSensorTemp = "Temperatura: " +
            String(lecturaTemperatura) + "ºC | ";
        String valoresSensorHum = "Humedad relativa: " +
            String(lecturaHumedad) + "% | ";
        String valoresSensorHumSuelo = "Humedad del Suelo: " +
            String(lecturaLuz) + "%</p>";
Construcción de la página web: A continuación, se añade en la string web toda la información que
mostrará la página web:

         String web = inicioPagina;
         web += titulo;
         web += botonEncendido;
         web += botonApagado;
         web += valoresSensorLluvia;
         web += valoresSensorLuz;
        web += valoresSensorTemp;
         web += valoresSensorHum;
         web += valoresSensorHumSuelo;
        web += finPagina;
Envío de interfaz: Con la web construida se envía la interfaz al cliente:

      client.println(web);
Fin de respuesta: Para terminar la respuesta HTTP, se utiliza un envío de interfaz en blanco:

              client.println();

Cerrar conexión: Con la interfaz enviada al cliente, se cierra la conexión. Para volver a recibir la
información de los sensores el cliente, tienes que volver a conectarte al servidor web:

         client.stop();
         Serial.println("Client disconnected.");
         Serial.println("");

 

 

A continuación, se muestra cómo queda la página web diseñada con este código:


                                     

                                     

                                    Puedes ver y/o descargar el código completo en el siguiente bloque desplegable:

                                    #include <WiFi.h>
                                    #include <DHT.h>

                                    // Creamos el Servidor Web en el puerto 80
                                    WiFiServer server(80);

                                    // Variables con las 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;

                                    // Creamos el sensor DHT
                                    DHT sensorDHT(17, DHT22);

                                    // Variable relativa con la salida del Relé
                                    const int rele = 4;

                                    // Vairables con los pines de los sensores de lluvia, humedad del suelo y luminosidad
                                    const int sensorLluvia = 32;
                                    const int sensorHumedadSuelo = 33;
                                    const int sensorLuz = 34;

                                    // Código HTML para la interfaz mostrada en la IP del Servidor Web
                                    String inicioPagina = "<!DOCTYPE html>"
                                        "<html>"
                                        "<head>"
                                        "<meta charset='utf-8' />"
                                        "<title>Sistema de Riego Inteligente</title>"
                                        "</head>"
                                        "<body>"
                                        "<center>";

                                    String finPagina = "</center></body></html>";


                                    // Inicialización del ESP32
                                    void setup() {

                                        // Inicializar monitor serial
                                        Serial.begin(115200);
                                        Serial.println("");

                                        // Definición e inicialización del relé de salida y sensores
                                        pinMode(sensorLluvia, INPUT);
                                        pinMode(sensorHumedadSuelo, INPUT);
                                        pinMode(sensorLuz, INPUT);
                                        pinMode(rele, OUTPUT);
                                        digitalWrite(rele, LOW);

                                        // Inicializar Sensor DHT
                                        sensorDHT.begin();

                                        // Inicio de la conexión WiFi con las credenciales
                                        WiFi.begin(ssid, password);

                                        // Intenta la conexión, si llega al timeout cancela
                                        while (WiFi.status() != WL_CONNECTED and contconexion <50) {
                                            ++contconexion;
                                            delay(500);
                                            Serial.print(".");
                                        }

                                        // Detectar si se pudo realizar la conexión al WiFi o no
                                        if (contconexion < 50) {
                                         
                                            // Mostrar IP obtenida en la conexión del WiFi
                                            Serial.println("");
                                            Serial.println("WiFi conectado");
                                            Serial.println(WiFi.localIP());

                                            // Inicializamos el Servidor Web
                                            server.begin();

                                        } else {

                                            // No se pudo conectar a la red
                                            Serial.println("");
                                            Serial.println("Error de conexion");

                                        }

                                    }

                                    // Bucle principal de funcionamiento
                                    void loop(){

                                        // Esperamos conexiones entrantes en la IP del Servidor Web
                                        WiFiClient client = server.available();

                                        // Si detectamos un cliente conectado
                                        if (client) {

                                            Serial.println("New Client.");
                                            String currentLine = "";

                                            // Mantenemos en el bucle mientras el cliente esté conectado
                                            while (client.connected()) {

                                                // Comprobar si el cliente se encuentra disponible
                                                if (client.available()) {

                                                    // Preparar variables para leer petición del cliente
                                                    char c = client.read();
                                                    Serial.write(c);
                                                    header += c;

                                                    // Si el byte es un caracter de salto de línea
                                                    if (c == '\n') {

                                                        // Y la nueva línea está vacía, es el fin de la petición
                                                        if (currentLine.length() == 0) {

                                                            // Respondemos a la petición con código HTTP 200 OK
                                                            client.println("HTTP/1.1 200 OK");
                                                            client.println("Content-type:text/html");
                                                            client.println("Connection: close");
                                                            client.println();
                                               
                                                            // Si la petición viene por ruta /on, encendemos el Relé
                                                            if (header.indexOf("GET /on") >= 0) {

                                                                Serial.println("GPIO on");
                                                                digitalWrite(rele, HIGH);

                                                            // Si la petición viene por ruta /off, apagamos el Relé
                                                            } else if (header.indexOf("GET /off") >= 0) {

                                                                Serial.println("GPIO off");
                                                                digitalWrite(rele, LOW);

                                                            }

                                                            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();

                                                            String titulo = "<h1>Sistema de Riego Inteligente con ESP32</h1>";
                                                            String botonEncendido = "<p><a href='/on'><button style='height:50px;width:100px'>ON</button></a></p>";
                                                            String botonApagado = "<p><a href='/off'><button style='height:50px;width:100px'>OFF</button></a></p>";
                                                            String valoresSensorLluvia = "<p>Lluvia: " + String(lecturaLluvia) + "% | ";
                                                            String valoresSensorLuz = "Luz: " + String(lecturaLuz) + "% | ";
                                                            String valoresSensorTemp = "Temperatura: " + String(lecturaTemperatura) + "ºC | ";
                                                            String valoresSensorHum = "Humedad relativa: " + String(lecturaHumedad) + "% | ";
                                                            String valoresSensorHumSuelo = "Humedad del Suelo: " + String(lecturaHumedadSuelo) + "%</p>";

                                                            String web = inicioPagina;
                                                            web += titulo;
                                                            web += botonEncendido;
                                                            web += botonApagado;
                                                            web += valoresSensorLluvia;
                                                            web += valoresSensorLuz;
                                                            web += valoresSensorTemp;
                                                            web += valoresSensorHum;
                                                            web += valoresSensorHumSuelo;
                                                            web += finPagina;

                                                            // Envía la interfaz Web
                                                            client.println(web);

                                                            // Terminamos la respuesta HTTP con una línea en blanco
                                                            client.println();

                                                            // Terminamos el bucle
                                                            break;

                                                        // Limpiamos la línea actual
                                                        } else {

                                                            currentLine = "";

                                                        }

                                                    // Cuando llega un retorno de carro, agregamos a la línea actual
                                                    } else if (c != '\r') {

                                                        currentLine += c;

                                                    }

                                                }

                                            }

                                            // Limpiamos la variable header
                                            header = "";

                                            // Cerramos la conexión con el cliente
                                            client.stop();
                                            Serial.println("Client disconnected.");
                                            Serial.println("");

                                        }

                                    }



                                    Pincha en el siguiente icono para descargar este código:


                                    Vistas
                                    1 Número de vistas
                                    1 Vistas de miembros
                                    0 Vistas públicas
                                    Acciones
                                    0 Gustos
                                    0 No me gusta
                                    0 Comentarios
                                    Compartir en redes sociales
                                    Compartir enlace
                                    Compartir por correo

                                    Por favor iniciar sesión para compartir esto webpage por correo.