Arduino UNO R4 - Sensor de CO2 SCD40

Neste guia, vamos aprender como usar o sensor de CO2 SCD40 com o Arduino UNO R4 WiFi ou Minima para descobrir quanto dióxido de carbono há no ar ao redor da sua mesa. Uma sala cheia de gente se enche aos poucos de CO2, e níveis altos nos deixam cansados. Com este projeto você pode ver o número e saber quando abrir uma janela. Em detalhes, vamos aprender:

Arduino UNO R4 e módulo sensor de CO2 SCD40

Sobre o Sensor de CO2 SCD40

O SCD40 é um pequeno sensor da Sensirion (parte da família SCD4x). Muitos sensores baratos de "qualidade do ar" apenas adivinham o nível de CO2 a partir de outros gases. Por exemplo, o MQ2 do nosso tutorial Arduino UNO R4 - Sensor de Gás reage a muitos gases ao mesmo tempo. O SCD40 mede o próprio CO2, usando um método chamado NDIR fotoacústico: uma pequena luz infravermelha pulsa dentro do sensor, o CO2 absorve parte dessa luz e cria um "som" de pressão muito pequeno, e um microfone o capta. Mais CO2 dá um som mais forte.

SCD40
Tensão de alimentação 2.4V a 5.5V
Interface I2C, endereço 0x62
Faixa de saída 0 a 40,000 ppm
Precisão ±(50 ppm + 5% da leitura), de 400 a 2,000 ppm
Nova leitura a cada 5 segundos (a cada 30 segundos no modo de baixo consumo)
Precisão de temperatura ±0.8°C (15°C a 35°C)
Precisão de umidade ±6 %RH (15°C a 35°C, 20 a 65 %RH)
Corrente média cerca de 15 mA a 3.3V

O sensor tem Autocalibração Automática (ASC), e ela vem ligada por padrão. Ele espera ver ar fresco, com nível de ar livre (cerca de 400 ppm), pelo menos uma vez por semana, de preferência por uma hora ou mais. Uma sala que é arejada de vez em quando é suficiente. Além disso, as primeiras leituras depois de ligar podem ficar um pouco fora enquanto o sensor esquenta.

O que os números significam:

CO2 (ppm) Qualidade do ar
Cerca de 400 Ar fresco ao ar livre
400 - 1000 Bom ar em ambientes internos
1000 - 2000 Abafado, abra uma janela
Acima de 2000 Ruim, pode causar dor de cabeça ou sonolência
Pinagem do sensor de CO2 SCD40

O módulo SCD40 tem quatro pinos:

  • Pino VCC (pode estar identificado como VIN): conecte ao 5V ou 3.3V do Arduino UNO R4.
  • Pino GND: conecte ao GND (0V).
  • Pino SCL: clock I2C, conecte ao pino SCL do Arduino UNO R4.
  • Pino SDA: dados I2C, conecte ao pino SDA do Arduino UNO R4.

A maioria dos módulos SCD40 já tem resistores de pull-up do I2C na placa, então não é preciso adicioná-los por conta própria.

Diagrama de Ligação

O Arduino UNO R4 tem seu barramento I2C principal em A4 (SDA) e A5 (SCL). Os mesmos dois sinais também saem nos pinos SDA e SCL do conector perto do pino AREF, então você pode usar qualquer um dos lugares.

Diagrama de ligação do Arduino UNO R4 com o sensor de CO2 SCD40

This image is created using Fritzing. Click to enlarge image

Veja A melhor forma de alimentar o Arduino Uno R4 e outros componentes.

Módulo SCD40 Arduino UNO R4
VCC 5V
GND GND
SCL SCL (A5)
SDA SDA (A4)

※ Nota:

O conector Qwiic do Arduino UNO R4 WiFi é um barramento I2C diferente (Wire1) e trabalha com 3.3V. Este guia usa os pinos normais e Wire, então funciona do mesmo jeito no WiFi e no Minima.

Como Programar o Sensor SCD40

  • Inclua as bibliotecas.
#include <SensirionI2cScd4x.h> #include <Wire.h>
  • Crie um objeto do sensor SCD40.
SensirionI2cScd4x scd4x;
  • Inicie o barramento I2C e conecte o sensor no endereço 0x62:
Wire.begin(); scd4x.begin(Wire, SCD40_I2C_ADDR_62);
  • Inicie a medição periódica:
scd4x.startPeriodicMeasurement();
  • Verifique se uma nova leitura está pronta e depois leia:
