bclose

Sensor C02 con display LCD y DHT11

Proyecto de medicion de CO2

Cliente Bluetooth BLE con ESP32

 

 

  • Modificaremos el ejemplo del Sensor de C02.
  • Añadiremos un LCD 1602 y un DHT11 al sensor MGS881 de C02 y VOCs.
  • Modificaremos el programa para incluir las nuevas lecturas
 

 

Material requerido.

 

 Tienda EspañaTienda Mexico
 Node MCU boardUn  NodeMCUUn  NodeMCU
 Imagen principalUn sensor CCSD881
 LCD 16x02Un display LCD 1602 Un display LCD 1602
 sensor humedad y temperaturaSensor DHT11 Sensor DHT11

 

Sensor de C02 con display LCD

 

En la última sesión hicimos los primeros pinitos con el sensor de CO2 llamado CCS811 y vimos cómo se conectaba, además de usar el ejemplo incluido con la librería de Adafruit para leerlo.

 
  • Si no lo has leído, te recomiendo que empieces desde ahí, antes de pasar a este  tuto.  

En esta sesión vamos ampliar un poco más el proyecto para que todos esos estudiantes ansiosos por medir gases, puedan presentar un proyecto sensato. Para ello vamos a incluir un display LCD de los de tipo 16×02 para mostrar directamente los resultados de las lecturas sin necesidad de tener el ordenador a mano y un sensor de temperatura y humedad típico, el DHT11.

Como siempre la idea de este tipo de tutoriales es que te puedan servir como plantilla para hacer tus propios proyectos, ya que al final modificar este lector de CO2 por cualquier otro sensor de gases será bastante fácil, aunque no acepto reclamaciones si aparecen por Internet cientos de proyectos que leen los gases más peregrinos con cualquiera de los múltiples sensores disponibles en estos momentos.

Además, como este proyecto me lo propusieron y definieron los amigos del IES Unamuno de Bilbao para un NodeMCU, este tutorial es simplemente pasar a limpio la idea básica y confío en que os pueda resultar de interés para otros centros, ya que lo de medir CO2 se ha convertido en un favorito de los escolares últimamente.

 

Conectando el NodeMCU al CCS811 y LCD 16×02

 

Partiendo de las conexiones del tuto previo ampliarlo con un display LCD I2C es más simple que el mecanismo de un botijo, ya que, al compartir bus, basta con conectar los hilos del LCD a los mismos pines que el sensor de CO2.

disgrama de concexion

Solo hay una cuestión que merece la pena destacar. Si observas el diagrama de más arriba veras que el pin de alimentación del display no está conectado al pin de 3,3V del NodeMCU. Esto es porque el display es de 5V y aunque funciona correctamente con señales de 3.3V, el brillo que produce deja mucho que desear. Motivo por el cual he elegido conectarlo al pin Vin del NodeMCU para ahorrarme incluir una fuente de alimentación externa.

Claro que esto a su vez tiene sus propios posibles problemas. Si recuerdas el pin Vin, entrega la tensión de entrada del alimentador al circuito interno. Como yo sé que estoy usando un cable USB ( A 5V) no tengo duda de que lo tengo en Vin es justo los 5v que necesito. Pero por favor asegúrate de que este es también tu caso. Porque si por cualquier razón estuvieras usando una fuente externa a digamos 9 o 12v, al usar el Vin quemarías rápidamente tu display y probablemente tu NodeMCU, así que ten un poco de cabeza ¿Vale?

 
  • El manual recomienda conectar el pin WAKE a GND para poder comunicarse con el sensor, pero en mi caso no ha sido necesario, por lo que lo he dejado al aire, pero algún lector me ha comentado que en su caso fue imprescindible así que si todo falla probad con hacerlo.  

Ahora nos toca añadir el sensor de temperatura y humedad DHT11:

diagrama de conexion

 

Para usar el DHT11 podemos descargar una librería externa, o bien usar el administrador de librerías para descargar directamente la última (En  el caso de que no la tengáis instalada), y que podéis incluir mediante:

