Remarks

Ccs811
Status Status badge: working
Source code GitHub
Datasheet(s) GitHub
NuGet package NuGet Gallery for Meadow.Foundation.Sensors.Atmospheric.Ccs811

Code Example

Ccs811 sensor;

public override Task Initialize()
{
    Resolver.Log.Info("Initializing...");

    var i2c = Device.CreateI2cBus(Meadow.Hardware.I2cBusSpeed.Fast);
    sensor = new Ccs811(i2c);

    var consumer = Ccs811.CreateObserver(
        handler: result =>
        {
            Resolver.Log.Info($"Observer triggered:");
            Resolver.Log.Info($"   new CO2: {result.New.Co2?.PartsPerMillion:N1}ppm, old: {result.Old?.Co2?.PartsPerMillion:N1}ppm.");
            Resolver.Log.Info($"   new VOC: {result.New.Voc?.PartsPerBillion:N1}ppb, old: {result.Old?.Voc?.PartsPerBillion:N1}ppb.");
        },
        filter: result =>
        {
            //c# 8 pattern match syntax. checks for !null and assigns var.
            if (result.Old is { } old)
            {
                return (
                (result.New.Co2.Value - old.Co2.Value).Abs().PartsPerMillion > 1000 // 1000ppm
                  &&
                (result.New.Voc.Value - old.Voc.Value).Abs().PartsPerBillion > 100 // 100ppb
                );
            }
            return false;
        }
    );
    sensor.Subscribe(consumer);

    sensor.Updated += (sender, result) =>
    {
        Resolver.Log.Info($"CO2: {result.New.Co2.Value.PartsPerMillion:n1}ppm, VOC: {result.New.Voc.Value.PartsPerBillion:n1}ppb");
    };

    return Task.CompletedTask;
}

public override async Task Run()
{
    var result = await sensor.Read();
    Resolver.Log.Info("Initial Readings:");
    Resolver.Log.Info($"  CO2: {result.Co2.Value.PartsPerMillion:n1}ppm");
    Resolver.Log.Info($"  VOC: {result.Voc.Value.PartsPerBillion:n1}ppb");

    sensor.StartUpdating(TimeSpan.FromSeconds(1));
}

Sample project(s) available on GitHub

Wiring Example

To wire a Ccs811 to your Meadow board, connect the following:

Ccs811 Meadow Pin
GND GND
VCC 3V3
SCL D08
SDA D07

It should look like the following diagram:

Characteristic Locus
Inheritance System.Object ObservableBase<System.ValueTuple<System.Nullable<Concentration>, System.Nullable<Concentration>>> SamplingSensorBase<System.ValueTuple<System.Nullable<Concentration>, System.Nullable<Concentration>>> PollingSensorBase<System.ValueTuple<System.Nullable<Concentration>, System.Nullable<Concentration>>> ByteCommsSensorBase<System.ValueTuple<System.Nullable<Concentration>, System.Nullable<Concentration>>> > Ccs811
Implements ISamplingSensor<System.ValueTuple<System.Nullable<Concentration>, System.Nullable<Concentration>>> ISamplingSensor<System.ValueTuple<System.Nullable<Concentration>, System.Nullable<Concentration>>> IDisposable ICo2Sensor IVocSensor
Inherited Members ByteCommsSensorBase<(Nullable<Concentration> Co2, Nullable<Concentration> Voc)>.Peripheral ByteCommsSensorBase<(Nullable<Concentration> Co2, Nullable<Concentration> Voc)>.ReadBuffer ByteCommsSensorBase<(Nullable<Concentration> Co2, Nullable<Concentration> Voc)>.WriteBuffer ByteCommsSensorBase<(Nullable<Concentration> Co2, Nullable<Concentration> Voc)>.Init(Int32, Int32) ByteCommsSensorBase<(Nullable<Concentration> Co2, Nullable<Concentration> Voc)>.Dispose(Boolean) ByteCommsSensorBase<(Nullable<Concentration> Co2, Nullable<Concentration> Voc)>.Dispose() PollingSensorBase<(Nullable<Concentration> Co2, Nullable<Concentration> Voc)>.StartUpdating(Nullable<TimeSpan>) PollingSensorBase<(Nullable<Concentration> Co2, Nullable<Concentration> Voc)>.StopUpdating() SamplingSensorBase<(Nullable<Concentration> Co2, Nullable<Concentration> Voc)>.samplingLock SamplingSensorBase<(Nullable<Concentration> Co2, Nullable<Concentration> Voc)>.Updated SamplingSensorBase<(Nullable<Concentration> Co2, Nullable<Concentration> Voc)>.SamplingTokenSource SamplingSensorBase<(Nullable<Concentration> Co2, Nullable<Concentration> Voc)>.Conditions SamplingSensorBase<(Nullable<Concentration> Co2, Nullable<Concentration> Voc)>.IsSampling SamplingSensorBase<(Nullable<Concentration> Co2, Nullable<Concentration> Voc)>.UpdateInterval SamplingSensorBase<(Nullable<Concentration> Co2, Nullable<Concentration> Voc)>.ReadSensor() SamplingSensorBase<(Nullable<Concentration> Co2, Nullable<Concentration> Voc)>.RaiseEventsAndNotify(IChangeResult<>) SamplingSensorBase<(Nullable<Concentration> Co2, Nullable<Concentration> Voc)>.Read() ObservableBase<(Nullable<Concentration> Co2, Nullable<Concentration> Voc)>.observers ObservableBase<(Nullable<Concentration> Co2, Nullable<Concentration> Voc)>.NotifyObservers(IChangeResult<>) Meadow.Foundation.ObservableBase<System.ValueTuple<System.Nullable<Concentration>, System.Nullable<Concentration>>>.Subscribe(IObserver<>) Meadow.Foundation.ObservableBase<System.ValueTuple<System.Nullable<Concentration>, System.Nullable<Concentration>>>.CreateObserver(Action<>, System.Nullable<Predicate<IChangeResult<UNIT>>>)
Namespace Meadow.Foundation.Sensors.Atmospheric
Assembly Ccs811.dll

