Remarks

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

The SI1145 is a low power infrared, ultraviolet and ambient light sensor with an I2C interface.

  • Ultraviolet / Infrared / ambient light sensor
  • Proximity sensor
  • Independent LED drivers
  • I2C interface up to 3.4 MBps

Sample projects available on GitHub

Purchasing

The following application reads the sensor output Infrared, Ultraviolet and Visibility once per second and outputs the result on the output console:

Code Example

Si1145 sensor;

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

    sensor = new Si1145(Device.CreateI2cBus());

    // Example that uses an IObservable subscription to only be notified when the filter is satisfied
    var consumer = Si1145.CreateObserver(
        handler: result => Resolver.Log.Info($"Observer: filter satisfied: {result.New.VisibleLight?.Lux:N2}Lux, old: {result.Old?.VisibleLight?.Lux:N2}Lux"),

        // only notify if the visible light changes by 100 lux (put your hand over the sensor to trigger)
        filter: result =>
        {
            if (result.Old is { } old)
            {
                // returns true if > 100lux change
                return ((result.New.VisibleLight.Value - old.VisibleLight.Value).Abs().Lux > 100);
            }
            return false;
        });

    sensor.Subscribe(consumer);

    // classical .NET events can also be used:
    sensor.Updated += (sender, result) =>
    {
        Resolver.Log.Info($" Visible Light: {result.New.VisibleLight?.Lux:N2}Lux");
        Resolver.Log.Info($" Infrared Light: {result.New.Infrared?.Lux:N2}Lux");
        Resolver.Log.Info($" UV Index: {result.New.UltravioletIndex:N2}Lux");
    };

    return Task.CompletedTask;
}