ejemplo arduino

Ahora buscamos la librería DHT sensor Library y dale al botón de instalar

instalando dht

 

Modificando el programa para incluir el display y el DHT

 

Una vez instaladas las librerías, solo nos falta modificar el programa de ejemplo de la librería Adafruit y añadir el display LCD. Vamos a ello. ¿Cómo empezamos todos los programas? Con las librerías precisas para manejar nuestro hardware, así que:

#include "Adafruit_CCS811.h"
#include <LiquidCrystal_I2C.h>
#include <Adafruit_Sensor.h>
#include <DHT.h>
#include <DHT_U.h>

La del sensor de CO2 la incluimos en la sesión anterior y la del LCD debería venir integrada en tu Arduino, lo mismo que la librería DHT para el sensor de temperatura y humedad. Nos falta ahora, crear una instancia del sensor de COy la del display, que es de 16 caracteres y dos líneas, y por defecto suele venir en la dirección I2C en 0x27 (HEX), y otra instancia del sensor dht11:

#define DHTPIN 2  // Que en el Nodemcu es el D4
#define DHTTYPE DHT11    
Adafruit_CCS811 ccs;
DHT_Unified dht(DHTPIN, DHTTYPE);
LiquidCrystal_I2C lcd(0x27,16, 2);  // LCD address = 0x27, y 16 carcateres x 2 lineas

Vamos con el setup, que no tiene nada de especial:

void setup()
{   Serial.begin(115200);
    if(!ccs.begin())
      { Serial.println("Failed to start sensor! Please check your wiring.");
        while(1);
      }

En Estas primeras líneas  intentamos iniciar el sensor y si falla, impedimos que continúe al resto del programa, mediante el while (1) que es como decir “Ad eternum”. Si el resultado es correcto seguimos y esperamos hasta que el sensor esté disponible:

  while(!ccs.available()); 
  lcd.init();                      // initialize the lcd
  lcd.backlight();

Si todo es correcto podemos iniciar el display y encender la luz de fondo.  En el loop vamos a comprobar que el sensor sigue disponible y enviamos los valores a la puerta serie, sin tocar el ejemplo original, a base de println(), pero vamos a definir una nueva función para sacar la impresión de valores al LCD (Para no añadir muchas líneas al bucle)

void loop()
 {   if(ccs.available())
     {  if(!ccs.readData())
          {   Serial.print("CO2: ");
              Serial.print(ccs.geteCO2());
              Serial.print("ppm, TVOC: ");
              Serial.print(",");
              Serial.println(ccs.getTVOC());

               writeLCD();
           }
          else
             { Serial.println("ERROR!");
               while(1);
             }
     }
  delay(1000);
}

Vamos con la función que imprime valores al display LCD. No tiene gran misterio. Basta con posicionar el cursor donde deseamos escribir y listo (Pero recuerda que el primer parámetro es la posición en la línea y el segundo la línea: 0 y 1)

void writeLCD()
  { lcd.setCursor(0,0);   // pos, linea
    lcd.print("CO2: ");
    lcd.print(ccs.geteCO2());lcd.print("  ");
    lcd.setCursor(0,1);
    lcd.print("TVOC: ");
    lcd.print(ccs.getTVOC());lcd.print("    ");

Tenemos que añadirle ahora la información de temperatura y humedad que nos proporciona el sensor DHT11 y para ello:

    sensors_event_t event;
    dht.temperature().getEvent(&event);
    lcd.setCursor(11,0);
    lcd.print(event.temperature, 1);  // Con un solo decimal
    lcd.print("C");

    dht.humidity().getEvent(&event);
    lcd.setCursor(11,1);  
    lcd.print(event.relative_humidity,1);   
    lcd.println("%");

Y eso es todo. El resultado es algo así:

Display con CO2 temp y humedad

Podéis descargar desde  aquí el programa completo:

Contenido solo disponible para suscriptores. ¡Accede al contenido!

    

Aquí os dejo un mini vídeo con el proyecto completo