Syntax

public class Ccs811 : ByteCommsSensorBase<(Concentration? Co2, Concentration? Voc)>, ISamplingSensor<(Concentration? Co2, Concentration? Voc)>, ISamplingSensor<(Concentration? Co2, Concentration? Voc)>, IDisposable, ICo2Sensor, IVocSensor

Constructors

Ccs811(II2cBus, Ccs811.Addresses)

Create a new Ccs811 object

Declaration
public Ccs811(II2cBus i2cBus, Ccs811.Addresses address = default(Ccs811.Addresses))

Parameters

Type Name Description
II2cBus i2cBus

The I2C bus

Ccs811.Addresses address

The I2C address

Ccs811(II2cBus, Byte)

Create a new Ccs811 object

Declaration
public Ccs811(II2cBus i2cBus, byte address)

Parameters

Type Name Description
II2cBus i2cBus

The I2C bus

System.Byte address

The I2C address

Properties

Co2

The measured CO2 concentration

Declaration
public Concentration? Co2 { get; }

Property Value

Type Description
System.Nullable<Concentration>

Voc

The measured VOC concentration

Declaration
public Concentration? Voc { get; }

Property Value

Type Description
System.Nullable<Concentration>

Methods

GetBaseline()

Get baseline value

Declaration
public ushort GetBaseline()

Returns

Type Description
System.UInt16

The baseline value

GetMeasurementMode()

Get the current measurement mode

Declaration
public Ccs811.MeasurementMode GetMeasurementMode()

Returns

Type Description
Ccs811.MeasurementMode

The measurement mode

Initialize()

Initialize the sensor

Declaration
protected void Initialize()

RaiseEventsAndNotify(IChangeResult<(Nullable<Concentration> Co2, Nullable<Concentration> Voc)>)

Raise events for subcribers and notify of value changes

Declaration
protected override void RaiseEventsAndNotify(IChangeResult<(Concentration? Co2, Concentration? Voc)> changeResult)

Parameters

Type Name Description
IChangeResult<System.ValueTuple<System.Nullable<Concentration>, System.Nullable<Concentration>>> changeResult

The updated sensor data

ReadSensor()

Reads data from the sensor

Declaration
protected override Task<(Concentration? Co2, Concentration? Voc)> ReadSensor()

Returns

Type Description
Task<System.ValueTuple<System.Nullable<Concentration>, System.Nullable<Concentration>>>

The latest sensor reading

Overrides

Meadow.Foundation.SamplingSensorBase<System.ValueTuple<System.Nullable<Concentration>, System.Nullable<Concentration>>>.ReadSensor()

SetBaseline(UInt16)

Set the baseline value

Declaration
public void SetBaseline(ushort value)

Parameters

Type Name Description
System.UInt16 value

The new baseline

SetMeasurementMode(Ccs811.MeasurementMode)

Set the Measurement mode

Declaration
public void SetMeasurementMode(Ccs811.MeasurementMode mode)

Parameters

Type Name Description
Ccs811.MeasurementMode mode

The new mode

Events

Co2Updated

Event raised when the CO2 concentration value changes

Declaration
public event EventHandler<ChangeResult<Concentration>> Co2Updated

Event Type

Type Description
EventHandler<ChangeResult<Concentration>>

VocUpdated

Event raised when the VOC concentration value changes

Declaration
public event EventHandler<ChangeResult<Concentration>> VocUpdated

Event Type

Type Description
EventHandler<ChangeResult<Concentration>>