Contenido del curso

Actividad 30

 

Monitoreo Inteligente para tu Invernadero

Imagina que tienes un pequeño invernadero en casa donde cultivas tus propias plantas y vegetales. Para que tus plantas crezcan sanas, es fundamental mantener las condiciones de temperatura y luz adecuadas. Sin embargo, debido a tus ocupaciones diarias, no siempre puedes estar atento a esos factores clave.

Tu reto es diseñar un sistema de monitoreo con MentorBit que te ayude a llevar el registro de la temperatura y la luminosidad dentro del invernadero, permitiéndote tomar decisiones basadas en los datos que recojas.

Para lograr esto, utilizarás el sensor DS18B20 para medir la temperatura y la LDR para monitorear los niveles de luz. Estos valores se mostrarán en la pantalla LCD, y además podrás ajustar un umbral de temperatura con un potenciómetro para que, si se supera ese límite, un zumbador te alerte.

Además, el sistema deberá registrar las lecturas, realizadas cada 10 segundos, de temperatura y luminosidad en la tarjeta micro SD, utilizando un archivo que puedes llamar como quieras, usando el RTC para guardar la hora exacta de cada medición. De esta manera, cuando revises los datos en tu ordenador, sabrás exactamente cómo han variado las condiciones a lo largo del tiempo.

Unos LEDs indicarán visualmente si las condiciones del invernadero son las ideales o si necesitas hacer algún ajuste (el LED Rojo indicará que la temperatura está por encima del umbral, el LED Verde que el valor está correcto, y el LED Azul indicará si es de noche, encendido, o de día, apagado). También tendrás unos pulsadores para cambiar entre diferentes pantallas de información (una pantalla que muestre la temperatura actual, otra con la luminosidad y una tercera que muestre el umbral seleccionado con el potenciómetro) del sistema.





Puedes descargar la solución pinchando en el siguiente icono:


#include <MentorBit.h>
#include <MentorBitSensores.h>
#include <MentorBitPantallas.h>
#include <MentorBitDataLogger.h>

// Declaración de instancia de las clases
MentorBit miMentorBit;
MentorBitSensores misSensores;
MentorBitPantallas miPantalla;
MentorBitDataLogger miDataLogger;

// Variable para guardar el umbral de temperatura para la alarma
float temperatura_maxima = 0;

// Variable para guardar la información que debemos mostrar por la pantalla LCD
int pantalla_a_mostrar = 0;

// Variable para llevar la cuenta del tiempo entre registros guardados
unsigned long ultimo_guardado = 0;

// Variable con el nombre del Archivo que vamos a emplear
String archivo = "Registro.txt";

// Inicialización del sketch
void setup() {
    // Inicializamos y configuramos la Pantalla LCD
    miPantalla.inicializarLCD();
    miPantalla.lcd.backlight();
    // Mostramos un mensaje inicial por la LCD
    miPantalla.lcd.setCursor(2, 0);
    miPantalla.lcd.print("Monitoreo de");
    miPantalla.lcd.setCursor(2, 1);
    miPantalla.lcd.print("Invernadero");

    // Inicalizamos el RTC
    miDataLogger.inicializarRTC();
    // Configuramos el RTC con la fecha y la hora del PC
    miDataLogger.ajustarHoraRTC();
    // Comprobamos que la Tarjeta Micro SD se inicialice correctamente
    if(!miDataLogger.inicializarSD()) {
        // Mostramos un mensaje por Pantalla LCD indicando un error con la SD
        miPantalla.lcd.clear();
        miPantalla.lcd.setCursor(0, 0);
        miPantalla.lcd.print("Problema con la");
        miPantalla.lcd.setCursor(0, 1);
        miPantalla.lcd.print("Micro SD");
        while(true) {} // Código bloqueante para no avanzar sin Tarjeta Micro SD
    }
    // Guardamos un primer mensaje distintivo al comienzo de la cuenta
    miDataLogger.escribirEnArchivo(archivo, "---- Registro de aperturas ----");

    // Configuramos el estado por defecto de los LEDs
    digitalWrite(miMentorBit.LED_ROJO, LOW);
    digitalWrite(miMentorBit.LED_VERDE, LOW);
    digitalWrite(miMentorBit.LED_AZUL, LOW);

    // Esperamos un poco antes de empezar
    delay(2000);

    // Limpiamos la pantalla antes de empezar
    miPantalla.lcd.clear();

}

