Calibration of SCD30 ( on Arduino uno)


I bought a SCD sensor of CO2 (

I wanted to be sure of the calibration and I used the automatic self calibration with the sketch given by Grove : the result is worse. I find more than 600 with fresh air

The automatic self calibration is very long and I can’t put the sensor in fresh air one hour every day

Is it possible to do a forced recalibration with Grove’s library?

Thank you

To force calibration, I tried to use the code below (Adafruit SCD 30 tuning) and in fresh air, I obtain 530 ppm and

Measurement interval: 2 seconds
Ambient pressure offset: 0 mBar
Altitude offset: 300 meters
Temperature offset: 3.00 degrees C
Forced Recalibration reference: 400 ppm
Self calibration disabled

// Demo of the available settings for the SCD30
#include <Adafruit_SCD30.h>

Adafruit_SCD30 scd30;

void setup(void) {
while (!Serial) delay(10); // will pause Zero, Leonardo, etc until serial console opens

Serial.println(“Adafruit SCD30 Sensor adjustment test!”);

// Try to initialize!
if (!scd30.begin()) {
Serial.println(“Failed to find SCD30 chip”);
while (1) { delay(10); }
Serial.println(“SCD30 Found!”);


  • The code below will report the current settings for each of the
  • settings that can be changed. To see how they work, uncomment the setting
  • code above a status message and adjust the value
  • Note: Since Automatic self calibration and forcing recalibration with
  • a reference value overwrite each other, you should only set one or the other

/*** Adjust the rate at which measurements are taken, from 2-1800 seconds */
// if (!scd30.setMeasurementInterval(5)) {
// Serial.println(“Failed to set measurement interval”);
// while(1){ delay(10);}
// }
Serial.print(“Measurement interval: “);
Serial.println(” seconds”);

/*** Restart continuous measurement with a pressure offset from 700 to 1400 millibar.

  • Giving no argument or setting the offset to 0 will disable offset correction
    // if (!scd30.startContinuousMeasurement(15)){
    // Serial.println(“Failed to set ambient pressure offset”);
    // while(1){ delay(10);}
    // }
    Serial.print(“Ambient pressure offset: “);
    Serial.println(” mBar”);

/*** Set an altitude offset in meters above sea level.

  • Offset value stored in non-volatile memory of SCD30.
  • Setting an altitude offset will override any pressure offset.
    // if (!scd30.setAltitudeOffset(110)){
    // Serial.println(“Failed to set altitude offset”);
    // while(1){ delay(10);}
    // }
    Serial.print(“Altitude offset: “);
    Serial.println(” meters”);

/*** Set a temperature offset in hundredths of a degree celcius.

  • Offset value stored in non-volatile memory of SCD30.
    // if (!scd30.setTemperatureOffset(1984)){ // 19.84 degrees celcius
    // Serial.println(“Failed to set temperature offset”);
    // while(1){ delay(10);}
    // }
    Serial.print(“Temperature offset: “);
    Serial.println(” degrees C”);

/*** Force the sensor to recalibrate with the given reference value

  • from 400-2000 ppm. Writing a recalibration reference will overwrite
  • any previous self calibration values.
  • Reference value stored in non-volatile memory of SCD30.
    if (!scd30.forceRecalibrationWithReference(400)){
    Serial.println(“Failed to force recalibration with reference”);
    while(1) { delay(10); }
    Serial.print(“Forced Recalibration reference: “);
    Serial.println(” ppm”);

/*** Enable or disable automatic self calibration (ASC).

  • Parameter stored in non-volatile memory of SCD30.
  • Enabling self calibration will override any previously set
  • forced calibration value.
  • ASC needs continuous operation with at least 1 hour
  • 400ppm CO2 concentration daily.
    // if (!scd30.selfCalibrationEnabled(true)){
    // Serial.println(“Failed to enable or disable self calibration”);
    // while(1) { delay(10); }
    // }
    if (scd30.selfCalibrationEnabled()) {
    Serial.print(“Self calibration enabled”);
    } else {
    Serial.print(“Self calibration disabled”);


void loop() {
if (scd30.dataReady()) {

if (!{ 
  Serial.println("Error reading sensor data"); 

Serial.print("Temperature: ");
Serial.println(" degrees C");

Serial.print("Relative Humidity: ");
Serial.println(" %");

Serial.print("CO2: ");
Serial.print(scd30.CO2, 3);
Serial.println(" ppm");