scd30 - Driver for SCD30 CO₂ sensor

group scd30

ESP-IDF driver for Sensirion SCD30 CO2 sensor.

Adapted from https://github.com/UncleRus/esp-idf-lib/tree/master/components/scd4x

Copyright (c) 2021, Sensirion AG Copyright (c) 2021 Ruslan V. Uss unclerus@gmail.com Copyright (c) 2021 Nate Usher n.usher87@gmail.com

BSD Licensed as described in the file LICENSE

Defines

SCD30_I2C_ADDR

Functions

esp_err_t scd30_init_desc(i2c_dev_t *dev, i2c_port_t port, gpio_num_t sda_gpio, gpio_num_t scl_gpio)

Initialize device descriptor.

Parameters
  • dev – Device descriptor

  • port – I2C port

  • sda_gpio – SDA GPIO

  • scl_gpio – SCL GPIO

Returns

ESP_OK on success

esp_err_t scd30_free_desc(i2c_dev_t *dev)

Free device descriptor.

Parameters

dev – Device descriptor

Returns

ESP_OK on success

esp_err_t scd30_trigger_continuous_measurement(i2c_dev_t *dev, uint16_t p_comp)

Trigger continuous measurement.

Signal update interval default is 2 seconds.

Parameters
  • dev – Device descriptor

  • p_comp – Optional ambient pressure compensation in mBar, 0 to deactivate

Returns

ESP_OK on success

esp_err_t scd30_stop_continuous_measurement(i2c_dev_t *dev)

Stop continuous measurement.

Stops the continuous measurement of the SCD30.

Parameters

dev – Device descriptor

Returns

ESP_OK on success

esp_err_t scd30_get_measurement_interval(i2c_dev_t *dev, uint16_t *interval_seconds)

Get measurement interval.

Gets the interval used bythe SCD30 sensor to measure in continuous measurement mode. Saved in non-volatile memory.

Parameters
  • dev – Device descriptor

  • interval_seconds – Measurement interval in seconds

Returns

ESP_OK on success

esp_err_t scd30_set_measurement_interval(i2c_dev_t *dev, uint16_t interval_seconds)

Set measurement interval.

Sets the interval used bythe SCD30 sensor to measure in continuous measurement mode. Saved in non-volatile memory.

Parameters
  • dev – Device descriptor

  • interval_seconds – Measurement interval in seconds

Returns

ESP_OK on success

esp_err_t scd30_get_data_ready_status(i2c_dev_t *dev, bool *data_ready)

Check whether new measurement data is available for read-out.

Parameters
  • dev – Device descriptor

  • data_ready – true if data is ready, false otherwise

Returns

ESP_OK on success

esp_err_t scd30_read_measurement(i2c_dev_t *dev, float *co2, float *temperature, float *humidity)

Read sensor output and convert.

When new measurement data is available it can be read out with the following command. Make sure that the measurement is completed by calling scd30_get_data_ready_status()

Parameters
  • dev – Device descriptor

  • co2 – CO₂ concentration in ppm

  • temperature – Temperature in degrees Celsius (°C)

  • humidity – Relative humidity in percent RH

Returns

ESP_OK on success

esp_err_t scd30_get_automatic_self_calibration(i2c_dev_t *dev, bool *enabled)

Get automatic self calibration (ASC) state.

By default, the ASC is disabled.

Parameters
  • dev – Device descriptor.

  • enabled – true if ASC is enabled, false otherwise

Returns

ESP_OK on success

esp_err_t scd30_set_automatic_self_calibration(i2c_dev_t *dev, bool enabled)

Enable or disable automatic self calibration (ASC).

By default, the ASC is disabled.

Parameters
  • dev – Device descriptor.

  • enabled – true to enable ASC, false to disable ASC

Returns

ESP_OK on success

esp_err_t scd30_get_forced_recalibration_value(i2c_dev_t *dev, uint16_t *correction_value)

Get Forced Recalibration Value.

