Remarks

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

Code Example

NextPm nextPm;

public override Task Initialize()
{
    var port = Device
        .PlatformOS
        .GetSerialPortName("COM1")
        .CreateSerialPort();

    nextPm = new NextPm(port);

    nextPm.Readings10sUpdated += NextPm_Readings10sUpdated;

    return Task.CompletedTask;
}

private void NextPm_Readings10sUpdated(object sender, IChangeResult<ParticulateReading> e)
{
    Resolver.Log.Info($"Past 10 seconds");
    Resolver.Log.Info($"  {e.New.CountOf1micronParticles.ParticlesPerLiter:0} 1 micron particles per liter");
    Resolver.Log.Info($"  {e.New.CountOf2_5micronParticles.ParticlesPerLiter:0} 2.5 micron particles per liter");
    Resolver.Log.Info($"  {e.New.CountOf10micronParticles.ParticlesPerLiter:0} 10 micron particles per liter");
    Resolver.Log.Info($"  {e.New.EnvironmentalPM_1micron.MicroGramsPerMetersCubed:0} ug/L^3 1 micron particles");
    Resolver.Log.Info($"  {e.New.EnvironmentalPM_2_5micron.MicroGramsPerMetersCubed:0} ug/L^3 1 micron particles");
    Resolver.Log.Info($"  {e.New.EnvironmentalPM_10micron.MicroGramsPerMetersCubed:0} ug/L^3 1 micron particles");
}

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

    var firmware = await nextPm.GetFirmwareVersion();
    Resolver.Log.Info($"Firmware: 0x{firmware:X4}");

    var tempAndHumidity = await nextPm.GetTemperatureAndHumidity();
    Resolver.Log.Info($"Temp: {tempAndHumidity.temperature:0.0}C  Humidity: {tempAndHumidity.humidity}%");

    nextPm.StartUpdating();
}


Sample project(s) available on GitHub

Characteristic Locus
Inheritance object ObservableBase<(ParticulateReading? reading10s, ParticulateReading? reading1min, ParticulateReading? reading15min, Temperature? temperature, RelativeHumidity? humidity)> SamplingSensorBase<(ParticulateReading? reading10s, ParticulateReading? reading1min, ParticulateReading? reading15min, Temperature? temperature, RelativeHumidity? humidity)> PollingSensorBase<(ParticulateReading? reading10s, ParticulateReading? reading1min, ParticulateReading? reading15min, Temperature? temperature, RelativeHumidity? humidity)> > NextPm
Implements IObservable<IChangeResult<(ParticulateReading? reading10s, ParticulateReading? reading1min, ParticulateReading? reading15min, Temperature? temperature, RelativeHumidity? humidity)>> ISamplingSensor<(ParticulateReading? reading10s, ParticulateReading? reading1min, ParticulateReading? reading15min, Temperature? temperature, RelativeHumidity? humidity)> ISensor<(ParticulateReading? reading10s, ParticulateReading? reading1min, ParticulateReading? reading15min, Temperature? temperature, RelativeHumidity? humidity)> IDisposable IPowerControllablePeripheral
Inherited Members PollingSensorBase<(ParticulateReading? reading10s, ParticulateReading? reading1min, ParticulateReading? reading15min, Temperature? temperature, RelativeHumidity? humidity)>.StartUpdating(TimeSpan?) PollingSensorBase<(ParticulateReading? reading10s, ParticulateReading? reading1min, ParticulateReading? reading15min, Temperature? temperature, RelativeHumidity? humidity)>.StopUpdating() SamplingSensorBase<(ParticulateReading? reading10s, ParticulateReading? reading1min, ParticulateReading? reading15min, Temperature? temperature, RelativeHumidity? humidity)>.samplingLock SamplingSensorBase<(ParticulateReading? reading10s, ParticulateReading? reading1min, ParticulateReading? reading15min, Temperature? temperature, RelativeHumidity? humidity)>.Updated SamplingSensorBase<(ParticulateReading? reading10s, ParticulateReading? reading1min, ParticulateReading? reading15min, Temperature? temperature, RelativeHumidity? humidity)>.SamplingTokenSource SamplingSensorBase<(ParticulateReading? reading10s, ParticulateReading? reading1min, ParticulateReading? reading15min, Temperature? temperature, RelativeHumidity? humidity)>.Conditions SamplingSensorBase<(ParticulateReading? reading10s, ParticulateReading? reading1min, ParticulateReading? reading15min, Temperature? temperature, RelativeHumidity? humidity)>.IsSampling SamplingSensorBase<(ParticulateReading? reading10s, ParticulateReading? reading1min, ParticulateReading? reading15min, Temperature? temperature, RelativeHumidity? humidity)>.UpdateInterval SamplingSensorBase<(ParticulateReading? reading10s, ParticulateReading? reading1min, ParticulateReading? reading15min, Temperature? temperature, RelativeHumidity? humidity)>.ReadSensor() SamplingSensorBase<(ParticulateReading? reading10s, ParticulateReading? reading1min, ParticulateReading? reading15min, Temperature? temperature, RelativeHumidity? humidity)>.RaiseEventsAndNotify(IChangeResult<(ParticulateReading? reading10s, ParticulateReading? reading1min, ParticulateReading? reading15min, Temperature? temperature, RelativeHumidity? humidity)>) SamplingSensorBase<(ParticulateReading? reading10s, ParticulateReading? reading1min, ParticulateReading? reading15min, Temperature? temperature, RelativeHumidity? humidity)>.Read() ObservableBase<(ParticulateReading? reading10s, ParticulateReading? reading1min, ParticulateReading? reading15min, Temperature? temperature, RelativeHumidity? humidity)>.observers ObservableBase<(ParticulateReading? reading10s, ParticulateReading? reading1min, ParticulateReading? reading15min, Temperature? temperature, RelativeHumidity? humidity)>.NotifyObservers(IChangeResult<(ParticulateReading? reading10s, ParticulateReading? reading1min, ParticulateReading? reading15min, Temperature? temperature, RelativeHumidity? humidity)>) ObservableBase<(ParticulateReading? reading10s, ParticulateReading? reading1min, ParticulateReading? reading15min, Temperature? temperature, RelativeHumidity? humidity)>.Subscribe(IObserver<IChangeResult<(ParticulateReading? reading10s, ParticulateReading? reading1min, ParticulateReading? reading15min, Temperature? temperature, RelativeHumidity? humidity)>>) ObservableBase<(ParticulateReading? reading10s, ParticulateReading? reading1min, ParticulateReading? reading15min, Temperature? temperature, RelativeHumidity? humidity)>.CreateObserver(Action<IChangeResult<(ParticulateReading? reading10s, ParticulateReading? reading1min, ParticulateReading? reading15min, Temperature? temperature, RelativeHumidity? humidity)>>, Predicate<IChangeResult<(ParticulateReading? reading10s, ParticulateReading? reading1min, ParticulateReading? reading15min, Temperature? temperature, RelativeHumidity? humidity)>>) object.Equals(object) object.Equals(object, object) object.GetHashCode() object.GetType() object.MemberwiseClone() object.ReferenceEquals(object, object) object.ToString()
Namespace Meadow.Foundation.Sensors.Environmental
Assembly NextPm.dll

