Remarks

Scd40
Status Status badge: working
Source code GitHub
Datasheet(s) GitHub
NuGet package NuGet Gallery for Meadow.Foundation.Sensors.Environmental.Scd4x

Code Example

Scd40 sensor;

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

    var i2cBus = Device.CreateI2cBus(Meadow.Hardware.I2cBusSpeed.Standard);

    sensor = new Scd40(i2cBus);
    var serialNum = sensor.GetSerialNumber();
    Resolver.Log.Info($"Serial: {BitConverter.ToString(serialNum)}");

    var consumer = Scd40.CreateObserver(
        handler: result =>
        {
            Resolver.Log.Info($"Observer: Temp changed by threshold; new temp: {result.New.Temperature?.Celsius:N2}C, old: {result.Old?.Temperature?.Celsius:N2}C");
        },
        filter: result =>
        {
            if (result.Old?.Temperature is { } oldTemp &&
                result.Old?.Humidity is { } oldHumidity &&
                result.New.Temperature is { } newTemp &&
                result.New.Humidity is { } newHumidity)
            {
                return ((newTemp - oldTemp).Abs().Celsius > 0.5 &&
                        (newHumidity - oldHumidity).Percent > 0.05);
            }
            return false;
        }
    );

    sensor?.Subscribe(consumer);

    if (sensor != null)
    {
        sensor.Updated += (sender, result) =>
        {
            Resolver.Log.Info($"  Concentration: {result.New.Concentration?.PartsPerMillion:N0}ppm");
            Resolver.Log.Info($"  Temperature: {result.New.Temperature?.Celsius:N1}C");
            Resolver.Log.Info($"  Relative Humidity: {result.New.Humidity:N0}%");
        };
    }

    sensor?.StartUpdating(TimeSpan.FromSeconds(6));

    return base.Initialize();
}

Sample project(s) available on GitHub