bool dataReady = false; scd4x.getDataReadyStatus(dataReady); if (dataReady) { scd4x.readMeasurement(co2, temperature, humidity); }

Toda função da biblioteca retorna um código de erro. Quando ele não é 0, errorToString() o transforma em um texto legível, e o código o imprime no Serial Monitor.

Código Arduino UNO R4 - CO2 do SCD40

/* * Este código de Arduino UNO R4 foi desenvolvido por pt.newbiely.com * Este código de Arduino UNO R4 é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.newbiely.com/tutorials/arduino-uno-r4/arduino-uno-r4-scd40-co2-sensor */ // Arduino UNO R4 + SCD40: read the CO2 level in ppm // Wiring: SDA -> SDA (A4), SCL -> SCL (A5), VCC -> 5V, GND -> GND #include <Arduino.h> #include <SensirionI2cScd4x.h> #include <Wire.h> SensirionI2cScd4x scd4x; // the SCD40 sensor object char errorMessage[64]; int16_t error; // Turn a CO2 value into a simple air quality word const char *airQuality(uint16_t co2) { if (co2 < 1000) return "Good"; if (co2 < 2000) return "Moderate - open a window"; return "Poor"; } void setup() { Serial.begin(9600); while (!Serial) { delay(10); } Wire.begin(); // the default I2C bus of the Arduino UNO R4 scd4x.begin(Wire, SCD40_I2C_ADDR_62); // Clean start: wake the sensor, stop any old measurement, reload settings scd4x.wakeUp(); // may return an error if the sensor is already awake - that is OK scd4x.stopPeriodicMeasurement(); scd4x.reinit(); // Start measuring: the SCD40 makes a new reading every 5 seconds error = scd4x.startPeriodicMeasurement(); if (error != 0) { errorToString(error, errorMessage, sizeof errorMessage); Serial.print("Cannot start the measurement: "); Serial.println(errorMessage); return; } Serial.println("SCD40 started. Waiting for the first reading..."); } void loop() { bool dataReady = false; uint16_t co2 = 0; float temperature = 0.0f; float humidity = 0.0f; // Ask the sensor every second if a new reading is ready delay(1000); error = scd4x.getDataReadyStatus(dataReady); if (error != 0) { errorToString(error, errorMessage, sizeof errorMessage); Serial.print("Data ready error: "); Serial.println(errorMessage); return; } if (!dataReady) { return; // not ready yet, try again in the next loop } // Read the measurement (temperature and humidity are not used here) error = scd4x.readMeasurement(co2, temperature, humidity); if (error != 0) { errorToString(error, errorMessage, sizeof errorMessage); Serial.print("Read error: "); Serial.println(errorMessage); return; } Serial.print("CO2: "); Serial.print(co2); Serial.print(" ppm -> "); Serial.println(airQuality(co2)); }

Passos Rápidos

Siga estas instruções passo a passo:

  • Se esta é a primeira vez que você usa o Arduino Uno R4 WiFi/Minima, consulte o tutorial sobre como configurar o ambiente para o Arduino Uno R4 WiFi/Minima no Arduino IDE.
  • Ligue os componentes conforme o diagrama fornecido.
  • Conecte a placa Arduino Uno R4 ao seu computador usando um cabo USB.
  • Abra o Arduino IDE no seu computador.
  • Selecione a placa Arduino Uno R4 apropriada (por exemplo, Arduino Uno R4 WiFi) e a porta COM.
  • Clique no ícone Libraries no lado esquerdo do Arduino IDE.
  • Digite "SCD4x" na caixa de pesquisa e encontre a biblioteca Sensirion I2C SCD4x da Sensirion.
  • Clique no botão Install. Quando o IDE pedir para instalar a dependência Sensirion Core, clique em Install All.
  • Search for Sensirion I2C SCD4x created by Sensirion and click the Install button.
∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
Arduino Uno R4 WiFi
Library Manager
Type:
All
Topic:
All
Sensirion I2C SCD4x by Sensirion
Enables you to use the SCD4X sensor family via I2C. More info
1.1.0
INSTALL
Newbiely.ino
···
1 void setup() {
Output
Serial Monitor
Ln 1, Col 1
Arduino Uno R4 WiFi on COM15
1
  • Copie o código acima e cole no Arduino IDE.
  • Clique no botão Upload para fazer o upload do código para o Arduino UNO R4.
  • Abra o Serial Monitor e espere cerca de 5 segundos pelo primeiro valor.
  • Respire devagar na direção do sensor por alguns segundos e veja o número subir e depois cair de novo.
∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
Arduino Uno R4 WiFi
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Arduino Uno R4 WiFi' on 'COM15')
New Line
9600 baud
SCD40 started. Waiting for the first reading... CO2: 538 ppm -> Good CO2: 544 ppm -> Good CO2: 551 ppm -> Good CO2: 1187 ppm -> Moderate - open a window CO2: 1462 ppm -> Moderate - open a window CO2: 1093 ppm -> Moderate - open a window CO2: 812 ppm -> Good CO2: 626 ppm -> Good
Ln 11, Col 1
Arduino Uno R4 WiFi on COM15
2

Uma nova linha aparece a cada cerca de 5 segundos, porque é essa a frequência com que o SCD40 faz uma nova medição.

※ Nota:

Se você só vê mensagens de erro, verifique primeiro os fios SDA e SCL. É fácil trocá-los por engano.

Lendo Temperatura e Umidade do SCD40

O SCD40 também tem seu próprio sensor de temperatura e umidade dentro dele. O chip o usa para corrigir o valor de CO2, e você também pode lê-lo. Na verdade, readMeasurement() já retorna os três valores em uma só chamada. O primeiro sketch simplesmente não os imprimiu. O código abaixo imprime CO2, temperatura e umidade em uma linha.

/* * Este código de Arduino UNO R4 foi desenvolvido por pt.newbiely.com * Este código de Arduino UNO R4 é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.newbiely.com/tutorials/arduino-uno-r4/arduino-uno-r4-scd40-co2-sensor */ // Arduino UNO R4 + SCD40: read CO2, temperature and humidity // Wiring: SDA -> SDA (A4), SCL -> SCL (A5), VCC -> 5V, GND -> GND #include <Arduino.h> #include <SensirionI2cScd4x.h> #include <Wire.h> SensirionI2cScd4x scd4x; // the SCD40 sensor object char errorMessage[64]; int16_t error; // Print the error text when a command fails void printError(const char *label) { errorToString(error, errorMessage, sizeof errorMessage); Serial.print(label); Serial.println(errorMessage); } void setup() { Serial.begin(9600); while (!Serial) { delay(10); } Wire.begin(); // the default I2C bus of the Arduino UNO R4 scd4x.begin(Wire, SCD40_I2C_ADDR_62); // Clean start scd4x.wakeUp(); // may return an error if the sensor is already awake - that is OK scd4x.stopPeriodicMeasurement(); scd4x.reinit(); error = scd4x.startPeriodicMeasurement(); // new reading every 5 seconds if (error != 0) { printError("Cannot start the measurement: "); return; } Serial.println("SCD40 started. Waiting for the first reading..."); } void loop() { bool dataReady = false; uint16_t co2 = 0; float temperature = 0.0f; float humidity = 0.0f; delay(1000); error = scd4x.getDataReadyStatus(dataReady); if (error != 0) { printError("Data ready error: "); return; } if (!dataReady) { return; // wait until the sensor has a new reading } // One command gives all three values error = scd4x.readMeasurement(co2, temperature, humidity); if (error != 0) { printError("Read error: "); return; } Serial.print("CO2: "); Serial.print(co2); Serial.print(" ppm | Temperature: "); Serial.print(temperature, 1); Serial.print(" °C | Humidity: "); Serial.print(humidity, 1); Serial.println(" %"); }

Passos Rápidos

  • Mantenha a mesma ligação.
  • Copie o código acima e cole no Arduino IDE.
  • Clique no botão Upload para fazer o upload do código para o Arduino UNO R4.
  • Abra o Serial Monitor.
∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
Arduino Uno R4 WiFi
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Arduino Uno R4 WiFi' on 'COM15')
New Line
9600 baud
SCD40 started. Waiting for the first reading... CO2: 702 ppm | Temperature: 24.6 °C | Humidity: 47.3 % CO2: 709 ppm | Temperature: 24.6 °C | Humidity: 47.1 % CO2: 715 ppm | Temperature: 24.7 °C | Humidity: 47.0 % CO2: 721 ppm | Temperature: 24.7 °C | Humidity: 46.8 %
Ln 11, Col 1
Arduino Uno R4 WiFi on COM15
2

A temperatura pode marcar um pouco mais que a da sala, porque o sensor e a placa esquentam um pouco enquanto trabalham.

Vídeo

Referências de Funções

※ NOSSAS MENSAGENS

  • Fique à vontade para compartilhar o link deste tutorial. Porém, por favor, não use nosso conteúdo em outros sites. Investimos muito esforço e tempo para criar este conteúdo, por favor respeite nosso trabalho!