Syntax

public class NextPm : PollingSensorBase<(ParticulateReading? reading10s, ParticulateReading? reading1min, ParticulateReading? reading15min, Temperature? temperature, RelativeHumidity? humidity)>, IObservable<IChangeResult<(ParticulateReading? reading10s, ParticulateReading? reading1min, ParticulateReading? reading15min, Temperature? temperature, RelativeHumidity? humidity)>>, ISamplingSensor<(ParticulateReading? reading10s, ParticulateReading? reading1min, ParticulateReading? reading15min, Temperature? temperature, RelativeHumidity? humidity)>, ISensor<(ParticulateReading? reading10s, ParticulateReading? reading1min, ParticulateReading? reading15min, Temperature? temperature, RelativeHumidity? humidity)>, IDisposable, IPowerControllablePeripheral

Constructors

NextPm(ISerialPort)

Creates a NextPm instance

Declaration
public NextPm(ISerialPort serialPort)

Parameters

Type Name Description
ISerialPort serialPort

The serial serialPort

Remarks

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

Code Example

NextPm nextPm;

public override Task Initialize()
{
    var port = Device
        .PlatformOS
        .GetSerialPortName("COM1")
        .CreateSerialPort();

    nextPm = new NextPm(port);

    nextPm.Readings10sUpdated += NextPm_Readings10sUpdated;

    return Task.CompletedTask;
}

private void NextPm_Readings10sUpdated(object sender, IChangeResult<ParticulateReading> e)
{
    Resolver.Log.Info($"Past 10 seconds");
    Resolver.Log.Info($"  {e.New.CountOf1micronParticles.ParticlesPerLiter:0} 1 micron particles per liter");
    Resolver.Log.Info($"  {e.New.CountOf2_5micronParticles.ParticlesPerLiter:0} 2.5 micron particles per liter");
    Resolver.Log.Info($"  {e.New.CountOf10micronParticles.ParticlesPerLiter:0} 10 micron particles per liter");
    Resolver.Log.Info($"  {e.New.EnvironmentalPM_1micron.MicroGramsPerMetersCubed:0} ug/L^3 1 micron particles");
    Resolver.Log.Info($"  {e.New.EnvironmentalPM_2_5micron.MicroGramsPerMetersCubed:0} ug/L^3 1 micron particles");
    Resolver.Log.Info($"  {e.New.EnvironmentalPM_10micron.MicroGramsPerMetersCubed:0} ug/L^3 1 micron particles");
}

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

    var firmware = await nextPm.GetFirmwareVersion();
    Resolver.Log.Info($"Firmware: 0x{firmware:X4}");

    var tempAndHumidity = await nextPm.GetTemperatureAndHumidity();
    Resolver.Log.Info($"Temp: {tempAndHumidity.temperature:0.0}C  Humidity: {tempAndHumidity.humidity}%");

    nextPm.StartUpdating();
}


Sample project(s) available on GitHub

NextPm(SerialPortName)

Creates a NextPm instance

Declaration
public NextPm(SerialPortName portName)

Parameters

Type Name Description
SerialPortName portName

The serial serialPort name

Remarks

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

Code Example

NextPm nextPm;

public override Task Initialize()
{
    var port = Device
        .PlatformOS
        .GetSerialPortName("COM1")
        .CreateSerialPort();

    nextPm = new NextPm(port);

    nextPm.Readings10sUpdated += NextPm_Readings10sUpdated;

    return Task.CompletedTask;
}

private void NextPm_Readings10sUpdated(object sender, IChangeResult<ParticulateReading> e)
{
    Resolver.Log.Info($"Past 10 seconds");
    Resolver.Log.Info($"  {e.New.CountOf1micronParticles.ParticlesPerLiter:0} 1 micron particles per liter");
    Resolver.Log.Info($"  {e.New.CountOf2_5micronParticles.ParticlesPerLiter:0} 2.5 micron particles per liter");
    Resolver.Log.Info($"  {e.New.CountOf10micronParticles.ParticlesPerLiter:0} 10 micron particles per liter");
    Resolver.Log.Info($"  {e.New.EnvironmentalPM_1micron.MicroGramsPerMetersCubed:0} ug/L^3 1 micron particles");
    Resolver.Log.Info($"  {e.New.EnvironmentalPM_2_5micron.MicroGramsPerMetersCubed:0} ug/L^3 1 micron particles");
    Resolver.Log.Info($"  {e.New.EnvironmentalPM_10micron.MicroGramsPerMetersCubed:0} ug/L^3 1 micron particles");
}

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

    var firmware = await nextPm.GetFirmwareVersion();
    Resolver.Log.Info($"Firmware: 0x{firmware:X4}");

    var tempAndHumidity = await nextPm.GetTemperatureAndHumidity();
    Resolver.Log.Info($"Temp: {tempAndHumidity.temperature:0.0}C  Humidity: {tempAndHumidity.humidity}%");

    nextPm.StartUpdating();
}


Sample project(s) available on GitHub

Properties

IsDisposed

Returns true if the object is disposed, otherwise false

Declaration
public bool IsDisposed { get; }

Property Value

Type Description
bool

Remarks

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

Code Example

NextPm nextPm;

public override Task Initialize()
{
    var port = Device
        .PlatformOS
        .GetSerialPortName("COM1")
        .CreateSerialPort();

    nextPm = new NextPm(port);

    nextPm.Readings10sUpdated += NextPm_Readings10sUpdated;

    return Task.CompletedTask;
}

private void NextPm_Readings10sUpdated(object sender, IChangeResult<ParticulateReading> e)
{
    Resolver.Log.Info($"Past 10 seconds");
    Resolver.Log.Info($"  {e.New.CountOf1micronParticles.ParticlesPerLiter:0} 1 micron particles per liter");
    Resolver.Log.Info($"  {e.New.CountOf2_5micronParticles.ParticlesPerLiter:0} 2.5 micron particles per liter");
    Resolver.Log.Info($"  {e.New.CountOf10micronParticles.ParticlesPerLiter:0} 10 micron particles per liter");
    Resolver.Log.Info($"  {e.New.EnvironmentalPM_1micron.MicroGramsPerMetersCubed:0} ug/L^3 1 micron particles");
    Resolver.Log.Info($"  {e.New.EnvironmentalPM_2_5micron.MicroGramsPerMetersCubed:0} ug/L^3 1 micron particles");
    Resolver.Log.Info($"  {e.New.EnvironmentalPM_10micron.MicroGramsPerMetersCubed:0} ug/L^3 1 micron particles");
}

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

    var firmware = await nextPm.GetFirmwareVersion();
    Resolver.Log.Info($"Firmware: 0x{firmware:X4}");

    var tempAndHumidity = await nextPm.GetTemperatureAndHumidity();
    Resolver.Log.Info($"Temp: {tempAndHumidity.temperature:0.0}C  Humidity: {tempAndHumidity.humidity}%");

    nextPm.StartUpdating();
}


