Building a custom CO₂ sensor has become a popular hobby project in the last weeks due to the COVID-19 pandemic. For that reason I ordered multiple Sensirion SCD30 CO₂ sensors. Sensirion claims an accuracy of ± (30 ppm + 3% MV) at 25 °C and the sensor supports an Automatic Self-Calibration (ASC) (see section 1.4.6 of datasheet).
As I noticed quite some difference between measurements of different sensors, I was curious about the accuracy and self-calibration. Therefore I build a custom PCB, which hosts eight sensors in vicinity, a Bosch BMP280 pressure sensor for pressure calibration, a I2C multiplexer and an ESP32 for low-level communication with the sensors.
The software on the ESP32 initialises all sensors to work with a measurement interval of 15 s, a temperature offset of 1 °C, and activated automatic self-calibration. Every 15 s it queries the current pressure from the BMP280 and updates the pressure values in the SCD30 sensors if ambient pressure has changed. It also prints out all measurement values over a virtual serial port on USB.
To log the data for a longer time period I connected the setup with a Raspberry Pi and let it run for multiple weeks. The setup is located on the windowsill of my home office working room. The window is regularly opened.
Initially the sensors reported quite some different CO₂ concentrations, but over time the all agreed to almost the same CO₂ concentration. The following charts show the CO₂ concentration and the difference of each sensors to the average CO₂ concentration of all sensors over the period of about a month.
If you want to experiment with the data yourself, you can find the raw data here. Each lines consistent of time, pressure in mbar, temperature in °C measured by BMP280, and then eight triples of CO₂ concentration in ppm, temperature in °C, humidity in %RH. Lines starting with # should be ignored.