Characteristic Locus
Inheritance System.Object ObservableBase<System.ValueTuple<System.Nullable<Concentration>, System.Nullable<Units.Temperature>, System.Nullable<RelativeHumidity>>> SamplingSensorBase<System.ValueTuple<System.Nullable<Concentration>, System.Nullable<Units.Temperature>, System.Nullable<RelativeHumidity>>> PollingSensorBase<System.ValueTuple<System.Nullable<Concentration>, System.Nullable<Units.Temperature>, System.Nullable<RelativeHumidity>>> ByteCommsSensorBase<System.ValueTuple<System.Nullable<Concentration>, System.Nullable<Units.Temperature>, System.Nullable<RelativeHumidity>>> Scd4xBase > Scd40
Implements ISamplingSensor<System.ValueTuple<System.Nullable<Concentration>, System.Nullable<Units.Temperature>, System.Nullable<RelativeHumidity>>> ISamplingSensor<System.ValueTuple<System.Nullable<Concentration>, System.Nullable<Units.Temperature>, System.Nullable<RelativeHumidity>>> IDisposable ITemperatureSensor IHumiditySensor IConcentrationSensor
Inherited Members Scd4xBase.ConcentrationUpdated Scd4xBase.TemperatureUpdated Scd4xBase.HumidityUpdated Scd4xBase.Concentration Scd4xBase.Temperature Scd4xBase.Humidity Scd4xBase.ReInitialize() Scd4xBase.PerformForcedRecalibration() Scd4xBase.PersistSettings() Scd4xBase.PerformFactoryReset() Scd4xBase.GetSerialNumber() Scd4xBase.IsDataReady() Scd4xBase.StartUpdating(Nullable<TimeSpan>) Scd4xBase.StopUpdating() Scd4xBase.ReadSensor() Scd4xBase.RaiseChangedAndNotify(IChangeResult<ValueTuple<Nullable<Concentration>, Nullable<Units.Temperature>, Nullable<RelativeHumidity>>>) ByteCommsSensorBase<(Nullable<Concentration> Concentration, Nullable<Units.Temperature> Temperature, Nullable<RelativeHumidity> Humidity)>.Peripheral ByteCommsSensorBase<(Nullable<Concentration> Concentration, Nullable<Units.Temperature> Temperature, Nullable<RelativeHumidity> Humidity)>.ReadBuffer ByteCommsSensorBase<(Nullable<Concentration> Concentration, Nullable<Units.Temperature> Temperature, Nullable<RelativeHumidity> Humidity)>.WriteBuffer ByteCommsSensorBase<(Nullable<Concentration> Concentration, Nullable<Units.Temperature> Temperature, Nullable<RelativeHumidity> Humidity)>.Init(Int32, Int32) ByteCommsSensorBase<(Nullable<Concentration> Concentration, Nullable<Units.Temperature> Temperature, Nullable<RelativeHumidity> Humidity)>.Dispose(Boolean) ByteCommsSensorBase<(Nullable<Concentration> Concentration, Nullable<Units.Temperature> Temperature, Nullable<RelativeHumidity> Humidity)>.Dispose() PollingSensorBase<(Nullable<Concentration> Concentration, Nullable<Units.Temperature> Temperature, Nullable<RelativeHumidity> Humidity)>.StartUpdating(Nullable<TimeSpan>) PollingSensorBase<(Nullable<Concentration> Concentration, Nullable<Units.Temperature> Temperature, Nullable<RelativeHumidity> Humidity)>.StopUpdating() SamplingSensorBase<(Nullable<Concentration> Concentration, Nullable<Units.Temperature> Temperature, Nullable<RelativeHumidity> Humidity)>.samplingLock SamplingSensorBase<(Nullable<Concentration> Concentration, Nullable<Units.Temperature> Temperature, Nullable<RelativeHumidity> Humidity)>.Updated SamplingSensorBase<(Nullable<Concentration> Concentration, Nullable<Units.Temperature> Temperature, Nullable<RelativeHumidity> Humidity)>.SamplingTokenSource SamplingSensorBase<(Nullable<Concentration> Concentration, Nullable<Units.Temperature> Temperature, Nullable<RelativeHumidity> Humidity)>.Conditions SamplingSensorBase<(Nullable<Concentration> Concentration, Nullable<Units.Temperature> Temperature, Nullable<RelativeHumidity> Humidity)>.IsSampling SamplingSensorBase<(Nullable<Concentration> Concentration, Nullable<Units.Temperature> Temperature, Nullable<RelativeHumidity> Humidity)>.UpdateInterval SamplingSensorBase<(Nullable<Concentration> Concentration, Nullable<Units.Temperature> Temperature, Nullable<RelativeHumidity> Humidity)>.ReadSensor() SamplingSensorBase<(Nullable<Concentration> Concentration, Nullable<Units.Temperature> Temperature, Nullable<RelativeHumidity> Humidity)>.RaiseEventsAndNotify(IChangeResult<>) SamplingSensorBase<(Nullable<Concentration> Concentration, Nullable<Units.Temperature> Temperature, Nullable<RelativeHumidity> Humidity)>.Read() ObservableBase<(Nullable<Concentration> Concentration, Nullable<Units.Temperature> Temperature, Nullable<RelativeHumidity> Humidity)>.observers ObservableBase<(Nullable<Concentration> Concentration, Nullable<Units.Temperature> Temperature, Nullable<RelativeHumidity> Humidity)>.NotifyObservers(IChangeResult<>) Meadow.Foundation.ObservableBase<System.ValueTuple<System.Nullable<Concentration>, System.Nullable<Units.Temperature>, System.Nullable<RelativeHumidity>>>.Subscribe(IObserver<>) Meadow.Foundation.ObservableBase<System.ValueTuple<System.Nullable<Concentration>, System.Nullable<Units.Temperature>, System.Nullable<RelativeHumidity>>>.CreateObserver(Action<>, System.Nullable<Predicate<IChangeResult<UNIT>>>)
Namespace Meadow.Foundation.Sensors.Environmental
Assembly Scd4x.dll

Syntax

public class Scd40 : Scd4xBase, ISamplingSensor<(Concentration? Concentration, Units.Temperature? Temperature, RelativeHumidity? Humidity)>, ISamplingSensor<(Concentration? Concentration, Units.Temperature? Temperature, RelativeHumidity? Humidity)>, IDisposable, ITemperatureSensor, IHumiditySensor, IConcentrationSensor

Constructors

Scd40(II2cBus, Byte)

Create a new Scd40 object

Declaration
public Scd40(II2cBus i2cBus, byte address = null)

Parameters

Type Name Description
II2cBus i2cBus

The I2C bus

System.Byte address

The I2C address