Sample project(s) available on GitHub

Methods

Dispose()

Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.

Declaration
public void Dispose()

Remarks

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

Code Example

NextPm nextPm;

public override Task Initialize()
{
    var port = Device
        .PlatformOS
        .GetSerialPortName("COM1")
        .CreateSerialPort();

    nextPm = new NextPm(port);

    nextPm.Readings10sUpdated += NextPm_Readings10sUpdated;

    return Task.CompletedTask;
}

private void NextPm_Readings10sUpdated(object sender, IChangeResult<ParticulateReading> e)
{
    Resolver.Log.Info($"Past 10 seconds");
    Resolver.Log.Info($"  {e.New.CountOf1micronParticles.ParticlesPerLiter:0} 1 micron particles per liter");
    Resolver.Log.Info($"  {e.New.CountOf2_5micronParticles.ParticlesPerLiter:0} 2.5 micron particles per liter");
    Resolver.Log.Info($"  {e.New.CountOf10micronParticles.ParticlesPerLiter:0} 10 micron particles per liter");
    Resolver.Log.Info($"  {e.New.EnvironmentalPM_1micron.MicroGramsPerMetersCubed:0} ug/L^3 1 micron particles");
    Resolver.Log.Info($"  {e.New.EnvironmentalPM_2_5micron.MicroGramsPerMetersCubed:0} ug/L^3 1 micron particles");
    Resolver.Log.Info($"  {e.New.EnvironmentalPM_10micron.MicroGramsPerMetersCubed:0} ug/L^3 1 micron particles");
}

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

    var firmware = await nextPm.GetFirmwareVersion();
    Resolver.Log.Info($"Firmware: 0x{firmware:X4}");

    var tempAndHumidity = await nextPm.GetTemperatureAndHumidity();
    Resolver.Log.Info($"Temp: {tempAndHumidity.temperature:0.0}C  Humidity: {tempAndHumidity.humidity}%");

    nextPm.StartUpdating();
}


Sample project(s) available on GitHub

Dispose(bool)

Dispose of the object

Declaration
protected virtual void Dispose(bool disposing)

Parameters

Type Name Description
bool disposing

Is disposing

Remarks

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

Code Example

NextPm nextPm;

public override Task Initialize()
{
    var port = Device
        .PlatformOS
        .GetSerialPortName("COM1")
        .CreateSerialPort();

    nextPm = new NextPm(port);

    nextPm.Readings10sUpdated += NextPm_Readings10sUpdated;

    return Task.CompletedTask;
}

private void NextPm_Readings10sUpdated(object sender, IChangeResult<ParticulateReading> e)
{
    Resolver.Log.Info($"Past 10 seconds");
    Resolver.Log.Info($"  {e.New.CountOf1micronParticles.ParticlesPerLiter:0} 1 micron particles per liter");
    Resolver.Log.Info($"  {e.New.CountOf2_5micronParticles.ParticlesPerLiter:0} 2.5 micron particles per liter");
    Resolver.Log.Info($"  {e.New.CountOf10micronParticles.ParticlesPerLiter:0} 10 micron particles per liter");
    Resolver.Log.Info($"  {e.New.EnvironmentalPM_1micron.MicroGramsPerMetersCubed:0} ug/L^3 1 micron particles");
    Resolver.Log.Info($"  {e.New.EnvironmentalPM_2_5micron.MicroGramsPerMetersCubed:0} ug/L^3 1 micron particles");
    Resolver.Log.Info($"  {e.New.EnvironmentalPM_10micron.MicroGramsPerMetersCubed:0} ug/L^3 1 micron particles");
}

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

    var firmware = await nextPm.GetFirmwareVersion();
    Resolver.Log.Info($"Firmware: 0x{firmware:X4}");

    var tempAndHumidity = await nextPm.GetTemperatureAndHumidity();
    Resolver.Log.Info($"Temp: {tempAndHumidity.temperature:0.0}C  Humidity: {tempAndHumidity.humidity}%");

    nextPm.StartUpdating();
}


Sample project(s) available on GitHub

Get10SecondAverageReading()

Gets the average particulate reading for the past 10 seconds

Declaration
public Task<ParticulateReading> Get10SecondAverageReading()

Returns

Type Description
Task<ParticulateReading>

Remarks

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

Code Example

NextPm nextPm;

public override Task Initialize()
{
    var port = Device
        .PlatformOS
        .GetSerialPortName("COM1")
        .CreateSerialPort();

    nextPm = new NextPm(port);

    nextPm.Readings10sUpdated += NextPm_Readings10sUpdated;

    return Task.CompletedTask;
}

private void NextPm_Readings10sUpdated(object sender, IChangeResult<ParticulateReading> e)
{
    Resolver.Log.Info($"Past 10 seconds");
    Resolver.Log.Info($"  {e.New.CountOf1micronParticles.ParticlesPerLiter:0} 1 micron particles per liter");
    Resolver.Log.Info($"  {e.New.CountOf2_5micronParticles.ParticlesPerLiter:0} 2.5 micron particles per liter");
    Resolver.Log.Info($"  {e.New.CountOf10micronParticles.ParticlesPerLiter:0} 10 micron particles per liter");
    Resolver.Log.Info($"  {e.New.EnvironmentalPM_1micron.MicroGramsPerMetersCubed:0} ug/L^3 1 micron particles");
    Resolver.Log.Info($"  {e.New.EnvironmentalPM_2_5micron.MicroGramsPerMetersCubed:0} ug/L^3 1 micron particles");
    Resolver.Log.Info($"  {e.New.EnvironmentalPM_10micron.MicroGramsPerMetersCubed:0} ug/L^3 1 micron particles");
}

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

    var firmware = await nextPm.GetFirmwareVersion();
    Resolver.Log.Info($"Firmware: 0x{firmware:X4}");

    var tempAndHumidity = await nextPm.GetTemperatureAndHumidity();
    Resolver.Log.Info($"Temp: {tempAndHumidity.temperature:0.0}C  Humidity: {tempAndHumidity.humidity}%");

    nextPm.StartUpdating();
}


Sample project(s) available on GitHub

Get15MinuteAverageReading()

Gets the average particulate reading for the past 15 minutes

Declaration
public Task<ParticulateReading> Get15MinuteAverageReading()