// Bucle principal del sketch
void loop() {

    // Tomamos la lectura de Luminosidad de la LDR
    int luminosidad = misSensores.obtenerLecturaLDR();
    // Convertimos a porcentaje la luminosidad para mostrarla luego si hace falta
    float luminosidad_porcentual = map(luminosidad, 0, 1023, 0, 100);
    // Comprobamos que la luminosidad sea adecuada para el día (500, por ejemplo)
    if(luminosidad > 500) {

        // Apagamos el LED Azul
        digitalWrite(miMentorBit.LED_AZUL, LOW);

    } else {

        // Encendemos el LED Azul
        digitalWrite(miMentorBit.LED_AZUL, HIGH);

    }

    // Tomamos la lectura del potenciómetro (que va de 0 a 1023)
    int lectura_potenciometro = miMentorBit.obtenerLecturaPotenciometro();
    // Guardamos la lectura convertida a un rango de temperaturas válido (por ejemplo de 0 a 50 ºC)
    temperatura_maxima = map(lectura_potenciometro, 0, 1023, 0, 50);
    // Tomamos la lectura de Temperatura del DS18B20
    float temperatura = misSensores.obtenerLecturaDS18B20();
    // Comprobamos que la temperatura supere el umbral
    if(temperatura >= temperatura_maxima) {

        // Activamos el LED Rojo y generamos un tono
        digitalWrite(miMentorBit.LED_ROJO, HIGH);
        digitalWrite(miMentorBit.LED_VERDE, LOW);
        tone(miMentorBit.ZUMBADOR, 3000, 100);

    // Comprobamos que la temperatura esté por debajo del umbral
    } else if(temperatura < temperatura_maxima) {

        // Activamos el LED Verde
        digitalWrite(miMentorBit.LED_ROJO, LOW);
        digitalWrite(miMentorBit.LED_VERDE, HIGH);

    }

    // Comprobamos que debemos mostrar por pantalla la Luminosidad
    if(pantalla_a_mostrar == 0) {

        miPantalla.lcd.clear();
        // Mostramos por pantalla la luminosidad en porcentaje
        // porque es más presentable
        miPantalla.lcd.setCursor(0, 0);
        miPantalla.lcd.print("Luminosidad:");
        miPantalla.lcd.setCursor(6, 1);
        miPantalla.lcd.print(luminosidad_porcentual);
        miPantalla.lcd.setCursor(10, 1);
        miPantalla.lcd.print("%");

    }

    // Comprobamos que debemos mostrar por pantalla la Temperatura
    if(pantalla_a_mostrar == 1) {

        miPantalla.lcd.clear();
        // Mostramos por pantalla la temperatura en ºC
        miPantalla.lcd.setCursor(0, 0);
        miPantalla.lcd.print("Temperatura:");
        miPantalla.lcd.setCursor(6, 1);
        miPantalla.lcd.print(temperatura);
        miPantalla.lcd.setCursor(10, 1);
        miPantalla.lcd.print("C");

    }

    // Comprobamos que debemos mostrar por pantalla el Umbral
    if(pantalla_a_mostrar == 2) {

        miPantalla.lcd.clear();
        // Mostramos por pantalla el umbral de temperatura en ºC
        miPantalla.lcd.setCursor(0, 0);
        miPantalla.lcd.print("Umbral Temp.:");
        miPantalla.lcd.setCursor(6, 1);
        miPantalla.lcd.print(temperatura_maxima);
        miPantalla.lcd.setCursor(10, 1);
        miPantalla.lcd.print("C");

    }

    // Comprobamos que se accione el pulsador de avance en las pantallas
    if(digitalRead(miMentorBit.PULSADOR_PULLDOWN_ANALOGICO) == HIGH) {

        // Esperamos que termine de accionarse el pulsador
        while(digitalRead(miMentorBit.PULSADOR_PULLDOWN_ANALOGICO) == LOW) {}
        pantalla_a_mostrar++; // Aumentamos en 1 la pantalla a mostrar
        // Comprobamos que no supere el valor máximo
        if(pantalla_a_mostrar >=3) {
            pantalla_a_mostrar = 0; // Reiniciamos el valor del contador
        }

    }

    // Comprobamos que se accione el pulsador de retroceso en las pantallas
    if(digitalRead(miMentorBit.PULSADOR_PULLDOWN_DIGITAL) == HIGH) {

        // Esperamos que termine de accionarse el pulsador
        while(digitalRead(miMentorBit.PULSADOR_PULLDOWN_DIGITAL) == LOW) {}
        pantalla_a_mostrar--; // Disminuimos en 1 la pantalla a mostrar
        // Comprobamos que no supere el valor máximo
        if(pantalla_a_mostrar < 0) {
            pantalla_a_mostrar = 2; // Configuramos el valor a la última pantalla
        }

    }

    // Comprobamos que sea el momento de guardar un registro (cada 10 segundos)
    if((millis() - ultimo_guardado) >= 10000) {

        // Obtenemos la fecha y la hora actuales
        String fecha_hora_actual = miDataLogger.obtenerHoraRTC();
        // Convertmos la lecturas de los sensores a Strings con sus unidades
        String luminosidad_actual = String(luminosidad_porcentual) + "%";
        String temperatura_actual = String(temperatura) + "ºC";
        // Construimos un String que será el registro a guardar en la Micro SD
        String registro = fecha_hora_actual + " " + luminosidad_actual + " " + temperatura_actual;
        // Guardamos el registro en la Tarjeta Micro SD
        miDataLogger.escribirEnArchivo(archivo, registro);
        // Actualizamos el tiempo del último registro
        ultimo_guardado = millis();

    }

    // Esperamos un poco antes de continuar
    delay(250);

}

La solución sin utilizar nuestra librería no está disponible actualmente.
Vistas
8 Número de vistas
8 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.