Contenido del curso

Proyecto Final 5

 

Graficador de Temperatura en la OLED

Imagina que eres parte del equipo de innovación en una empresa agrícola, y esta se especializa en el desarrollo de tecnologías para mejorar la producción y el monitoreo de cultivos. La empresa está implementando un nuevo sistema de monitoreo ambiental que permitirá a los agricultores conocer en tiempo real las condiciones de temperatura de sus invernaderos.

Tu tarea es programar el MentorBit para que lea la temperatura del invernadero, y la grafique en tiempo real en una pantalla OLED, proporcionando datos útiles para optimizar el crecimiento de las plantas.

Para ello, puedes utilizar el sensor DS18B20, que medirá la temperatura dentro del invernadero cada minuto. La temperatura medida se mostrará en la pantalla OLED, donde aparecerá tanto el valor numérico de la temperatura (en grados Celsius), como un gráfico que represente el cambio de temperatura a lo largo del tiempo.

Cada vez que se registre una nueva lectura de temperatura, el gráfico se actualizará automáticamente, mostrando el historial de temperaturas de los últimos minutos, lo cual es esencial para tomar decisiones sobre el riego y la ventilación.

Además, el LED Verde parpadeará cuando la temperatura esté dentro del rango óptimo para las plantas (por ejemplo, entre 20ºC y 25ºC). Por otro lado, el LED Rojo se encenderá y el zumbador emitirá un sonido si la temperatura está fuera de este rango, alertando sobre condiciones que podrían afectar negativamente el crecimiento de las plantas.

Para ello vamos a utilizar los siguientes componentes del MentorBit:

  • Pantalla OLED

  • Display 7 Segmentos

  • 2 LEDs y zumbador

  • Sensor de temperatura

Actualmente, no se pueden realizar gráficas en mblock; así que te recomendamos realizar
este proyecto con C++.
#include <MentorBit.h>
#include <MentorBitSensores.h>
#include <MentorBitDisplay.h>
#include <MentorBitPantallas.h>

// Creamos los objetos necesarios
MentorBit miMentorBit;
MentorBitSensores miSensor;
MentorBitDisplay miDisplay;
MentorBitPantallas miPantalla;

// Variable para almacenar las mediciones de temperatura
float medidas[100];

// Variable para llevar el índice de la medida actual
int medida_actual = 10;

// Inicialización del código
void setup() {
    // Inicializamos la pantalla OLED
    miPantalla.inicializarOLED();
    miPantalla.oled.setTextSize(1);
    miPantalla.oled.setTextColor(SSD1306_WHITE);

    // Inicializamos el Display de 7 segmentos
    miDisplay.inicializarDisplay();

    // Configuramos el estado por defecto de los LEDs y el Zumbador
    digitalWrite(miMentorBit.LED_ROJO, LOW);
    digitalWrite(miMentorBit.LED_VERDE, LOW);
    noTone(miMentorBit.ZUMBADOR);
}

// Bucle principal de funcionamiento
void loop() {
    // Tomamos la medida del Sensor DS18B20
    float temperatura = miSensor.obtenerLecturaDS18B20();
    
    // Mostramos la temperatura en el Display 7 segmentos
    miDisplay.imprimir(temperatura);
    
    // Comprobamos si hemos alcanzado el límite de las 100 medidas
    if(medida_actual == 99) {
        // Desplazamos las mediciones 1 posición y guardamos la última medida
        for(int i = 0; i < 99; i++) {
            medidas[i] = medidas[i + 1];
        }
    } else {
        // Aumentamos el índice de la medida actual
        medida_actual++;
    }
    
    // Guardamos la nueva lectura de temperatura en el array de medidas
    medidas[medida_actual] = temperatura;

    // Limpiamos la pantalla OLED
    miPantalla.oled.clearDisplay();

    // Mostramos los ejes de la gráfica en la pantalla OLED
    // Eje X
    miPantalla.oled.drawLine(155411854, SSD1306_WHITE);
    miPantalla.oled.setCursor(9856);
    miPantalla.oled.print("t(s)");
    
    // Eje Y
    miPantalla.oled.drawLine(15101554, SSD1306_WHITE);
    miPantalla.oled.setCursor(20);
    miPantalla.oled.print("T(C)");

    // Imprimimos valores de la escala en el eje Y
    miPantalla.oled.setCursor(015); // Escala superior
    miPantalla.oled.print("35");
    miPantalla.oled.setCursor(050); // Escala inferior
    miPantalla.oled.print("20");

    // Mostramos los datos de las mediciones a lo largo del tiempo
    for(int i = medida_actual - 1 ; i >= 0 ; i--) {
        // Calculamos la coordenada X de cada medida
        int x = 20 + (medida_actual - 1 - i);
        // Calculamos la coordenada Y de la medida adaptada al rango de la gráfica
        int y = map(medidas[i], 20355410);
        miPantalla.oled.drawPixel(x, y, SSD1306_WHITE);
    }

    // Lógica para controlar los LEDs y el zumbador
    if (temperatura >= 20 && temperatura <= 26) {
        // Si la temperatura está dentro del rango óptimo, parpadeamos el LED verde
        digitalWrite(miMentorBit.LED_VERDE, HIGH); // Encendemos el LED verde
        delay(500);
        digitalWrite(miMentorBit.LED_VERDE, LOW);  // Apagamos el LED verde
        delay(500);
    } else {
        // Si la temperatura está fuera del rango óptimo, encendemos el LED rojo y el zumbador
        digitalWrite(miMentorBit.LED_ROJO, HIGH);  // Encendemos el LED rojo
        tone(miMentorBit.ZUMBADOR1000);          // Emitimos un sonido con el zumbador
    }

    // Actualizamos la pantalla OLED con los cambios
    miPantalla.oled.display();

    // Esperamos 1 segundo antes de continuar con la siguiente lectura
    delay(1000);

    // Apagar el LED rojo y el zumbador después de la alerta
    digitalWrite(miMentorBit.LED_ROJO, LOW);
    noTone(miMentorBit.ZUMBADOR);
}

Vistas
20 Número de vistas
20 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.