Returns

Type Description
Task<ParticulateReading>

Remarks

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

Code Example

NextPm nextPm;

public override Task Initialize()
{
    var port = Device
        .PlatformOS
        .GetSerialPortName("COM1")
        .CreateSerialPort();

    nextPm = new NextPm(port);

    nextPm.Readings10sUpdated += NextPm_Readings10sUpdated;

    return Task.CompletedTask;
}

private void NextPm_Readings10sUpdated(object sender, IChangeResult<ParticulateReading> e)
{
    Resolver.Log.Info($"Past 10 seconds");
    Resolver.Log.Info($"  {e.New.CountOf1micronParticles.ParticlesPerLiter:0} 1 micron particles per liter");
    Resolver.Log.Info($"  {e.New.CountOf2_5micronParticles.ParticlesPerLiter:0} 2.5 micron particles per liter");
    Resolver.Log.Info($"  {e.New.CountOf10micronParticles.ParticlesPerLiter:0} 10 micron particles per liter");
    Resolver.Log.Info($"  {e.New.EnvironmentalPM_1micron.MicroGramsPerMetersCubed:0} ug/L^3 1 micron particles");
    Resolver.Log.Info($"  {e.New.EnvironmentalPM_2_5micron.MicroGramsPerMetersCubed:0} ug/L^3 1 micron particles");
    Resolver.Log.Info($"  {e.New.EnvironmentalPM_10micron.MicroGramsPerMetersCubed:0} ug/L^3 1 micron particles");
}

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

    var firmware = await nextPm.GetFirmwareVersion();
    Resolver.Log.Info($"Firmware: 0x{firmware:X4}");

    var tempAndHumidity = await nextPm.GetTemperatureAndHumidity();
    Resolver.Log.Info($"Temp: {tempAndHumidity.temperature:0.0}C  Humidity: {tempAndHumidity.humidity}%");

    nextPm.StartUpdating();
}


Sample project(s) available on GitHub

Get1MinuteAverageReading()

Gets the average particulate reading for the past 60 seconds

Declaration
public Task<ParticulateReading> Get1MinuteAverageReading()

Returns

Type Description
Task<ParticulateReading>

Remarks

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

Code Example

NextPm nextPm;

public override Task Initialize()
{
    var port = Device
        .PlatformOS
        .GetSerialPortName("COM1")
        .CreateSerialPort();

    nextPm = new NextPm(port);

    nextPm.Readings10sUpdated += NextPm_Readings10sUpdated;

    return Task.CompletedTask;
}

private void NextPm_Readings10sUpdated(object sender, IChangeResult<ParticulateReading> e)
{
    Resolver.Log.Info($"Past 10 seconds");
    Resolver.Log.Info($"  {e.New.CountOf1micronParticles.ParticlesPerLiter:0} 1 micron particles per liter");
    Resolver.Log.Info($"  {e.New.CountOf2_5micronParticles.ParticlesPerLiter:0} 2.5 micron particles per liter");
    Resolver.Log.Info($"  {e.New.CountOf10micronParticles.ParticlesPerLiter:0} 10 micron particles per liter");
    Resolver.Log.Info($"  {e.New.EnvironmentalPM_1micron.MicroGramsPerMetersCubed:0} ug/L^3 1 micron particles");
    Resolver.Log.Info($"  {e.New.EnvironmentalPM_2_5micron.MicroGramsPerMetersCubed:0} ug/L^3 1 micron particles");
    Resolver.Log.Info($"  {e.New.EnvironmentalPM_10micron.MicroGramsPerMetersCubed:0} ug/L^3 1 micron particles");
}

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

    var firmware = await nextPm.GetFirmwareVersion();
    Resolver.Log.Info($"Firmware: 0x{firmware:X4}");

    var tempAndHumidity = await nextPm.GetTemperatureAndHumidity();
    Resolver.Log.Info($"Temp: {tempAndHumidity.temperature:0.0}C  Humidity: {tempAndHumidity.humidity}%");

    nextPm.StartUpdating();
}


Sample project(s) available on GitHub

GetFanSpeed()

Gets the fan speed (in percentage)

Declaration
public Task<int> GetFanSpeed()

Returns

Type Description
Task<int>

Remarks

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

Code Example

NextPm nextPm;

public override Task Initialize()
{
    var port = Device
        .PlatformOS
        .GetSerialPortName("COM1")
        .CreateSerialPort();

    nextPm = new NextPm(port);

    nextPm.Readings10sUpdated += NextPm_Readings10sUpdated;

    return Task.CompletedTask;
}

private void NextPm_Readings10sUpdated(object sender, IChangeResult<ParticulateReading> e)
{
    Resolver.Log.Info($"Past 10 seconds");
    Resolver.Log.Info($"  {e.New.CountOf1micronParticles.ParticlesPerLiter:0} 1 micron particles per liter");
    Resolver.Log.Info($"  {e.New.CountOf2_5micronParticles.ParticlesPerLiter:0} 2.5 micron particles per liter");
    Resolver.Log.Info($"  {e.New.CountOf10micronParticles.ParticlesPerLiter:0} 10 micron particles per liter");
    Resolver.Log.Info($"  {e.New.EnvironmentalPM_1micron.MicroGramsPerMetersCubed:0} ug/L^3 1 micron particles");
    Resolver.Log.Info($"  {e.New.EnvironmentalPM_2_5micron.MicroGramsPerMetersCubed:0} ug/L^3 1 micron particles");
    Resolver.Log.Info($"  {e.New.EnvironmentalPM_10micron.MicroGramsPerMetersCubed:0} ug/L^3 1 micron particles");
}

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

    var firmware = await nextPm.GetFirmwareVersion();
    Resolver.Log.Info($"Firmware: 0x{firmware:X4}");

    var tempAndHumidity = await nextPm.GetTemperatureAndHumidity();
    Resolver.Log.Info($"Temp: {tempAndHumidity.temperature:0.0}C  Humidity: {tempAndHumidity.humidity}%");

    nextPm.StartUpdating();
}


Sample project(s) available on GitHub

GetFirmwareVersion()

Gets the sensor's firmware

Declaration
public Task<short> GetFirmwareVersion()

Returns

Type Description
Task<short>

The sensor's firmware version

Remarks

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

Code Example

NextPm nextPm;

public override Task Initialize()
{
    var port = Device
        .PlatformOS
        .GetSerialPortName("COM1")
        .CreateSerialPort();

    nextPm = new NextPm(port);

    nextPm.Readings10sUpdated += NextPm_Readings10sUpdated;

    return Task.CompletedTask;
}

