Sensor C02 com display lcd e dht11

Tempo de leitura: 5 minutes

Cliente Bluetooth Ble com Esp32

  • Vamos modificar o exemplo do Sensor C02.
  • Adicionaremos um LCD 1602 e um DHT11 ao sensor MGS881 para C02 e VOCs.
  • Vamos modificar o programa para incluir as novas leituras

 

Material Necessário

  • Esp32 (Genérico)
  • Sensor CCSD881
  • display LCD 1602
  • Sensor DHT11

 

Sensor C02 com display LCD

Na última sessão fizemos os primeiros passos com o sensor de CO2 chamado CCS811 e vimos como ele estava conectado, além de usar o exemplo incluído na biblioteca Adafruit para lê-lo.

Se você não leu, recomendo que comece a partir daí, antes de passar para este tutorial.

Nesta sessão vamos expandir um pouco mais o projeto para que todos aqueles alunos ansiosos por medir gases possam apresentar um projeto sensato. Para isso vamos incluir um display LCD tipo 16×02 para mostrar diretamente os resultados das leituras sem a necessidade de ter o computador em mãos e um sensor típico de temperatura e umidade, o DHT11.

Como sempre, a ideia desse tipo de tutorial é que eles possam servir de modelo para fazer seus próprios projetos, já que no final, modificar esse leitor de CO2 para qualquer outro sensor de gás será bem fácil, embora eu não aceite alega se centenas aparecem na Internet de projetos que lêem os gases mais incomuns com qualquer um dos muitos sensores disponíveis atualmente.

Além disso, como este projeto foi proposto um NodeMCU, este tutorial é simplesmente para limpar a ideia básica e acredito que possa ser de interesse para outros centros, já que medir CO2 tornou-se um favorito ultimamente.

 

Conectando o NODEMCU (ESP32) ao CCS811 e ao LCD 16X02

Partindo das conexões do tutorial anterior, expandi-lo com um display LCD I2C é mais simples que o mecanismo de uma jarra, pois, compartilhando o barramento, basta conectar os fios do LCD nos mesmos pinos do sensor de CO2.

Há apenas uma questão que merece destaque. Se você observar o diagrama acima, verá que o pino de alimentação do monitor não está conectado ao pino de 3,3V do NodeMCU. Isso porque o display é de 5V e apesar de funcionar corretamente com sinais de 3,3V, o brilho que produz deixa muito a desejar. É por isso que escolhi conectá-lo ao pino Vin do NodeMCU para me salvar de incluir uma fonte de alimentação externa.

Claro, isso, por sua vez, tem seus próprios problemas possíveis. Se você se lembrar do pino Vin, ele entrega a tensão de entrada do alimentador para o circuito interno. Como sei que estou usando um cabo USB (A 5V) não tenho dúvidas de que o que tenho no Vin é exatamente o 5v que preciso. Mas, por favor, certifique-se de que este também é o seu caso. Porque se por qualquer motivo você estivesse usando uma fonte externa em, digamos, 9 ou 12v, usar o Vin queimaria rapidamente sua tela e provavelmente seu NodeMCU, então tenha um pouco de cabeça ok?

O manual recomenda conectar o pino WAKE ao GND para poder se comunicar com o sensor, mas no meu caso não foi necessário, então deixei aberto, mas algum leitor me disse que no caso dele era essencial, então se tudo falhar tente fazê-lo.

Agora temos que adicionar o sensor de temperatura e umidade DHT11:

Para usar o DHT11, podemos baixar uma biblioteca externa ou usar o gerenciador de bibliotecas para baixar diretamente a mais recente (se você não a tiver instalado), e você pode incluir usando:

Agora procuramos a Biblioteca do sensor DHT e apertamos o botão de instalação

 

Modificando o Programa para Incluir Display e DHT

Uma vez que as bibliotecas estejam instaladas, só precisamos modificar o programa de exemplo da biblioteca Adafruit e adicionar o display LCD. Vá em frente. Como iniciamos todos os programas? Com as bibliotecas precisas para lidar com nosso hardware, então:

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

O do sensor de CO2 foi incluído na sessão anterior e o do LCD deve ser integrado ao seu Arduino, assim como a biblioteca DHT para o sensor de temperatura e umidade. Agora precisamos criar uma instância do sensor de CO2 e o display, que tem 16 caracteres e duas linhas, e por padrão geralmente vem no endereço I2C em 0x27 (HEX), e outra instância do sensor dht11:

#define DHTPIN 2  // Que no Nodemcu é o D4
#define DHTTYPE DHT11    
Adafruit_CCS811 ccs;
DHT_Unified dht(DHTPIN, DHTTYPE);
LiquidCrystal_I2C lcd(0x27,16, 2);  // Endereço LCD = 0x27 e 16 caracteres x 2 linhas

Vamos com a configuração, que não tem nada de especial:

void setup()
{   Serial.begin(115200);
    if(!ccs.begin())
    { 
        Serial.println("Falha ao iniciar o sensor! Por favor, verifique sua ligação.");
        while(1);
    }

Nestas primeiras linhas tentamos iniciar o sensor e se ele falhar, impedimos que o resto do programa continue, usando o while(1) que é como dizer “Ad eternum”. Se o resultado estiver correto continuamos e esperamos até que o sensor esteja disponível:

while(!ccs.available()); 
 lcd.init();                      // inicialize o lcd
 lcd.backlight();

Se tudo estiver correto, podemos iniciar a exibição e ligar a luz de fundo. No loop vamos verificar se o sensor ainda está disponível e vamos enviar os valores para a porta serial, sem tocar no exemplo original, baseado em println(), mas vamos definir uma nova função para imprimir os valores no LCD (Para não adicionar muitas linhas ao loop)

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 com a função que imprime valores no display LCD. Não há grande mistério. Basta posicionar o cursor onde deseja escrever e pronto (mas lembre-se que o primeiro parâmetro é a posição na linha e o segundo é a linha: 0 e 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("    ");

Agora temos que adicionar as informações de temperatura e umidade fornecidas pelo sensor DHT11 e para isso:

sensors_event_t event;
dht.temperature().getEvent(&event);
lcd.setCursor(11,0);
lcd.print(event.temperature, 1);  // com um único decimal
lcd.print("C");

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

E isso e tudo. O resultado é algo assim:

Você pode baixar o programa completo aqui:

Programa: CCS811_com_LCD_DHT11