Monitoramento de CO₂: DIY com IoT para Ambientes Internos

Por que monitorar CO₂?

Em ambientes fechados, níveis elevados de dióxido de carbono (acima de 1000 ppm) reduzem a produtividade, causam sonolência e aumentam riscos de transmissão de doenças. Este projeto combina IoT e sensoriamento para criar um sistema acessível que alerta quando a ventilação é necessária, integrando funcionalidades avançadas como controle de HVAC, notificações via Telegram e análise preditiva.

📋 Índice🔗

Introdução e Relevância do Monitoramento🔗

A concentração de CO₂ em ambientes internos serve como indicador crítico da qualidade do ar. Níveis acima de 1000 ppm comprometem o desempenho cognitivo, causam fadiga e aumentam a propagação de patógenos. O ESP8266Sistema de automação residencial com ESP8266 e controle de luzesSistema de automação residencial com ESP8266 e controle de luzesEste tutorial aborda a implementação de automação residencial com ESP8266, destacando segurança, eficiência energética, integração MQTT e interface web., com sua conectividade Wi-Fi e baixo custo, permite a criação de sistemas IoT que integram sensoriamento, processamento local e transmissão de dados para plataformas cloud, oferecendo monitoramento contínuo e ações corretivas automatizadas.

🔧 Componentes Necessários🔗

ComponenteDescrição
ESP8266 (NodeMCU)Microcontrolador com Wi-Fi integrado para comunicação IoT
Sensor MH-Z19BSensor NDIR de CO₂ (faixa: 0-5000 ppm, precisão ±50 ppm + 3% do valor)
DHT22Sensor de temperatura e umidade (opcional para monitoramento ambiental)
Display OLED 0.96"Exibe dados locais (I²C)
Protoboard e jumpersConexões temporárias
Fonte 5VAlimentação estável para o sensor e ESP8266

🔍 Princípio de Funcionamento do Sensor NDIR🔗

O MH-Z19B usa espectroscopia de infravermelho não dispersivo (NDIR). Moléculas de CO₂ absorvem luz IR em 4.2 µm. Quanto maior a concentração, maior a absorção, seguindo a Lei de Beer-Lambert:

$$ C = \frac{-\ln\left(\frac{I}{I_0}\right)}{\sigma \cdot L} $$
  • C: Concentração de CO₂ (ppm)
  • I/I₀: Razão entre intensidade transmitida e incidente
  • σ: Coeficiente de absorção do CO₂
  • L: Caminho óptico (no MH-Z19B, 5 cm)

Tecnologias de Sensores:

🔌 Montagem do Circuito🔗

Diagrama de Conexões

graph LR A[ESP8266] -->|RX (GPIO3)| B[MH-Z19B TX] A -->|TX (GPIO1)| B[MH-Z19B RX] A -->|5V| B A -->|GND| B A -->|SDA (GPIO4)| C[Display OLED] A -->|SCL (GPIO5)| C

Passos Críticos:

1. Use resistoresJogo interativo com ESP8266, botões e LEDsJogo interativo com ESP8266, botões e LEDsAprenda a desenvolver um jogo interativo com ESP8266, botões e LEDs. Integre eletrônica, programação embarcada e web para criar soluções IoT inovadoras. de pull-up (10kΩ) no barramento I²C do display.

2. Alimente o sensor com 5V para evitar leituras instáveis.

3. Para sensores 5V (como o MH-Z19B), utilize conversores de nível lógico se o ESP8266Sistema de automação residencial com ESP8266 e controle de luzesSistema de automação residencial com ESP8266 e controle de luzesEste tutorial aborda a implementação de automação residencial com ESP8266, destacando segurança, eficiência energética, integração MQTT e interface web. operar em 3.3V.

💻 Programação do ESP8266🔗

Configuração Inicial

#include <SoftwareSerial.h>
#include <ESP8266WiFi.h>
#include <Adafruit_SSD1306.h>
// Configurações Wi-Fi
const char* ssid = "SUA_REDE";
const char* password = "SUA_SENHA";
SoftwareSerial co2Serial(3, 1); // RX (GPIO3), TX (GPIO1)
void setup() {
  co2Serial.begin(9600);
  Serial.begin(115200);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("\nWi-Fi Conectado! IP: " + WiFi.localIP().toString());
}

Leitura do Sensor MH-Z19B