public override async Task Run()
{
    var (VisibleLight, UltravioletIndex, Infrared) = await sensor.Read();

    Resolver.Log.Info("Initial Readings:");
    Resolver.Log.Info($" Visible Light: {VisibleLight?.Lux:N2}Lux");
    Resolver.Log.Info($" Infrared Light: {Infrared?.Lux:N2}Lux");
    Resolver.Log.Info($" UV Index: {UltravioletIndex:N2}Lux");

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

Sample project(s) available on GitHub

Wiring Example

Characteristic Locus
Inheritance object ObservableBase<(Illuminance? VisibleLight, double? UltravioletIndex, Illuminance? Infrared)> SamplingSensorBase<(Illuminance? VisibleLight, double? UltravioletIndex, Illuminance? Infrared)> PollingSensorBase<(Illuminance? VisibleLight, double? UltravioletIndex, Illuminance? Infrared)> ByteCommsSensorBase<(Illuminance? VisibleLight, double? UltravioletIndex, Illuminance? Infrared)> > Si1145
Implements IObservable<IChangeResult<(Illuminance? VisibleLight, double? UltravioletIndex, Illuminance? Infrared)>> ISamplingSensor<(Illuminance? VisibleLight, double? UltravioletIndex, Illuminance? Infrared)> ISensor<(Illuminance? VisibleLight, double? UltravioletIndex, Illuminance? Infrared)> IDisposable II2cPeripheral
Inherited Members ByteCommsSensorBase<(Illuminance? VisibleLight, double? UltravioletIndex, Illuminance? Infrared)>.BusComms ByteCommsSensorBase<(Illuminance? VisibleLight, double? UltravioletIndex, Illuminance? Infrared)>.ReadBuffer ByteCommsSensorBase<(Illuminance? VisibleLight, double? UltravioletIndex, Illuminance? Infrared)>.WriteBuffer ByteCommsSensorBase<(Illuminance? VisibleLight, double? UltravioletIndex, Illuminance? Infrared)>.Init(int, int) ByteCommsSensorBase<(Illuminance? VisibleLight, double? UltravioletIndex, Illuminance? Infrared)>.Dispose(bool) ByteCommsSensorBase<(Illuminance? VisibleLight, double? UltravioletIndex, Illuminance? Infrared)>.Dispose() PollingSensorBase<(Illuminance? VisibleLight, double? UltravioletIndex, Illuminance? Infrared)>.StartUpdating(TimeSpan?) PollingSensorBase<(Illuminance? VisibleLight, double? UltravioletIndex, Illuminance? Infrared)>.StopUpdating() SamplingSensorBase<(Illuminance? VisibleLight, double? UltravioletIndex, Illuminance? Infrared)>.samplingLock SamplingSensorBase<(Illuminance? VisibleLight, double? UltravioletIndex, Illuminance? Infrared)>.Updated SamplingSensorBase<(Illuminance? VisibleLight, double? UltravioletIndex, Illuminance? Infrared)>.SamplingTokenSource SamplingSensorBase<(Illuminance? VisibleLight, double? UltravioletIndex, Illuminance? Infrared)>.Conditions SamplingSensorBase<(Illuminance? VisibleLight, double? UltravioletIndex, Illuminance? Infrared)>.IsSampling SamplingSensorBase<(Illuminance? VisibleLight, double? UltravioletIndex, Illuminance? Infrared)>.UpdateInterval SamplingSensorBase<(Illuminance? VisibleLight, double? UltravioletIndex, Illuminance? Infrared)>.ReadSensor() SamplingSensorBase<(Illuminance? VisibleLight, double? UltravioletIndex, Illuminance? Infrared)>.RaiseEventsAndNotify(IChangeResult<(Illuminance? VisibleLight, double? UltravioletIndex, Illuminance? Infrared)>) SamplingSensorBase<(Illuminance? VisibleLight, double? UltravioletIndex, Illuminance? Infrared)>.Read() ObservableBase<(Illuminance? VisibleLight, double? UltravioletIndex, Illuminance? Infrared)>.observers ObservableBase<(Illuminance? VisibleLight, double? UltravioletIndex, Illuminance? Infrared)>.NotifyObservers(IChangeResult<(Illuminance? VisibleLight, double? UltravioletIndex, Illuminance? Infrared)>) ObservableBase<(Illuminance? VisibleLight, double? UltravioletIndex, Illuminance? Infrared)>.Subscribe(IObserver<IChangeResult<(Illuminance? VisibleLight, double? UltravioletIndex, Illuminance? Infrared)>>) ObservableBase<(Illuminance? VisibleLight, double? UltravioletIndex, Illuminance? Infrared)>.CreateObserver(Action<IChangeResult<(Illuminance? VisibleLight, double? UltravioletIndex, Illuminance? Infrared)>>, Predicate<IChangeResult<(Illuminance? VisibleLight, double? UltravioletIndex, Illuminance? Infrared)>>) object.Equals(object) object.Equals(object, object) object.GetHashCode() object.GetType() object.MemberwiseClone() object.ReferenceEquals(object, object) object.ToString()
Namespace Meadow.Foundation.Sensors.Light
Assembly Si1145.dll

Syntax

public class Si1145 : ByteCommsSensorBase<(Illuminance? VisibleLight, double? UltravioletIndex, Illuminance? Infrared)>, IObservable<IChangeResult<(Illuminance? VisibleLight, double? UltravioletIndex, Illuminance? Infrared)>>, ISamplingSensor<(Illuminance? VisibleLight, double? UltravioletIndex, Illuminance? Infrared)>, ISensor<(Illuminance? VisibleLight, double? UltravioletIndex, Illuminance? Infrared)>, IDisposable, II2cPeripheral

Constructors

Si1145(II2cBus)

Create a new SI1145 sensor object

Declaration
public Si1145(II2cBus i2cBus)

Parameters

Type Name Description
II2cBus i2cBus

I2cBus (default to 400 KHz)

Remarks

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

The SI1145 is a low power infrared, ultraviolet and ambient light sensor with an I2C interface.

  • Ultraviolet / Infrared / ambient light sensor
  • Proximity sensor
  • Independent LED drivers
  • I2C interface up to 3.4 MBps

Sample projects available on GitHub

Purchasing

The following application reads the sensor output Infrared, Ultraviolet and Visibility once per second and outputs the result on the output console:

Code Example

Si1145 sensor;

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

    sensor = new Si1145(Device.CreateI2cBus());

    // Example that uses an IObservable subscription to only be notified when the filter is satisfied
    var consumer = Si1145.CreateObserver(
        handler: result => Resolver.Log.Info($"Observer: filter satisfied: {result.New.VisibleLight?.Lux:N2}Lux, old: {result.Old?.VisibleLight?.Lux:N2}Lux"),

        // only notify if the visible light changes by 100 lux (put your hand over the sensor to trigger)
        filter: result =>
        {
            if (result.Old is { } old)
            {
                // returns true if > 100lux change
                return ((result.New.VisibleLight.Value - old.VisibleLight.Value).Abs().Lux > 100);
            }
            return false;
        });

    sensor.Subscribe(consumer);

    // classical .NET events can also be used:
    sensor.Updated += (sender, result) =>
    {
        Resolver.Log.Info($" Visible Light: {result.New.VisibleLight?.Lux:N2}Lux");
        Resolver.Log.Info($" Infrared Light: {result.New.Infrared?.Lux:N2}Lux");
        Resolver.Log.Info($" UV Index: {result.New.UltravioletIndex:N2}Lux");
    };

    return Task.CompletedTask;
}