private void NextPm_Readings10sUpdated(object sender, IChangeResult<ParticulateReading> e)
{
    Resolver.Log.Info($"Past 10 seconds");
    Resolver.Log.Info($"  {e.New.CountOf1micronParticles.ParticlesPerLiter:0} 1 micron particles per liter");
    Resolver.Log.Info($"  {e.New.CountOf2_5micronParticles.ParticlesPerLiter:0} 2.5 micron particles per liter");
    Resolver.Log.Info($"  {e.New.CountOf10micronParticles.ParticlesPerLiter:0} 10 micron particles per liter");
    Resolver.Log.Info($"  {e.New.EnvironmentalPM_1micron.MicroGramsPerMetersCubed:0} ug/L^3 1 micron particles");
    Resolver.Log.Info($"  {e.New.EnvironmentalPM_2_5micron.MicroGramsPerMetersCubed:0} ug/L^3 1 micron particles");
    Resolver.Log.Info($"  {e.New.EnvironmentalPM_10micron.MicroGramsPerMetersCubed:0} ug/L^3 1 micron particles");
}

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

    var firmware = await nextPm.GetFirmwareVersion();
    Resolver.Log.Info($"Firmware: 0x{firmware:X4}");

    var tempAndHumidity = await nextPm.GetTemperatureAndHumidity();
    Resolver.Log.Info($"Temp: {tempAndHumidity.temperature:0.0}C  Humidity: {tempAndHumidity.humidity}%");

    nextPm.StartUpdating();
}


Sample project(s) available on GitHub

GetTemperatureAndHumidity()

Gets the sensor's current Temperature and Humidity readings

Declaration
public Task<(Temperature temperature, RelativeHumidity humidity)> GetTemperatureAndHumidity()

Returns

Type Description
Task<(Temperature temperature, RelativeHumidity humidity)>

Remarks

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

Code Example

NextPm nextPm;

public override Task Initialize()
{
    var port = Device
        .PlatformOS
        .GetSerialPortName("COM1")
        .CreateSerialPort();

    nextPm = new NextPm(port);

    nextPm.Readings10sUpdated += NextPm_Readings10sUpdated;

    return Task.CompletedTask;
}

private void NextPm_Readings10sUpdated(object sender, IChangeResult<ParticulateReading> e)
{
    Resolver.Log.Info($"Past 10 seconds");
    Resolver.Log.Info($"  {e.New.CountOf1micronParticles.ParticlesPerLiter:0} 1 micron particles per liter");
    Resolver.Log.Info($"  {e.New.CountOf2_5micronParticles.ParticlesPerLiter:0} 2.5 micron particles per liter");
    Resolver.Log.Info($"  {e.New.CountOf10micronParticles.ParticlesPerLiter:0} 10 micron particles per liter");
    Resolver.Log.Info($"  {e.New.EnvironmentalPM_1micron.MicroGramsPerMetersCubed:0} ug/L^3 1 micron particles");
    Resolver.Log.Info($"  {e.New.EnvironmentalPM_2_5micron.MicroGramsPerMetersCubed:0} ug/L^3 1 micron particles");
    Resolver.Log.Info($"  {e.New.EnvironmentalPM_10micron.MicroGramsPerMetersCubed:0} ug/L^3 1 micron particles");
}

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

    var firmware = await nextPm.GetFirmwareVersion();
    Resolver.Log.Info($"Firmware: 0x{firmware:X4}");

    var tempAndHumidity = await nextPm.GetTemperatureAndHumidity();
    Resolver.Log.Info($"Temp: {tempAndHumidity.temperature:0.0}C  Humidity: {tempAndHumidity.humidity}%");

    nextPm.StartUpdating();
}


Sample project(s) available on GitHub

IsAsleep()

Checks to see if the sensor is in Sleep mode

Declaration
public Task<bool> IsAsleep()

Returns

Type Description
Task<bool>

True if the sensor is in Sleep mode

Remarks

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

Code Example

NextPm nextPm;

public override Task Initialize()
{
    var port = Device
        .PlatformOS
        .GetSerialPortName("COM1")
        .CreateSerialPort();

    nextPm = new NextPm(port);

    nextPm.Readings10sUpdated += NextPm_Readings10sUpdated;

    return Task.CompletedTask;
}

private void NextPm_Readings10sUpdated(object sender, IChangeResult<ParticulateReading> e)
{
    Resolver.Log.Info($"Past 10 seconds");
    Resolver.Log.Info($"  {e.New.CountOf1micronParticles.ParticlesPerLiter:0} 1 micron particles per liter");
    Resolver.Log.Info($"  {e.New.CountOf2_5micronParticles.ParticlesPerLiter:0} 2.5 micron particles per liter");
    Resolver.Log.Info($"  {e.New.CountOf10micronParticles.ParticlesPerLiter:0} 10 micron particles per liter");
    Resolver.Log.Info($"  {e.New.EnvironmentalPM_1micron.MicroGramsPerMetersCubed:0} ug/L^3 1 micron particles");
    Resolver.Log.Info($"  {e.New.EnvironmentalPM_2_5micron.MicroGramsPerMetersCubed:0} ug/L^3 1 micron particles");
    Resolver.Log.Info($"  {e.New.EnvironmentalPM_10micron.MicroGramsPerMetersCubed:0} ug/L^3 1 micron particles");
}

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

    var firmware = await nextPm.GetFirmwareVersion();
    Resolver.Log.Info($"Firmware: 0x{firmware:X4}");

    var tempAndHumidity = await nextPm.GetTemperatureAndHumidity();
    Resolver.Log.Info($"Temp: {tempAndHumidity.temperature:0.0}C  Humidity: {tempAndHumidity.humidity}%");

    nextPm.StartUpdating();
}


Sample project(s) available on GitHub

PowerOff()

Puts the device into Sleep mode

Declaration
public Task PowerOff()

Returns

Type Description
Task

Remarks

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

Code Example

NextPm nextPm;

public override Task Initialize()
{
    var port = Device
        .PlatformOS
        .GetSerialPortName("COM1")
        .CreateSerialPort();

    nextPm = new NextPm(port);

    nextPm.Readings10sUpdated += NextPm_Readings10sUpdated;

    return Task.CompletedTask;
}

private void NextPm_Readings10sUpdated(object sender, IChangeResult<ParticulateReading> e)
{
    Resolver.Log.Info($"Past 10 seconds");
    Resolver.Log.Info($"  {e.New.CountOf1micronParticles.ParticlesPerLiter:0} 1 micron particles per liter");
    Resolver.Log.Info($"  {e.New.CountOf2_5micronParticles.ParticlesPerLiter:0} 2.5 micron particles per liter");
    Resolver.Log.Info($"  {e.New.CountOf10micronParticles.ParticlesPerLiter:0} 10 micron particles per liter");
    Resolver.Log.Info($"  {e.New.EnvironmentalPM_1micron.MicroGramsPerMetersCubed:0} ug/L^3 1 micron particles");
    Resolver.Log.Info($"  {e.New.EnvironmentalPM_2_5micron.MicroGramsPerMetersCubed:0} ug/L^3 1 micron particles");
    Resolver.Log.Info($"  {e.New.EnvironmentalPM_10micron.MicroGramsPerMetersCubed:0} ug/L^3 1 micron particles");
}

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

    var firmware = await nextPm.GetFirmwareVersion();
    Resolver.Log.Info($"Firmware: 0x{firmware:X4}");

    var tempAndHumidity = await nextPm.GetTemperatureAndHumidity();
    Resolver.Log.Info($"Temp: {tempAndHumidity.temperature:0.0}C  Humidity: {tempAndHumidity.humidity}%");

    nextPm.StartUpdating();
}


