Remarks

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

Code Example

Ens160 sensor;

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

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

    sensor = new Ens160(i2cBus, (byte)Ens160.Addresses.Address_0x53);


    var consumer = Ens160.CreateObserver(
        handler: result =>
        {
            Resolver.Log.Info($"Observer: C02 concentration changed by threshold; new: {result.New.CO2Concentration?.PartsPerMillion:N0}ppm");
        },
        filter: result =>
        {
            if (result.Old?.CO2Concentration is { } oldCon &&
                result.New.CO2Concentration is { } newCon)
            {
                return Math.Abs((newCon - oldCon).PartsPerMillion) > 10;
            }
            return false;
        }
    );

    sensor?.Subscribe(consumer);

    if (sensor != null)
    {
        sensor.Updated += (sender, result) =>
        {
            Resolver.Log.Info($"  CO2 Concentration: {result.New.CO2Concentration?.PartsPerMillion:N0}ppm");
            Resolver.Log.Info($"  Ethanol Concentraion: {result.New.EthanolConcentration?.PartsPerBillion:N0}ppb");
            Resolver.Log.Info($"  TVOC Concentraion: {result.New.TVOCConcentration?.PartsPerBillion:N0}ppb");
            Resolver.Log.Info($"  AQI: {sensor.GetAirQualityIndex()}");    
        };
    }

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

    return base.Initialize();
}

Sample project(s) available on GitHub

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

Syntax

public class Ens160 : ByteCommsSensorBase<(Concentration? CO2Concentration, Concentration? EthanolConcentration, Concentration? TVOCConcentration)>, ISamplingSensor<(Concentration? CO2Concentration, Concentration? EthanolConcentration, Concentration? TVOCConcentration)>, ISamplingSensor<(Concentration? CO2Concentration, Concentration? EthanolConcentration, Concentration? TVOCConcentration)>, IDisposable, IConcentrationSensor

Constructors

Ens160(II2cBus, Byte)

Create a new ENS160 object

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

Parameters

Type Name Description
II2cBus i2cBus

The I2C bus

System.Byte address

The I2C address

Remarks

The constructor sends the stop periodic updates method otherwise the sensor may not respond to new commands

Properties

CO2Concentration

The current C02 concentration value

Declaration
public Concentration? CO2Concentration { get; }

Property Value

Type Description
System.Nullable<Concentration>

Concentration

The current C02 concentration value

Declaration
public Concentration? Concentration { get; }

Property Value

Type Description
System.Nullable<Concentration>

CurrentOperatingMode

The current device operating mode

Declaration
public Ens160.OperatingMode CurrentOperatingMode { get; set; }

Property Value

Type Description
Ens160.OperatingMode

EthanolConcentration

The current ethanol concentration value

Declaration
public Concentration? EthanolConcentration { get; }

Property Value

Type Description
System.Nullable<Concentration>

TVOCConcentration

The current Total Volatile Organic Compounds (TVOC) concentration value

Declaration
public Concentration? TVOCConcentration { get; }

Property Value

Type Description
System.Nullable<Concentration>

Methods

GetAirQualityIndex()

Get the air quality index (AQI)

Declaration
public Ens160.UBAAirQualityIndex GetAirQualityIndex()

Returns

Type Description
Ens160.UBAAirQualityIndex

GetDeviceID()

Get the sensor ID from PART_ID register Default value is 0x0160 (352)

Declaration
public ushort GetDeviceID()

Returns

Type Description
System.UInt16

ID as a ushort (2 bytes)

GetFirmwareVersion()

Get the sensor app / firmware version

Declaration
public (byte Major, byte Minor, byte Release) GetFirmwareVersion()

Returns

Type Description
System.ValueTuple<System.Byte, System.Byte, System.Byte>

The major, minor, release values as a ttuple of bytes

GetHumidity()

Get the relative humidity used in its calculations -b taken from RH_IN if supplied

Declaration
public RelativeHumidity GetHumidity()

Returns

Type Description
RelativeHumidity

GetTemperature()

Get the temperature used for calculations - taken from TEMP_IN if supplied

Declaration
public Units.Temperature GetTemperature()

Returns

Type Description
Units.Temperature

Temperature

Initialize()

Initialize the sensor

Declaration
protected Task Initialize()

Returns

Type Description
Task

RaiseChangedAndNotify(IChangeResult<(Nullable<Concentration> CO2Concentration, Nullable<Concentration> EthanolConcentration, Nullable<Concentration> TVOCConcentration)>)

Raise change events for subscribers

Declaration
protected void RaiseChangedAndNotify(IChangeResult<(Concentration? CO2Concentration, Concentration? EthanolConcentration, Concentration? TVOCConcentration)> changeResult)

Parameters

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

The change result with the current sensor data

ReadSensor()

Get Scdx40 C02 Gas Concentration and Update the Concentration property

Declaration
protected override Task<(Concentration? CO2Concentration, Concentration? EthanolConcentration, Concentration? TVOCConcentration)> ReadSensor()

Returns

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

Overrides

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

Reset()

Reset the sensor

Declaration
public Task Reset()

Returns

Type Description
Task

SetHumidity(RelativeHumidity)

Set relative humidity

Declaration
public void SetHumidity(RelativeHumidity humidity)

Parameters

Type Name Description
RelativeHumidity humidity

SetTemperature(Units.Temperature)

Set ambient temperature

Declaration
public void SetTemperature(Units.Temperature ambientTemperature)

Parameters

Type Name Description
Units.Temperature ambientTemperature

StartUpdating(Nullable<TimeSpan>)

Starts updating the sensor on the updateInterval frequency specified

Declaration
public override void StartUpdating(TimeSpan? updateInterval = null)

Parameters

Type Name Description
System.Nullable<TimeSpan> updateInterval

StopUpdating()

Stop updating the sensor The sensor will not respond to commands for 500ms The call will delay the calling thread for 500ms

Declaration
public override void StopUpdating()

Overrides

Meadow.Foundation.PollingSensorBase<System.ValueTuple<System.Nullable<Concentration>, System.Nullable<Concentration>, System.Nullable<Concentration>>>.StopUpdating()

Events

CO2ConcentrationUpdated

Raised when the CO2 concentration changes

Declaration
public event EventHandler<IChangeResult<Concentration>> CO2ConcentrationUpdated

Event Type

Type Description
EventHandler<IChangeResult<Concentration>>

ConcentrationUpdated

Raised when the CO2 concentration changes

Declaration
public event EventHandler<IChangeResult<Concentration>> ConcentrationUpdated

Event Type

Type Description
EventHandler<IChangeResult<Concentration>>

EthanolConcentrationUpdated

Raised when the ethanol concentration changes

Declaration
public event EventHandler<IChangeResult<Concentration>> EthanolConcentrationUpdated

Event Type

Type Description
EventHandler<IChangeResult<Concentration>>

TVOCConcentrationUpdated

Raised when the Total Volatile Organic Compounds (TVOC) concentration changes

Declaration
public event EventHandler<IChangeResult<Concentration>> TVOCConcentrationUpdated

Event Type

Type Description
EventHandler<IChangeResult<Concentration>>