public override async Task Run()
{
    var (VisibleLight, UltravioletIndex, Infrared) = await sensor.Read();

    Resolver.Log.Info("Initial Readings:");
    Resolver.Log.Info($" Visible Light: {VisibleLight?.Lux:N2}Lux");
    Resolver.Log.Info($" Infrared Light: {Infrared?.Lux:N2}Lux");
    Resolver.Log.Info($" UV Index: {UltravioletIndex:N2}Lux");

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

Sample project(s) available on GitHub

Wiring Example

Properties

DefaultI2cAddress

The default I2C address for the peripheral

Declaration
public byte DefaultI2cAddress { get; }

Property Value

Type Description
byte

Remarks

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

The SI1145 is a low power infrared, ultraviolet and ambient light sensor with an I2C interface.

  • Ultraviolet / Infrared / ambient light sensor
  • Proximity sensor
  • Independent LED drivers
  • I2C interface up to 3.4 MBps

Sample projects available on GitHub

Purchasing

The following application reads the sensor output Infrared, Ultraviolet and Visibility once per second and outputs the result on the output console:

Code Example

Si1145 sensor;

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

    sensor = new Si1145(Device.CreateI2cBus());

    // Example that uses an IObservable subscription to only be notified when the filter is satisfied
    var consumer = Si1145.CreateObserver(
        handler: result => Resolver.Log.Info($"Observer: filter satisfied: {result.New.VisibleLight?.Lux:N2}Lux, old: {result.Old?.VisibleLight?.Lux:N2}Lux"),

        // only notify if the visible light changes by 100 lux (put your hand over the sensor to trigger)
        filter: result =>
        {
            if (result.Old is { } old)
            {
                // returns true if > 100lux change
                return ((result.New.VisibleLight.Value - old.VisibleLight.Value).Abs().Lux > 100);
            }
            return false;
        });

    sensor.Subscribe(consumer);

    // classical .NET events can also be used:
    sensor.Updated += (sender, result) =>
    {
        Resolver.Log.Info($" Visible Light: {result.New.VisibleLight?.Lux:N2}Lux");
        Resolver.Log.Info($" Infrared Light: {result.New.Infrared?.Lux:N2}Lux");
        Resolver.Log.Info($" UV Index: {result.New.UltravioletIndex:N2}Lux");
    };

    return Task.CompletedTask;
}

public override async Task Run()
{
    var (VisibleLight, UltravioletIndex, Infrared) = await sensor.Read();

    Resolver.Log.Info("Initial Readings:");
    Resolver.Log.Info($" Visible Light: {VisibleLight?.Lux:N2}Lux");
    Resolver.Log.Info($" Infrared Light: {Infrared?.Lux:N2}Lux");
    Resolver.Log.Info($" UV Index: {UltravioletIndex:N2}Lux");

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

Sample project(s) available on GitHub

Wiring Example

Methods

ReadSensor()

Read data from the sensor

Declaration
protected override Task<(Illuminance? VisibleLight, double? UltravioletIndex, Illuminance? Infrared)> ReadSensor()

Returns

Type Description
Task<(Illuminance? VisibleLight, double? UltravioletIndex, Illuminance? Infrared)>

Returns visible, ultraviolet index and infrared data

Overrides

Remarks

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

The SI1145 is a low power infrared, ultraviolet and ambient light sensor with an I2C interface.

  • Ultraviolet / Infrared / ambient light sensor
  • Proximity sensor
  • Independent LED drivers
  • I2C interface up to 3.4 MBps

Sample projects available on GitHub

Purchasing

The following application reads the sensor output Infrared, Ultraviolet and Visibility once per second and outputs the result on the output console:

Code Example

Si1145 sensor;

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

    sensor = new Si1145(Device.CreateI2cBus());

    // Example that uses an IObservable subscription to only be notified when the filter is satisfied
    var consumer = Si1145.CreateObserver(
        handler: result => Resolver.Log.Info($"Observer: filter satisfied: {result.New.VisibleLight?.Lux:N2}Lux, old: {result.Old?.VisibleLight?.Lux:N2}Lux"),

        // only notify if the visible light changes by 100 lux (put your hand over the sensor to trigger)
        filter: result =>
        {
            if (result.Old is { } old)
            {
                // returns true if > 100lux change
                return ((result.New.VisibleLight.Value - old.VisibleLight.Value).Abs().Lux > 100);
            }
            return false;
        });

    sensor.Subscribe(consumer);

    // classical .NET events can also be used:
    sensor.Updated += (sender, result) =>
    {
        Resolver.Log.Info($" Visible Light: {result.New.VisibleLight?.Lux:N2}Lux");
        Resolver.Log.Info($" Infrared Light: {result.New.Infrared?.Lux:N2}Lux");
        Resolver.Log.Info($" UV Index: {result.New.UltravioletIndex:N2}Lux");
    };

    return Task.CompletedTask;
}

public override async Task Run()
{
    var (VisibleLight, UltravioletIndex, Infrared) = await sensor.Read();

    Resolver.Log.Info("Initial Readings:");
    Resolver.Log.Info($" Visible Light: {VisibleLight?.Lux:N2}Lux");
    Resolver.Log.Info($" Infrared Light: {Infrared?.Lux:N2}Lux");
    Resolver.Log.Info($" UV Index: {UltravioletIndex:N2}Lux");

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

Sample project(s) available on GitHub

Wiring Example