Sample project(s) available on GitHub

PowerOn()

Wakes the device from Sleep mode

Declaration
public Task PowerOn()

Returns

Type Description
Task

Remarks

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

Code Example

NextPm nextPm;

public override Task Initialize()
{
    var port = Device
        .PlatformOS
        .GetSerialPortName("COM1")
        .CreateSerialPort();

    nextPm = new NextPm(port);

    nextPm.Readings10sUpdated += NextPm_Readings10sUpdated;

    return Task.CompletedTask;
}

private void NextPm_Readings10sUpdated(object sender, IChangeResult<ParticulateReading> e)
{
    Resolver.Log.Info($"Past 10 seconds");
    Resolver.Log.Info($"  {e.New.CountOf1micronParticles.ParticlesPerLiter:0} 1 micron particles per liter");
    Resolver.Log.Info($"  {e.New.CountOf2_5micronParticles.ParticlesPerLiter:0} 2.5 micron particles per liter");
    Resolver.Log.Info($"  {e.New.CountOf10micronParticles.ParticlesPerLiter:0} 10 micron particles per liter");
    Resolver.Log.Info($"  {e.New.EnvironmentalPM_1micron.MicroGramsPerMetersCubed:0} ug/L^3 1 micron particles");
    Resolver.Log.Info($"  {e.New.EnvironmentalPM_2_5micron.MicroGramsPerMetersCubed:0} ug/L^3 1 micron particles");
    Resolver.Log.Info($"  {e.New.EnvironmentalPM_10micron.MicroGramsPerMetersCubed:0} ug/L^3 1 micron particles");
}

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

    var firmware = await nextPm.GetFirmwareVersion();
    Resolver.Log.Info($"Firmware: 0x{firmware:X4}");

    var tempAndHumidity = await nextPm.GetTemperatureAndHumidity();
    Resolver.Log.Info($"Temp: {tempAndHumidity.temperature:0.0}C  Humidity: {tempAndHumidity.humidity}%");

    nextPm.StartUpdating();
}


Sample project(s) available on GitHub

RaiseEventsAndNotify(IChangeResult<(ParticulateReading? reading10s, ParticulateReading? reading1min, ParticulateReading? reading15min, Temperature? temperature, RelativeHumidity? humidity)>)

Notify observers

Declaration
protected override void RaiseEventsAndNotify(IChangeResult<(ParticulateReading? reading10s, ParticulateReading? reading1min, ParticulateReading? reading15min, Temperature? temperature, RelativeHumidity? humidity)> changeResult)

Parameters

Type Name Description
IChangeResult<(ParticulateReading? reading10s, ParticulateReading? reading1min, ParticulateReading? reading15min, Temperature? temperature, RelativeHumidity? humidity)> changeResult

provides new and old values

Overrides

Remarks

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

Code Example

NextPm nextPm;

public override Task Initialize()
{
    var port = Device
        .PlatformOS
        .GetSerialPortName("COM1")
        .CreateSerialPort();

    nextPm = new NextPm(port);

    nextPm.Readings10sUpdated += NextPm_Readings10sUpdated;

    return Task.CompletedTask;
}

private void NextPm_Readings10sUpdated(object sender, IChangeResult<ParticulateReading> e)
{
    Resolver.Log.Info($"Past 10 seconds");
    Resolver.Log.Info($"  {e.New.CountOf1micronParticles.ParticlesPerLiter:0} 1 micron particles per liter");
    Resolver.Log.Info($"  {e.New.CountOf2_5micronParticles.ParticlesPerLiter:0} 2.5 micron particles per liter");
    Resolver.Log.Info($"  {e.New.CountOf10micronParticles.ParticlesPerLiter:0} 10 micron particles per liter");
    Resolver.Log.Info($"  {e.New.EnvironmentalPM_1micron.MicroGramsPerMetersCubed:0} ug/L^3 1 micron particles");
    Resolver.Log.Info($"  {e.New.EnvironmentalPM_2_5micron.MicroGramsPerMetersCubed:0} ug/L^3 1 micron particles");
    Resolver.Log.Info($"  {e.New.EnvironmentalPM_10micron.MicroGramsPerMetersCubed:0} ug/L^3 1 micron particles");
}

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

    var firmware = await nextPm.GetFirmwareVersion();
    Resolver.Log.Info($"Firmware: 0x{firmware:X4}");

    var tempAndHumidity = await nextPm.GetTemperatureAndHumidity();
    Resolver.Log.Info($"Temp: {tempAndHumidity.temperature:0.0}C  Humidity: {tempAndHumidity.humidity}%");

    nextPm.StartUpdating();
}


Sample project(s) available on GitHub

ReadSensor()

Read value from sensor

Declaration
protected override Task<(ParticulateReading? reading10s, ParticulateReading? reading1min, ParticulateReading? reading15min, Temperature? temperature, RelativeHumidity? humidity)> ReadSensor()

Returns

Type Description
Task<(ParticulateReading? reading10s, ParticulateReading? reading1min, ParticulateReading? reading15min, Temperature? temperature, RelativeHumidity? humidity)>

unitized value

Overrides

Remarks

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

Code Example

NextPm nextPm;

public override Task Initialize()
{
    var port = Device
        .PlatformOS
        .GetSerialPortName("COM1")
        .CreateSerialPort();

    nextPm = new NextPm(port);

    nextPm.Readings10sUpdated += NextPm_Readings10sUpdated;

    return Task.CompletedTask;
}