byte cmd[9] = {0xFF, 0x01, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79};
byte response[9];
void readCO2() {
  co2Serial.write(cmd, 9);
  delay(100);
  if (co2Serial.available() >= 9) {
    co2Serial.readBytes(response, 9);
    int ppm = (response[2] << 8) | response[3];
    Serial.print("CO₂: "); Serial.print(ppm); Serial.println(" ppm");
    // Exemplo: Envio para ThingSpeak
    sendToCloud(ppm);
  }
}
void sendToCloud(int ppm) {
  WiFiClient client;
  String url = "/update?api_key=SUA_CHAVE&field1=" + String(ppm);
  client.connect("api.thingspeak.com", 80);
  client.print("GET " + url + " HTTP/1.1\r\nHost: api.thingspeak.com\r\n\r\n");
}

🎯 Calibração e Precisão🔗

1. Calibração Automática (ABC):

Desative-a em ambientes onde o CO₂ não atinja 400 ppm naturalmente:

byte disableABC[] = {0xFF,0x01,0x79,0x00,0x00,0x00,0x00,0x00,0x86};
co2Serial.write(disableABC, 9);

2. Calibração Manual:

Expõe o sensor ao ar livre por 20 minutos e envie:

byte calibCmd[] = {0xFF,0x01,0x87,0x00,0x00,0x00,0x00,0x00,0x78};
co2Serial.write(calibCmd, 9);

Dica: Valide as leituras com um sensor de referência a cada 6 meses para detectar drift.

📊 Visualização de Dados em Tempo Real🔗

Opção 1: Plataforma IoT (ThingSpeak)

void sendToCloud(int ppm) {
  // Código de envio HTTP (vide seção de programação)
}

Opção 2: Dashboard Local com Node-RED

1. Configure um broker MQTTSistema de controle de persianas automatizadas com ESP8266Sistema de controle de persianas automatizadas com ESP8266Descubra como automatizar persianas com ESP8266 em um guia prático, unindo eficiência energética, segurança e integração IoT para automação da sua casa. no ESP8266.

2. Crie um fluxo no Node-RED para plotar gráficos históricos e acionar alertas por e-mail acima de 1000 ppm.

Opção 3: Display OLED

Adafruit_SSD1306 display(128, 64, &Wire);
void showData(int ppm) {
  display.clearDisplay();
  display.setCursor(0,0);
  display.print("CO₂: "); display.print(ppm); display.println(" ppm");
  display.display();
}

🚀 Aplicações Avançadas🔗

Integração com HVAC

Controle exaustores via reléSistema de controle de bomba de água com ESP8266 para fontes decorativasSistema de controle de bomba de água com ESP8266 para fontes decorativasAprenda a automatizar bombas de água usando ESP8266, com isolamento seguro, controle PID e integração IoT via web, MQTT e API para automação residencial. quando CO₂ > 800 ppm:

#define RELAY_PIN D6
void controlVentilation(int ppm) {
  digitalWrite(RELAY_PIN, (ppm > 800) ? HIGH : LOW);
}

Notificações por Telegram

Use a biblioteca UniversalTelegramBot:

#include <UniversalTelegramBot.h>
TelegramBot bot("SEU_TOKEN");
void sendAlert(int ppm) {
  bot.sendMessage("CHAT_ID", "Alerta: CO₂ em " + String(ppm) + " ppm!");
}

Machine Learning no Edge

Preveja picos usando regressão linear:

float predictCO2(float temp, float humidity) {
  return 0.65 * temp + 0.2 * humidity + 400; // Coeficientes ajustáveis
}

🔧 Manutenção e Boas Práticas🔗

  • Posicionamento: Instale o sensor a 1,5 m do chão, longe de janelas e fontes de calor.
  • Limpeza: Use ar comprimido mensalmente para remover poeira do caminho óptico.
  • Atualizações: Monitore repositórios GitHub para otimizações de firmware.
  • Redundância: Em ambientes críticos (ex: hospitais), combine múltiplos sensores via rede LoRa para redundância.
Dica Pro: Em escolas/escritórios, utilize algoritmos de clustering para identificar zonas de risco com base em dados espaciais de CO₂.
Autor: Marcelo V. Souza - Engenheiro de Sistemas e Entusiasta em IoT e Desenvolvimento de Software, com foco em inovação tecnológica.

Referências🔗

Compartilhar artigo

Artigos Relacionados