See scd_30_set_forced_recalibration_value.

The most recently used reference value is retained in volatile memory and can be read out with the command sequence given below. After repowering the sensor, the command will return the standard reference value of 400 ppm.

Parameters
  • dev – Device descriptor.

  • correction_value – FRC correction value in CO₂ ppm

Returns

ESP_OK on success

esp_err_t scd30_set_forced_recalibration_value(i2c_dev_t *dev, uint16_t target_co2_concentration)

Set Forced Recalibration Value.

Forced recalibration (FRC) is used to compensate for sensor drifts when a reference value of the CO2 concentration in close proximity to the SCD30 is available. For best results,the sensor has to be run in a stable environment in continuous mode at a measurement rateof 2s for at least two minutes before applying the FRC command and sending the reference value. Setting a reference CO2 concentration by the method described here will always supersede corrections from the ASC

Imposes a permanent update to the calibration curve which persists after repowering the sensor.

Parameters
  • dev – Device descriptor.

  • target_co2_concentration – Target CO₂ concentration in ppm. (400 <= val <= 2000)

Returns

ESP_OK on success

esp_err_t scd30_get_temperature_offset_ticks(i2c_dev_t *dev, uint16_t *t_offset)

Get temperature offset in ticks.

Get the current temperature offset value saved in non-volatile memory.

Note

Only available in idle mode.

Parameters
  • dev – Device descriptor

  • t_offset – Temperature offset. Convert value to °C by: value * 100;

Returns

ESP_OK on success

esp_err_t scd30_get_temperature_offset(i2c_dev_t *dev, float *t_offset)

Get temperature offset in °C.

See scd30_get_temperature_offset_ticks() for more details.

Parameters
  • dev – Device descriptor

  • t_offset – Temperature offset in degrees Celsius (°C)

Returns

ESP_OK on success

esp_err_t scd30_set_temperature_offset_ticks(i2c_dev_t *dev, uint16_t t_offset)

Set temperature offset in ticks.

Set the temperature offset value to be saved in non-volatile memory. The last set value will be used for temperature offset compensation after repowering.

Parameters
  • dev – Device descriptor

  • t_offset – Temperature offset. Convert °C to value by: T / 100;

Returns

ESP_OK on success

esp_err_t scd30_set_temperature_offset(i2c_dev_t *dev, float t_offset)

Set temperature offset in °C.

See scd30_set_temperature_offset_ticks() for more details.

Parameters
  • dev – Device descriptor

  • t_offset – Temperature offset in degrees Celsius (°C)

Returns

ESP_OK on success

esp_err_t scd30_get_sensor_altitude(i2c_dev_t *dev, uint16_t *altitude)

Get configured sensor altitude.

Get configured sensor altitude in meters above sea level. Per default, the sensor altitude is set to 0 meter above sea-level.

Note

Only available in idle mode.

Parameters
  • dev – Device descriptor.

  • altitude – Sensor altitude in meters.

Returns

ESP_OK on success

esp_err_t scd30_set_sensor_altitude(i2c_dev_t *dev, uint16_t altitude)

Set sensor altitude in meters above sea level.

Note that setting a sensor altitude to the sensor overrides any pressure compensation based on a previously set ambient pressure.

Parameters
  • dev – Device descriptor.

  • altitude – Sensor altitude in meters.

Returns

ESP_OK on success

esp_err_t scd30_read_firmware_version(i2c_dev_t *dev, uint16_t *firmware_version)

Get firmware version.

Following command can be used to read out the firmware version of SCD30 module The MSB is the major firmware version, the LSB is the minor firmware version

Parameters
  • dev – Device descriptor

  • firmware_version – Firmware version

Returns

ESP_OK on success

esp_err_t scd30_soft_reset(i2c_dev_t *dev)

Reset the sensor.

Soft reset mechanism that forces the sensor into the same state as after powering up After soft reset the sensor will reload all calibrated data.

Parameters

dev – Device descriptor

Returns

ESP_OK on success