private void NextPm_Readings10sUpdated(object sender, IChangeResult<ParticulateReading> e)
{
    Resolver.Log.Info($"Past 10 seconds");
    Resolver.Log.Info($"  {e.New.CountOf1micronParticles.ParticlesPerLiter:0} 1 micron particles per liter");
    Resolver.Log.Info($"  {e.New.CountOf2_5micronParticles.ParticlesPerLiter:0} 2.5 micron particles per liter");
    Resolver.Log.Info($"  {e.New.CountOf10micronParticles.ParticlesPerLiter:0} 10 micron particles per liter");
    Resolver.Log.Info($"  {e.New.EnvironmentalPM_1micron.MicroGramsPerMetersCubed:0} ug/L^3 1 micron particles");
    Resolver.Log.Info($"  {e.New.EnvironmentalPM_2_5micron.MicroGramsPerMetersCubed:0} ug/L^3 1 micron particles");
    Resolver.Log.Info($"  {e.New.EnvironmentalPM_10micron.MicroGramsPerMetersCubed:0} ug/L^3 1 micron particles");
}

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

    var firmware = await nextPm.GetFirmwareVersion();
    Resolver.Log.Info($"Firmware: 0x{firmware:X4}");

    var tempAndHumidity = await nextPm.GetTemperatureAndHumidity();
    Resolver.Log.Info($"Temp: {tempAndHumidity.temperature:0.0}C  Humidity: {tempAndHumidity.humidity}%");

    nextPm.StartUpdating();
}


Sample project(s) available on GitHub

SetFanSpeed(int)

Sets the sensor fan speed (in percentage)

Declaration
public Task SetFanSpeed(int speedPercent)

Parameters

Type Name Description
int speedPercent

Returns

Type Description
Task

Remarks

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

Code Example

NextPm nextPm;

public override Task Initialize()
{
    var port = Device
        .PlatformOS
        .GetSerialPortName("COM1")
        .CreateSerialPort();

    nextPm = new NextPm(port);

    nextPm.Readings10sUpdated += NextPm_Readings10sUpdated;

    return Task.CompletedTask;
}

private void NextPm_Readings10sUpdated(object sender, IChangeResult<ParticulateReading> e)
{
    Resolver.Log.Info($"Past 10 seconds");
    Resolver.Log.Info($"  {e.New.CountOf1micronParticles.ParticlesPerLiter:0} 1 micron particles per liter");
    Resolver.Log.Info($"  {e.New.CountOf2_5micronParticles.ParticlesPerLiter:0} 2.5 micron particles per liter");
    Resolver.Log.Info($"  {e.New.CountOf10micronParticles.ParticlesPerLiter:0} 10 micron particles per liter");
    Resolver.Log.Info($"  {e.New.EnvironmentalPM_1micron.MicroGramsPerMetersCubed:0} ug/L^3 1 micron particles");
    Resolver.Log.Info($"  {e.New.EnvironmentalPM_2_5micron.MicroGramsPerMetersCubed:0} ug/L^3 1 micron particles");
    Resolver.Log.Info($"  {e.New.EnvironmentalPM_10micron.MicroGramsPerMetersCubed:0} ug/L^3 1 micron particles");
}

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

    var firmware = await nextPm.GetFirmwareVersion();
    Resolver.Log.Info($"Firmware: 0x{firmware:X4}");

    var tempAndHumidity = await nextPm.GetTemperatureAndHumidity();
    Resolver.Log.Info($"Temp: {tempAndHumidity.temperature:0.0}C  Humidity: {tempAndHumidity.humidity}%");

    nextPm.StartUpdating();
}


Sample project(s) available on GitHub

Exceptions

Type Condition
ArgumentOutOfRangeException

Events

HumidityUpdated

Raised when a new humidity reading is taken

Declaration
public event EventHandler<IChangeResult<RelativeHumidity>> HumidityUpdated

Event Type

Type Description
EventHandler<IChangeResult<RelativeHumidity>>

Remarks

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

Code Example

NextPm nextPm;

public override Task Initialize()
{
    var port = Device
        .PlatformOS
        .GetSerialPortName("COM1")
        .CreateSerialPort();

    nextPm = new NextPm(port);

    nextPm.Readings10sUpdated += NextPm_Readings10sUpdated;

    return Task.CompletedTask;
}

private void NextPm_Readings10sUpdated(object sender, IChangeResult<ParticulateReading> e)
{
    Resolver.Log.Info($"Past 10 seconds");
    Resolver.Log.Info($"  {e.New.CountOf1micronParticles.ParticlesPerLiter:0} 1 micron particles per liter");
    Resolver.Log.Info($"  {e.New.CountOf2_5micronParticles.ParticlesPerLiter:0} 2.5 micron particles per liter");
    Resolver.Log.Info($"  {e.New.CountOf10micronParticles.ParticlesPerLiter:0} 10 micron particles per liter");
    Resolver.Log.Info($"  {e.New.EnvironmentalPM_1micron.MicroGramsPerMetersCubed:0} ug/L^3 1 micron particles");
    Resolver.Log.Info($"  {e.New.EnvironmentalPM_2_5micron.MicroGramsPerMetersCubed:0} ug/L^3 1 micron particles");
    Resolver.Log.Info($"  {e.New.EnvironmentalPM_10micron.MicroGramsPerMetersCubed:0} ug/L^3 1 micron particles");
}

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

    var firmware = await nextPm.GetFirmwareVersion();
    Resolver.Log.Info($"Firmware: 0x{firmware:X4}");

    var tempAndHumidity = await nextPm.GetTemperatureAndHumidity();
    Resolver.Log.Info($"Temp: {tempAndHumidity.temperature:0.0}C  Humidity: {tempAndHumidity.humidity}%");

    nextPm.StartUpdating();
}


Sample project(s) available on GitHub

Readings10sUpdated

Raised when a new 10-second average reading is taken

Declaration
public event EventHandler<IChangeResult<ParticulateReading>> Readings10sUpdated

Event Type

Type Description
EventHandler<IChangeResult<ParticulateReading>>

Remarks

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

Code Example

NextPm nextPm;

public override Task Initialize()
{
    var port = Device
        .PlatformOS
        .GetSerialPortName("COM1")
        .CreateSerialPort();

    nextPm = new NextPm(port);

    nextPm.Readings10sUpdated += NextPm_Readings10sUpdated;

    return Task.CompletedTask;
}

private void NextPm_Readings10sUpdated(object sender, IChangeResult<ParticulateReading> e)
{
    Resolver.Log.Info($"Past 10 seconds");
    Resolver.Log.Info($"  {e.New.CountOf1micronParticles.ParticlesPerLiter:0} 1 micron particles per liter");
    Resolver.Log.Info($"  {e.New.CountOf2_5micronParticles.ParticlesPerLiter:0} 2.5 micron particles per liter");
    Resolver.Log.Info($"  {e.New.CountOf10micronParticles.ParticlesPerLiter:0} 10 micron particles per liter");
    Resolver.Log.Info($"  {e.New.EnvironmentalPM_1micron.MicroGramsPerMetersCubed:0} ug/L^3 1 micron particles");
    Resolver.Log.Info($"  {e.New.EnvironmentalPM_2_5micron.MicroGramsPerMetersCubed:0} ug/L^3 1 micron particles");
    Resolver.Log.Info($"  {e.New.EnvironmentalPM_10micron.MicroGramsPerMetersCubed:0} ug/L^3 1 micron particles");
}

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

    var firmware = await nextPm.GetFirmwareVersion();
    Resolver.Log.Info($"Firmware: 0x{firmware:X4}");

    var tempAndHumidity = await nextPm.GetTemperatureAndHumidity();
    Resolver.Log.Info($"Temp: {tempAndHumidity.temperature:0.0}C  Humidity: {tempAndHumidity.humidity}%");

    nextPm.StartUpdating();
}


Sample project(s) available on GitHub

Readings15minUpdated

Raised when a new 15-minute average reading is taken

Declaration
public event EventHandler<IChangeResult<ParticulateReading>> Readings15minUpdated

Event Type

Type Description
EventHandler<IChangeResult<ParticulateReading>>

Remarks

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

Code Example

NextPm nextPm;

public override Task Initialize()
{
    var port = Device
        .PlatformOS
        .GetSerialPortName("COM1")
        .CreateSerialPort();

    nextPm = new NextPm(port);

    nextPm.Readings10sUpdated += NextPm_Readings10sUpdated;

    return Task.CompletedTask;
}

private void NextPm_Readings10sUpdated(object sender, IChangeResult<ParticulateReading> e)
{
    Resolver.Log.Info($"Past 10 seconds");
    Resolver.Log.Info($"  {e.New.CountOf1micronParticles.ParticlesPerLiter:0} 1 micron particles per liter");
    Resolver.Log.Info($"  {e.New.CountOf2_5micronParticles.ParticlesPerLiter:0} 2.5 micron particles per liter");
    Resolver.Log.Info($"  {e.New.CountOf10micronParticles.ParticlesPerLiter:0} 10 micron particles per liter");
    Resolver.Log.Info($"  {e.New.EnvironmentalPM_1micron.MicroGramsPerMetersCubed:0} ug/L^3 1 micron particles");
    Resolver.Log.Info($"  {e.New.EnvironmentalPM_2_5micron.MicroGramsPerMetersCubed:0} ug/L^3 1 micron particles");
    Resolver.Log.Info($"  {e.New.EnvironmentalPM_10micron.MicroGramsPerMetersCubed:0} ug/L^3 1 micron particles");
}

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

    var firmware = await nextPm.GetFirmwareVersion();
    Resolver.Log.Info($"Firmware: 0x{firmware:X4}");

    var tempAndHumidity = await nextPm.GetTemperatureAndHumidity();
    Resolver.Log.Info($"Temp: {tempAndHumidity.temperature:0.0}C  Humidity: {tempAndHumidity.humidity}%");

    nextPm.StartUpdating();
}


Sample project(s) available on GitHub

Readings1minUpdated

Raised when a new 1-minute average reading is taken

Declaration
public event EventHandler<IChangeResult<ParticulateReading>> Readings1minUpdated

Event Type

Type Description
EventHandler<IChangeResult<ParticulateReading>>

Remarks

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

Code Example

NextPm nextPm;

public override Task Initialize()
{
    var port = Device
        .PlatformOS
        .GetSerialPortName("COM1")
        .CreateSerialPort();

    nextPm = new NextPm(port);

    nextPm.Readings10sUpdated += NextPm_Readings10sUpdated;

    return Task.CompletedTask;
}

private void NextPm_Readings10sUpdated(object sender, IChangeResult<ParticulateReading> e)
{
    Resolver.Log.Info($"Past 10 seconds");
    Resolver.Log.Info($"  {e.New.CountOf1micronParticles.ParticlesPerLiter:0} 1 micron particles per liter");
    Resolver.Log.Info($"  {e.New.CountOf2_5micronParticles.ParticlesPerLiter:0} 2.5 micron particles per liter");
    Resolver.Log.Info($"  {e.New.CountOf10micronParticles.ParticlesPerLiter:0} 10 micron particles per liter");
    Resolver.Log.Info($"  {e.New.EnvironmentalPM_1micron.MicroGramsPerMetersCubed:0} ug/L^3 1 micron particles");
    Resolver.Log.Info($"  {e.New.EnvironmentalPM_2_5micron.MicroGramsPerMetersCubed:0} ug/L^3 1 micron particles");
    Resolver.Log.Info($"  {e.New.EnvironmentalPM_10micron.MicroGramsPerMetersCubed:0} ug/L^3 1 micron particles");
}

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

    var firmware = await nextPm.GetFirmwareVersion();
    Resolver.Log.Info($"Firmware: 0x{firmware:X4}");

    var tempAndHumidity = await nextPm.GetTemperatureAndHumidity();
    Resolver.Log.Info($"Temp: {tempAndHumidity.temperature:0.0}C  Humidity: {tempAndHumidity.humidity}%");

    nextPm.StartUpdating();
}


Sample project(s) available on GitHub

TemperatureUpdated

Raised when a new temperature reading is taken

Declaration
public event EventHandler<IChangeResult<Temperature>> TemperatureUpdated

Event Type

Type Description
EventHandler<IChangeResult<Temperature>>

Remarks

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

Code Example

NextPm nextPm;

public override Task Initialize()
{
    var port = Device
        .PlatformOS
        .GetSerialPortName("COM1")
        .CreateSerialPort();

    nextPm = new NextPm(port);

    nextPm.Readings10sUpdated += NextPm_Readings10sUpdated;

    return Task.CompletedTask;
}

private void NextPm_Readings10sUpdated(object sender, IChangeResult<ParticulateReading> e)
{
    Resolver.Log.Info($"Past 10 seconds");
    Resolver.Log.Info($"  {e.New.CountOf1micronParticles.ParticlesPerLiter:0} 1 micron particles per liter");
    Resolver.Log.Info($"  {e.New.CountOf2_5micronParticles.ParticlesPerLiter:0} 2.5 micron particles per liter");
    Resolver.Log.Info($"  {e.New.CountOf10micronParticles.ParticlesPerLiter:0} 10 micron particles per liter");
    Resolver.Log.Info($"  {e.New.EnvironmentalPM_1micron.MicroGramsPerMetersCubed:0} ug/L^3 1 micron particles");
    Resolver.Log.Info($"  {e.New.EnvironmentalPM_2_5micron.MicroGramsPerMetersCubed:0} ug/L^3 1 micron particles");
    Resolver.Log.Info($"  {e.New.EnvironmentalPM_10micron.MicroGramsPerMetersCubed:0} ug/L^3 1 micron particles");
}

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

    var firmware = await nextPm.GetFirmwareVersion();
    Resolver.Log.Info($"Firmware: 0x{firmware:X4}");

    var tempAndHumidity = await nextPm.GetTemperatureAndHumidity();
    Resolver.Log.Info($"Temp: {tempAndHumidity.temperature:0.0}C  Humidity: {tempAndHumidity.humidity}%");

    nextPm.StartUpdating();
}


Sample project(s) available on GitHub