diff --git a/Source/Meadow.Foundation.Peripherals/Sensors.Atmospheric.Htu21d/Driver/Htu21d.Enums.cs b/Source/Meadow.Foundation.Peripherals/Sensors.Atmospheric.Htu21d/Driver/Htu21d.Enums.cs
index 26917afdae..8141fee8ac 100644
--- a/Source/Meadow.Foundation.Peripherals/Sensors.Atmospheric.Htu21d/Driver/Htu21d.Enums.cs
+++ b/Source/Meadow.Foundation.Peripherals/Sensors.Atmospheric.Htu21d/Driver/Htu21d.Enums.cs
@@ -4,21 +4,6 @@ namespace Meadow.Foundation.Sensors.Atmospheric
{
public partial class Htu21d
{
- ///
- /// Valid addresses for the sensor.
- ///
- public enum Addresses : byte
- {
- ///
- /// Bus address 0x40
- ///
- Address_0x40 = 0x40,
- ///
- /// Default bus address
- ///
- Default = Address_0x40
- }
-
private const byte SOFT_RESET = 0xFE;
private const byte TEMPERATURE_MEASURE_NOHOLD = 0xF3;
@@ -43,10 +28,5 @@ public enum SensorResolution : byte
TEMP13_HUM10 = 0x80,
TEMP11_HUM11 = 0x81,
}
-
- private enum Register : byte
- {
-
- }
}
}
\ No newline at end of file
diff --git a/Source/Meadow.Foundation.Peripherals/Sensors.Atmospheric.Htu21d/Driver/Htu21d.cs b/Source/Meadow.Foundation.Peripherals/Sensors.Atmospheric.Htu21d/Driver/Htu21d.cs
deleted file mode 100644
index 966f38762d..0000000000
--- a/Source/Meadow.Foundation.Peripherals/Sensors.Atmospheric.Htu21d/Driver/Htu21d.cs
+++ /dev/null
@@ -1,163 +0,0 @@
-using Meadow.Hardware;
-using Meadow.Peripherals.Sensors;
-using Meadow.Units;
-using System;
-using System.Threading;
-using System.Threading.Tasks;
-using TU = Meadow.Units.Temperature.UnitType;
-using HU = Meadow.Units.RelativeHumidity.UnitType;
-
-namespace Meadow.Foundation.Sensors.Atmospheric
-{
- ///
- /// Provide access to the Htu21d(f)
- /// temperature and humidity sensors
- ///
- public partial class Htu21d :
- ByteCommsSensorBase<(Units.Temperature? Temperature, RelativeHumidity? Humidity)>,
- ITemperatureSensor, IHumiditySensor
- {
- public event EventHandler> TemperatureUpdated = delegate { };
- public event EventHandler> HumidityUpdated = delegate { };
-
- public int DEFAULT_SPEED => 400;
-
- ///
- /// The temperature, from the last reading.
- ///
- public Units.Temperature? Temperature => Conditions.Temperature;
-
- ///
- /// The humidity, in percent relative humidity, from the last reading..
- ///
- public RelativeHumidity? Humidity => Conditions.Humidity;
-
- ///
- /// Serial number of the device.
- ///
- public ulong SerialNumber { get; private set; }
-
- ///
- /// Firmware revision of the sensor.
- ///
- public byte FirmwareRevision { get; private set; }
-
- ///
- /// Create a new Htu21d temperature and humidity sensor.
- ///
- /// Sensor address (default to 0x40).
- /// I2CBus (default to 100 KHz).
- public Htu21d(II2cBus i2cBus, byte address = (byte)Addresses.Default, int updateIntervalMs = 1000)
- : base(i2cBus, address, updateIntervalMs)
- {
- Initialize();
- }
-
- protected void Initialize ()
- {
- Peripheral.Write(SOFT_RESET);
-
- Thread.Sleep(100);
-
- SetResolution(SensorResolution.TEMP11_HUM11);
- }
-
- protected override async Task<(Units.Temperature? Temperature, RelativeHumidity? Humidity)> ReadSensor()
- {
- (Units.Temperature Temperature, RelativeHumidity Humidity) conditions;
-
- return await Task.Run(() => {
- // ---- HUMIDITY
- //Bus.WriteBytes(HUMDITY_MEASURE_NOHOLD);
- Peripheral.Write(HUMDITY_MEASURE_NOHOLD);
- Thread.Sleep(25); // Maximum conversion time is 12ms (page 5 of the datasheet).
- //Bus.ReadBytes(_rx, 3); // 2 data bytes plus a checksum (we ignore the checksum here)
- Peripheral.Read(ReadBuffer.Span[0..3]);// 2 data bytes plus a checksum (we ignore the checksum here)
- var humidityReading = (ushort)((ReadBuffer.Span[0] << 8) + ReadBuffer.Span[1]);
- conditions.Humidity = new RelativeHumidity(((125 * (float)humidityReading) / 65536) - 6, RelativeHumidity.UnitType.Percent);
- if (conditions.Humidity < new RelativeHumidity(0, HU.Percent))
- {
- conditions.Humidity = new RelativeHumidity(0, HU.Percent);
- }
- else
- {
- if (conditions.Humidity > new RelativeHumidity(100, HU.Percent))
- {
- conditions.Humidity = new RelativeHumidity(100, HU.Percent);
- }
- }
-
- // ---- TEMPERATURE
- //Bus.WriteBytes(TEMPERATURE_MEASURE_NOHOLD);
- Peripheral.Write(TEMPERATURE_MEASURE_NOHOLD);
- Thread.Sleep(25); // Maximum conversion time is 12ms (page 5 of the datasheet).
- //Bus.ReadBytes(_rx, 3); // 2 data bytes plus a checksum (we ignore the checksum here)
- Peripheral.Read(ReadBuffer.Span[0..3]);// 2 data bytes plus a checksum (we ignore the checksum here)
- var temperatureReading = (short)((ReadBuffer.Span[0] << 8) + ReadBuffer.Span[1]);
- conditions.Temperature = new Units.Temperature((float)(((175.72 * temperatureReading) / 65536) - 46.85), Units.Temperature.UnitType.Celsius);
-
- return conditions;
- });
- }
-
- ///
- /// Inheritance-safe way to raise events and notify observers.
- ///
- ///
- protected override void RaiseEventsAndNotify(IChangeResult<(Units.Temperature? Temperature, RelativeHumidity? Humidity)> changeResult)
- {
- if (changeResult.New.Temperature is { } temp) {
- TemperatureUpdated?.Invoke(this, new ChangeResult(temp, changeResult.Old?.Temperature));
- }
- if (changeResult.New.Humidity is { } humidity) {
- HumidityUpdated?.Invoke(this, new ChangeResult(humidity, changeResult.Old?.Humidity));
- }
- base.RaiseEventsAndNotify(changeResult);
- }
-
- ///
- /// Turn the heater on or off.
- ///
- /// Heater status, true = turn heater on, false = turn heater off.
- public void Heater(bool onOrOff)
- {
- //var register = Bus.ReadRegisterByte(READ_HEATER_REGISTER);
- var register = Peripheral.ReadRegister(READ_HEATER_REGISTER);
- register &= 0xfd;
-
- if (onOrOff)
- {
- register |= 0x02;
- }
- //Bus.WriteRegister(WRITE_HEATER_REGISTER, register);
- Peripheral.WriteRegister(WRITE_HEATER_REGISTER, register);
- }
-
- //Set sensor resolution
- /*******************************************************************************************/
- //Sets the sensor resolution to one of four levels
- //Page 12:
- // 0/0 = 12bit RH, 14bit Temp
- // 0/1 = 8bit RH, 12bit Temp
- // 1/0 = 10bit RH, 13bit Temp
- // 1/1 = 11bit RH, 11bit Temp
- //Power on default is 0/0
- void SetResolution(SensorResolution resolution)
- {
- var register = Peripheral.ReadRegister(READ_USER_REGISTER);
-
- //userRegister &= 0b01111110; //Turn off the resolution bits
- //resolution &= 0b10000001; //Turn off all other bits but resolution bits
- //userRegister |= resolution; //Mask in the requested resolution bits
-
- var res = (byte)resolution;
-
- register &= 0x73; //Turn off the resolution bits
- res &= 0x81; //Turn off all other bits but resolution bits
- register |= res; //Mask in the requested resolution bits
-
- //Request a write to user register
- Peripheral.WriteRegister(WRITE_USER_REGISTER, register); //Write the new resolution bits
- }
- }
-}
\ No newline at end of file
diff --git a/Source/Meadow.Foundation.Peripherals/Sensors.Atmospheric.Htu21d/Datasheet/htu21d.pdf b/Source/Meadow.Foundation.Peripherals/Sensors.Atmospheric.Htu2xd/Datasheet/htu21d.pdf
similarity index 100%
rename from Source/Meadow.Foundation.Peripherals/Sensors.Atmospheric.Htu21d/Datasheet/htu21d.pdf
rename to Source/Meadow.Foundation.Peripherals/Sensors.Atmospheric.Htu2xd/Datasheet/htu21d.pdf
diff --git a/Source/Meadow.Foundation.Peripherals/Sensors.Atmospheric.Htu2xd/Datasheet/htu31d.pdf b/Source/Meadow.Foundation.Peripherals/Sensors.Atmospheric.Htu2xd/Datasheet/htu31d.pdf
new file mode 100644
index 0000000000..50aba5faa4
Binary files /dev/null and b/Source/Meadow.Foundation.Peripherals/Sensors.Atmospheric.Htu2xd/Datasheet/htu31d.pdf differ
diff --git a/Source/Meadow.Foundation.Peripherals/Sensors.Atmospheric.Htu2xd/Driver/Drivers/Htu21d.Enums.cs b/Source/Meadow.Foundation.Peripherals/Sensors.Atmospheric.Htu2xd/Driver/Drivers/Htu21d.Enums.cs
new file mode 100644
index 0000000000..4b2a911283
--- /dev/null
+++ b/Source/Meadow.Foundation.Peripherals/Sensors.Atmospheric.Htu2xd/Driver/Drivers/Htu21d.Enums.cs
@@ -0,0 +1,45 @@
+namespace Meadow.Foundation.Sensors.Atmospheric
+{
+ public partial class Htu21d
+ {
+ enum Registers : byte
+ {
+ SOFT_RESET = 0xFE,
+
+ TEMPERATURE_MEASURE_NOHOLD = 0xF3,
+ HUMDITY_MEASURE_NOHOLD = 0xF5,
+
+ TEMPERATURE_MEASURE_HOLD = 0xE3,
+ HUMDITY_MEASURE_HOLD = 0xE5,
+ TEMPERATURE_MEASURE_PREVIOUS = 0xE0,
+
+ WRITE_USER_REGISTER = 0xE6,
+ READ_USER_REGISTER = 0xE7,
+ READ_HEATER_REGISTER = 0x11,
+ WRITE_HEATER_REGISTER = 0x51,
+ }
+
+ ///
+ /// Resolution of sensor data
+ ///
+ public enum SensorResolution : byte
+ {
+ ///
+ /// 14 bit temperature, 12 bit humidity
+ ///
+ TEMP14_HUM12 = 0x00,
+ ///
+ /// 12 bit temperature, 8 bit humidity
+ ///
+ TEMP12_HUM8 = 0x01,
+ ///
+ /// 13 bit temperature, 10 bit humidity
+ ///
+ TEMP13_HUM10 = 0x80,
+ ///
+ /// 11 bit temperature, 11 bit humidity
+ ///
+ TEMP11_HUM11 = 0x81,
+ }
+ }
+}
\ No newline at end of file
diff --git a/Source/Meadow.Foundation.Peripherals/Sensors.Atmospheric.Htu2xd/Driver/Drivers/Htu21d.cs b/Source/Meadow.Foundation.Peripherals/Sensors.Atmospheric.Htu2xd/Driver/Drivers/Htu21d.cs
new file mode 100644
index 0000000000..ff466223eb
--- /dev/null
+++ b/Source/Meadow.Foundation.Peripherals/Sensors.Atmospheric.Htu2xd/Driver/Drivers/Htu21d.cs
@@ -0,0 +1,116 @@
+using Meadow.Hardware;
+using Meadow.Units;
+using System;
+using System.Threading;
+using System.Threading.Tasks;
+using HU = Meadow.Units.RelativeHumidity.UnitType;
+
+namespace Meadow.Foundation.Sensors.Atmospheric
+{
+ ///
+ /// Provide access to the Htu21d(f)
+ /// temperature and humidity sensors
+ ///
+ public partial class Htu21d : Htux1dBase
+ {
+ ///
+ /// Firmware revision of the sensor.
+ ///
+ public byte FirmwareRevision { get; private set; }
+
+ ///
+ /// Create a new Htu21d temperature and humidity sensor
+ ///
+ /// Sensor address (default to 0x40)
+ /// I2CBus (default to 100 KHz)
+ /// Update interval, defaults to 1 sec if null
+ public Htu21d(II2cBus i2cBus, byte address = (byte)Addresses.Default, TimeSpan? updateInterval = null)
+ : base(i2cBus, address, updateInterval)
+ {
+ Initialize();
+ }
+
+ ///
+ /// Initialize HTU21D
+ ///
+ protected void Initialize ()
+ {
+ Peripheral?.Write((byte)Registers.SOFT_RESET);
+
+ Thread.Sleep(100);
+
+ SetResolution(SensorResolution.TEMP11_HUM11);
+ }
+
+ protected override async Task<(Units.Temperature? Temperature, RelativeHumidity? Humidity)> ReadSensor()
+ {
+ (Units.Temperature Temperature, RelativeHumidity Humidity) conditions;
+
+ return await Task.Run(() =>
+ {
+ // humidity
+ Peripheral?.Write((byte)Registers.HUMDITY_MEASURE_NOHOLD);
+ Thread.Sleep(20); // Maximum conversion time is 12ms (page 5 of the datasheet)
+
+ Peripheral?.Read(ReadBuffer.Span[0..2]);// 2 data bytes plus a checksum (we ignore the checksum here)
+ var humidityReading = (ushort)((ReadBuffer.Span[0] << 8) + ReadBuffer.Span[1]);
+ var humidity = (125 * (float)humidityReading / 65536) - 6;
+ humidity = Math.Clamp(humidity, 0, 100);
+ conditions.Humidity = new RelativeHumidity(humidity, HU.Percent);
+
+ // temperature
+ Peripheral?.Write((byte)Registers.TEMPERATURE_MEASURE_NOHOLD);
+ Thread.Sleep(20); // Maximum conversion time is 12ms (page 5 of the datasheet)
+
+ Peripheral?.Read(ReadBuffer.Span[0..2]);// 2 data bytes plus a checksum (we ignore the checksum here)
+ var temperatureReading = (short)((ReadBuffer.Span[0] << 8) + ReadBuffer.Span[1]);
+ conditions.Temperature = new Units.Temperature((float)(((175.72 * temperatureReading) / 65536) - 46.85), Units.Temperature.UnitType.Celsius);
+
+ return conditions;
+ });
+ }
+
+ ///
+ /// Turn the heater on or off
+ ///
+ /// Heater status, true = turn heater on, false = turn heater off.
+ public void Heater(bool heaterOn)
+ {
+ if (Peripheral == null) return;
+
+ var register = Peripheral.ReadRegister((byte)Registers.READ_HEATER_REGISTER);
+ register &= 0xfd;
+
+ if (heaterOn)
+ {
+ register |= 0x02;
+ }
+ Peripheral.WriteRegister((byte)Registers.WRITE_HEATER_REGISTER, register);
+ }
+
+ //Set sensor resolution
+ /*******************************************************************************************/
+ //Sets the sensor resolution to one of four levels
+ //Page 12:
+ // 0/0 = 12bit RH, 14bit Temp
+ // 0/1 = 8bit RH, 12bit Temp
+ // 1/0 = 10bit RH, 13bit Temp
+ // 1/1 = 11bit RH, 11bit Temp
+ //Power on default is 0/0
+ void SetResolution(SensorResolution resolution)
+ {
+ if (Peripheral == null) return;
+
+ var register = Peripheral.ReadRegister((byte)Registers.READ_USER_REGISTER);
+
+ var res = (byte)resolution;
+
+ register &= 0x73; //Turn off the resolution bits
+ res &= 0x81; //Turn off all other bits but resolution bits
+ register |= res; //Mask in the requested resolution bits
+
+ //Request a write to user register
+ Peripheral.WriteRegister((byte)Registers.WRITE_USER_REGISTER, register); //Write the new resolution bits
+ }
+ }
+}
\ No newline at end of file
diff --git a/Source/Meadow.Foundation.Peripherals/Sensors.Atmospheric.Htu2xd/Driver/Drivers/Htu31d.Enums.cs b/Source/Meadow.Foundation.Peripherals/Sensors.Atmospheric.Htu2xd/Driver/Drivers/Htu31d.Enums.cs
new file mode 100644
index 0000000000..c8ac9135fc
--- /dev/null
+++ b/Source/Meadow.Foundation.Peripherals/Sensors.Atmospheric.Htu2xd/Driver/Drivers/Htu31d.Enums.cs
@@ -0,0 +1,43 @@
+using System;
+
+namespace Meadow.Foundation.Sensors.Atmospheric
+{
+ public partial class Htu31d
+ {
+ ///
+ /// Valid addresses for the sensor.
+ ///
+ public enum Addresses : byte
+ {
+ ///
+ /// Bus address 0x40
+ ///
+ Address_0x40 = 0x40,
+ ///
+ /// Default bus address
+ ///
+ Default = Address_0x40
+ }
+
+ private enum Commands : byte
+ {
+ /** Read temperature and humidity. */
+ ReadTempHumidity = 0x00,
+
+ /** Start a conversion! */
+ Conversion = 0x40,
+
+ /** Read serial number command. */
+ ReadSerial = 0x0A,
+
+ /** Enable heater */
+ HeaterOn = 0x04,
+
+ /** Disable heater */
+ HeaterOff = 0x02,
+
+ /** Reset command. */
+ Reset = 0x1e,
+ }
+ }
+}
\ No newline at end of file
diff --git a/Source/Meadow.Foundation.Peripherals/Sensors.Atmospheric.Htu2xd/Driver/Drivers/Htu31d.cs b/Source/Meadow.Foundation.Peripherals/Sensors.Atmospheric.Htu2xd/Driver/Drivers/Htu31d.cs
new file mode 100644
index 0000000000..47c25207c8
--- /dev/null
+++ b/Source/Meadow.Foundation.Peripherals/Sensors.Atmospheric.Htu2xd/Driver/Drivers/Htu31d.cs
@@ -0,0 +1,104 @@
+using Meadow.Hardware;
+using Meadow.Peripherals.Sensors;
+using Meadow.Units;
+using System;
+using System.Threading;
+using System.Threading.Tasks;
+using TU = Meadow.Units.Temperature.UnitType;
+using HU = Meadow.Units.RelativeHumidity.UnitType;
+
+namespace Meadow.Foundation.Sensors.Atmospheric
+{
+ ///
+ /// Provide access to the Htu31d
+ /// temperature and humidity sensors
+ ///
+ public partial class Htu31d : Htux1dBase
+ {
+ ///
+ /// Create a new Htu31d temperature and humidity sensor.
+ ///
+ /// Sensor address (default to 0x40).
+ /// I2CBus (default to 100 KHz).
+ /// Update interval, defaults to 1 sec if null
+ public Htu31d(II2cBus i2cBus, byte address = (byte)Addresses.Default, TimeSpan? updateInterval = null)
+ : base(i2cBus, address, updateInterval)
+ {
+ SerialNumber = GetSerial();
+ }
+
+ ///
+ /// Read atmospheric data from sensor
+ ///
+ ///
+ protected override async Task<(Units.Temperature? Temperature, RelativeHumidity? Humidity)> ReadSensor()
+ {
+ (Units.Temperature Temperature, RelativeHumidity Humidity) conditions;
+
+ return await Task.Run(() =>
+ {
+ Peripheral?.Write((byte)Commands.Conversion);
+ Thread.Sleep(20); // Maximum conversion time is 20ms
+ Peripheral?.ReadRegister((byte)Commands.ReadTempHumidity, ReadBuffer.Span[0..5]);// 2 bytes for temp, checksum, 2 bytes humidity, checksum
+
+ // temperature
+ var temperatureReading = (ushort)((ReadBuffer.Span[0] << 8) + ReadBuffer.Span[1]);
+ conditions.Temperature = new Units.Temperature((float)(((175.72 * temperatureReading) / 65536) - 46.85), Units.Temperature.UnitType.Celsius);
+
+ // humidity
+ var humidityReading = (ushort)((ReadBuffer.Span[3] << 8) + ReadBuffer.Span[4]);
+ var humidity = (125 * (float)humidityReading / 65536) - 6;
+ humidity = Math.Clamp(humidity, 0, 100);
+ conditions.Humidity = new RelativeHumidity(humidity, HU.Percent);
+
+ return conditions;
+ });
+ }
+
+ ///
+ /// Turn the heater on or off
+ ///
+ /// Heater status, true = turn heater on, false = turn heater off
+ public void Heater(bool heaterOn)
+ {
+ if(heaterOn)
+ {
+ Peripheral?.WriteRegister((byte)Commands.HeaterOn, 1);
+ }
+ else
+ {
+ Peripheral?.WriteRegister((byte)Commands.HeaterOff, 1);
+ }
+ }
+
+ ///
+ /// Reset the sensor
+ ///
+ public void Reset()
+ {
+ Peripheral?.WriteRegister((byte)Commands.Reset, 1);
+
+ Thread.Sleep(15); //could make this async ...
+ }
+
+ private UInt32 GetSerial()
+ {
+ if (Peripheral == null) return 0;
+
+ var data = new byte[4];
+
+ Peripheral.ReadRegister((byte)Commands.ReadSerial, data);
+
+ UInt32 serial;
+
+ serial = data[0];
+ serial <<= 8;
+ serial |= data[1];
+ serial <<= 8;
+ serial |= data[2];
+ serial <<= 8;
+ serial |= data[3];
+ return serial;
+ }
+ }
+}
\ No newline at end of file
diff --git a/Source/Meadow.Foundation.Peripherals/Sensors.Atmospheric.Htu2xd/Driver/Htux1dBase.cs b/Source/Meadow.Foundation.Peripherals/Sensors.Atmospheric.Htu2xd/Driver/Htux1dBase.cs
new file mode 100644
index 0000000000..213beb4091
--- /dev/null
+++ b/Source/Meadow.Foundation.Peripherals/Sensors.Atmospheric.Htu2xd/Driver/Htux1dBase.cs
@@ -0,0 +1,88 @@
+using Meadow.Hardware;
+using Meadow.Peripherals.Sensors;
+using Meadow.Units;
+using System;
+
+namespace Meadow.Foundation.Sensors.Atmospheric
+{
+ ///
+ /// Valid addresses for the sensor
+ ///
+ public enum Addresses : byte
+ {
+ ///
+ /// Bus address 0x40
+ ///
+ Address_0x40 = 0x40,
+ ///
+ /// Default bus address
+ ///
+ Default = Address_0x40
+ }
+
+ ///
+ /// Abstract HTDx1D base class for HTU21D and HTU31D
+ ///
+ public abstract class Htux1dBase :
+ ByteCommsSensorBase<(Meadow.Units.Temperature? Temperature, RelativeHumidity? Humidity)>,
+ ITemperatureSensor, IHumiditySensor
+ {
+ ///
+ /// Temperature changed event
+ ///
+ public event EventHandler> TemperatureUpdated = delegate { };
+
+ ///
+ /// Humidity changed event
+ ///
+ public event EventHandler> HumidityUpdated = delegate { };
+
+ ///
+ /// Default I2C bus speed
+ ///
+ public int DEFAULT_SPEED => 400;
+
+ ///
+ /// The temperature, from the last reading
+ ///
+ public Units.Temperature? Temperature => Conditions.Temperature;
+
+ ///
+ /// The humidity, in percent relative humidity, from the last reading
+ ///
+ public RelativeHumidity? Humidity => Conditions.Humidity;
+
+ ///
+ /// Serial number of the device.
+ ///
+ public UInt32 SerialNumber { get; protected set; }
+
+ ///
+ /// Abstract HTDx1D ctor for HTU21D and HTU31D
+ ///
+ ///
+ ///
+ ///
+ public Htux1dBase(II2cBus i2cBus, byte address = (byte)Addresses.Default, TimeSpan? updateInterval = null)
+ : base(i2cBus, address, (int)(updateInterval == null ? 1000 : updateInterval.Value.TotalMilliseconds))
+ {
+ }
+
+ ///
+ /// Inheritance-safe way to raise events and notify observers.
+ ///
+ /// New temperature and humidity values
+ protected override void RaiseEventsAndNotify(IChangeResult<(Units.Temperature? Temperature, RelativeHumidity? Humidity)> changeResult)
+ {
+ if (changeResult.New.Temperature is { } temp)
+ {
+ TemperatureUpdated?.Invoke(this, new ChangeResult(temp, changeResult.Old?.Temperature));
+ }
+ if (changeResult.New.Humidity is { } humidity)
+ {
+ HumidityUpdated?.Invoke(this, new ChangeResult(humidity, changeResult.Old?.Humidity));
+ }
+ base.RaiseEventsAndNotify(changeResult);
+ }
+ }
+}
\ No newline at end of file
diff --git a/Source/Meadow.Foundation.Peripherals/Sensors.Atmospheric.Htu21d/Driver/Sensors.Atmospheric.Htu21d.csproj b/Source/Meadow.Foundation.Peripherals/Sensors.Atmospheric.Htu2xd/Driver/Sensors.Atmospheric.Htux1d.csproj
similarity index 59%
rename from Source/Meadow.Foundation.Peripherals/Sensors.Atmospheric.Htu21d/Driver/Sensors.Atmospheric.Htu21d.csproj
rename to Source/Meadow.Foundation.Peripherals/Sensors.Atmospheric.Htu2xd/Driver/Sensors.Atmospheric.Htux1d.csproj
index 61516cc334..7856ad1496 100644
--- a/Source/Meadow.Foundation.Peripherals/Sensors.Atmospheric.Htu21d/Driver/Sensors.Atmospheric.Htu21d.csproj
+++ b/Source/Meadow.Foundation.Peripherals/Sensors.Atmospheric.Htu2xd/Driver/Sensors.Atmospheric.Htux1d.csproj
@@ -5,28 +5,22 @@
Wilderness Labs, Inc
netstandard2.1
Library
- Htu21d
+ Htux1d
Wilderness Labs, Inc
http://developer.wildernesslabs.co/Meadow/Meadow.Foundation/
- Meadow.Foundation.Sensors.Atmospheric.Htu21d
+ Meadow.Foundation.Sensors.Atmospheric.Htux1d
https://github.com/WildernessLabs/Meadow.Foundation
- Meadow.Foundation, Atmospheric, Htu21d
- 0.1.45
+ Meadow.Foundation, Atmospheric, Humidity, Temperature, Htu21d, Htu31d
+ 0.1.0
true
- HTU21D(F) I2C temperature and humidity sensor
+ HTU21D(F) and HTU31D I2C temperature and humidity sensors
enable
-
- 8.0
-
-
- 8.0
+
+ 9.0
-
-
-
diff --git a/Source/Meadow.Foundation.Peripherals/Sensors.Atmospheric.Htu21d/Samples/Htu21d_Sample/Htu21d_Sample.csproj b/Source/Meadow.Foundation.Peripherals/Sensors.Atmospheric.Htu2xd/Samples/Htu21d_Sample/Htu21d_Sample.csproj
similarity index 71%
rename from Source/Meadow.Foundation.Peripherals/Sensors.Atmospheric.Htu21d/Samples/Htu21d_Sample/Htu21d_Sample.csproj
rename to Source/Meadow.Foundation.Peripherals/Sensors.Atmospheric.Htu2xd/Samples/Htu21d_Sample/Htu21d_Sample.csproj
index 1d508bf45d..7b0208976b 100644
--- a/Source/Meadow.Foundation.Peripherals/Sensors.Atmospheric.Htu21d/Samples/Htu21d_Sample/Htu21d_Sample.csproj
+++ b/Source/Meadow.Foundation.Peripherals/Sensors.Atmospheric.Htu2xd/Samples/Htu21d_Sample/Htu21d_Sample.csproj
@@ -9,14 +9,11 @@
App
enable
-
- 8.0
-
-
- 8.0
+
+ 9.0
-
+
diff --git a/Source/Meadow.Foundation.Peripherals/Sensors.Atmospheric.Htu21d/Samples/Htu21d_Sample/MeadowApp.cs b/Source/Meadow.Foundation.Peripherals/Sensors.Atmospheric.Htu2xd/Samples/Htu21d_Sample/MeadowApp.cs
similarity index 100%
rename from Source/Meadow.Foundation.Peripherals/Sensors.Atmospheric.Htu21d/Samples/Htu21d_Sample/MeadowApp.cs
rename to Source/Meadow.Foundation.Peripherals/Sensors.Atmospheric.Htu2xd/Samples/Htu21d_Sample/MeadowApp.cs
diff --git a/Source/Meadow.Foundation.Peripherals/Sensors.Atmospheric.Htu21d/Samples/Htu21d_Sample/Program.cs b/Source/Meadow.Foundation.Peripherals/Sensors.Atmospheric.Htu2xd/Samples/Htu21d_Sample/Program.cs
similarity index 100%
rename from Source/Meadow.Foundation.Peripherals/Sensors.Atmospheric.Htu21d/Samples/Htu21d_Sample/Program.cs
rename to Source/Meadow.Foundation.Peripherals/Sensors.Atmospheric.Htu2xd/Samples/Htu21d_Sample/Program.cs
diff --git a/Source/Meadow.Foundation.Peripherals/Sensors.Atmospheric.Htu2xd/Samples/Htu31d_Sample/Htu31d_Sample.csproj b/Source/Meadow.Foundation.Peripherals/Sensors.Atmospheric.Htu2xd/Samples/Htu31d_Sample/Htu31d_Sample.csproj
new file mode 100644
index 0000000000..7b0208976b
--- /dev/null
+++ b/Source/Meadow.Foundation.Peripherals/Sensors.Atmospheric.Htu2xd/Samples/Htu31d_Sample/Htu31d_Sample.csproj
@@ -0,0 +1,19 @@
+
+
+ https://github.com/WildernessLabs/Meadow.Foundation
+ Wilderness Labs, Inc
+ Wilderness Labs, Inc
+ true
+ netstandard2.1
+ Exe
+ App
+ enable
+
+
+ 9.0
+
+
+
+
+
+
diff --git a/Source/Meadow.Foundation.Peripherals/Sensors.Atmospheric.Htu2xd/Samples/Htu31d_Sample/MeadowApp.cs b/Source/Meadow.Foundation.Peripherals/Sensors.Atmospheric.Htu2xd/Samples/Htu31d_Sample/MeadowApp.cs
new file mode 100644
index 0000000000..0dc370122d
--- /dev/null
+++ b/Source/Meadow.Foundation.Peripherals/Sensors.Atmospheric.Htu2xd/Samples/Htu31d_Sample/MeadowApp.cs
@@ -0,0 +1,63 @@
+using Meadow;
+using Meadow.Devices;
+using Meadow.Foundation.Sensors.Atmospheric;
+using System;
+using System.Threading.Tasks;
+
+namespace MeadowApp
+{
+ public class MeadowApp : App
+ {
+ //
+
+ readonly Htu31d sensor;
+
+ public MeadowApp()
+ {
+ Console.WriteLine("Initializing...");
+
+ sensor = new Htu31d(Device.CreateI2cBus());
+
+ var consumer = Htu31d.CreateObserver(
+ handler: result =>
+ {
+ Console.WriteLine($"Observer: Temp changed by threshold; new temp: {result.New.Temperature?.Celsius:N2}C, old: {result.Old?.Temperature?.Celsius:N2}C");
+ },
+ filter: result =>
+ {
+ //c# 8 pattern match syntax. checks for !null and assigns var.
+ 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);
+
+ sensor.Updated += (sender, result) =>
+ {
+ Console.WriteLine($" Temperature: {result.New.Temperature?.Celsius:F1}C");
+ Console.WriteLine($" Relative Humidity: {result.New.Humidity?.Percent:F1}%");
+ };
+
+ ReadConditions().Wait();
+
+ sensor.StartUpdating(TimeSpan.FromSeconds(1));
+ }
+
+ async Task ReadConditions()
+ {
+ var result = await sensor.Read();
+ Console.WriteLine("Initial Readings:");
+ Console.WriteLine($" Temperature: {result.Temperature?.Celsius:F1}C");
+ Console.WriteLine($" Relative Humidity: {result.Humidity:F1}%");
+ }
+
+ //
+ }
+}
\ No newline at end of file
diff --git a/Source/Meadow.Foundation.Peripherals/Sensors.Atmospheric.Htu2xd/Samples/Htu31d_Sample/Program.cs b/Source/Meadow.Foundation.Peripherals/Sensors.Atmospheric.Htu2xd/Samples/Htu31d_Sample/Program.cs
new file mode 100644
index 0000000000..5ab1662da4
--- /dev/null
+++ b/Source/Meadow.Foundation.Peripherals/Sensors.Atmospheric.Htu2xd/Samples/Htu31d_Sample/Program.cs
@@ -0,0 +1,17 @@
+using System.Threading;
+using Meadow;
+
+namespace MeadowApp
+{
+ class Program
+ {
+ static IApp app;
+
+ public static void Main(string[] args)
+ {
+ app = new MeadowApp();
+
+ Thread.Sleep(Timeout.Infinite);
+ }
+ }
+}
\ No newline at end of file
diff --git a/Source/Meadow.Foundation.sln b/Source/Meadow.Foundation.sln
index ff0704068f..a2b1c7f730 100644
--- a/Source/Meadow.Foundation.sln
+++ b/Source/Meadow.Foundation.sln
@@ -163,7 +163,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Samples", "Samples", "{6A66
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Sensors.Atmospheric.Sht31d", "Meadow.Foundation.Peripherals\Sensors.Atmospheric.Sht31D\Driver\Sensors.Atmospheric.Sht31d.csproj", "{81E6E143-8752-45A9-8BDA-C6F4730A7DF1}"
EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Sensors.Atmospheric.Htu21d", "Sensors.Atmospheric.Htu21d", "{27F8F5B1-F535-4116-BB16-63454D21D13B}"
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Sensors.Atmospheric.Htux1d", "Sensors.Atmospheric.Htux1d", "{27F8F5B1-F535-4116-BB16-63454D21D13B}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Sensors.Atmospheric.Hih6130", "Sensors.Atmospheric.Hih6130", "{91CA9079-8D10-4A3B-AE42-CB49781687C0}"
EndProject
@@ -318,10 +318,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Sensors.Distance.Gp2d12", "
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Sensors.Atmospheric.Mpl115a2", "Meadow.Foundation.Peripherals\Sensors.Atmospheric.Mpl115a2\Driver\Sensors.Atmospheric.Mpl115a2.csproj", "{949DBB54-777B-4C58-A39D-EEA02F00DAB4}"
EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Htu21d_Sample", "Meadow.Foundation.Peripherals\Sensors.Atmospheric.Htu21d\Samples\Htu21d_Sample\Htu21d_Sample.csproj", "{0A1A1B26-9653-49ED-91C4-43DC5E129EFD}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Sensors.Atmospheric.Htu21d", "Meadow.Foundation.Peripherals\Sensors.Atmospheric.Htu21d\Driver\Sensors.Atmospheric.Htu21d.csproj", "{AB2ADDF2-5307-4F0A-9E34-E7A2242176CF}"
-EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Hih6130_Sample", "Meadow.Foundation.Peripherals\Sensors.Atmospheric.Hih6130\Samples\Hih6130_Sample\Hih6130_Sample.csproj", "{EF135479-CBF6-4E03-B6EB-55EA850946A3}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Sensors.Atmospheric.Bmp085", "Meadow.Foundation.Peripherals\Sensors.Atmospheric.Bmp085\Driver\Sensors.Atmospheric.Bmp085.csproj", "{728ECF00-EB02-4981-87F9-A72A163DB93C}"
@@ -996,6 +992,12 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Maple.Unit.Tests", "Meadow.
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Maple.Server_UDP_Listener", "Meadow.Foundation.Libraries_and_Frameworks\Web.Maple.MapleServer\Utilities\Maple.Server_UDP_Listener\Maple.Server_UDP_Listener.csproj", "{6B545252-7BC0-4FF2-B6FB-F37C27C87B73}"
EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Sensors.Atmospheric.Htux1d", "Meadow.Foundation.Peripherals\Sensors.Atmospheric.Htu2xd\Driver\Sensors.Atmospheric.Htux1d.csproj", "{F6FE1203-D39F-40DD-BD89-82CFF8AD694E}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Htu21d_Sample", "Meadow.Foundation.Peripherals\Sensors.Atmospheric.Htu2xd\Samples\Htu21d_Sample\Htu21d_Sample.csproj", "{35A953A9-FEF5-4DCE-86FB-EE9B298FBA5B}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Htu31d_Sample", "Meadow.Foundation.Peripherals\Sensors.Atmospheric.Htu2xd\Samples\Htu31d_Sample\Htu31d_Sample.csproj", "{BA371CFB-C07A-4D29-B700-EAD37DD30D6F}"
+EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DataLoggers.SensorReading", "Meadow.Foundation.Libraries_and_Frameworks\DataLoggers.SensorReading\Driver\DataLoggers.SensorReading.csproj", "{A65353C4-D300-421D-AD04-5D69AF02BD9F}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Location.Gnss.NmeaProcessor", "Meadow.Foundation.Libraries_and_Frameworks\Location.Gnss.NmeaProcessor\Driver\Location.Gnss.NmeaProcessor.csproj", "{3ACEB0E7-9EA2-43A6-93E2-E9A14644E7BE}"
@@ -1276,14 +1278,6 @@ Global
{949DBB54-777B-4C58-A39D-EEA02F00DAB4}.Debug|Any CPU.Build.0 = Debug|Any CPU
{949DBB54-777B-4C58-A39D-EEA02F00DAB4}.Release|Any CPU.ActiveCfg = Release|Any CPU
{949DBB54-777B-4C58-A39D-EEA02F00DAB4}.Release|Any CPU.Build.0 = Release|Any CPU
- {0A1A1B26-9653-49ED-91C4-43DC5E129EFD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {0A1A1B26-9653-49ED-91C4-43DC5E129EFD}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {0A1A1B26-9653-49ED-91C4-43DC5E129EFD}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {0A1A1B26-9653-49ED-91C4-43DC5E129EFD}.Release|Any CPU.Build.0 = Release|Any CPU
- {AB2ADDF2-5307-4F0A-9E34-E7A2242176CF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {AB2ADDF2-5307-4F0A-9E34-E7A2242176CF}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {AB2ADDF2-5307-4F0A-9E34-E7A2242176CF}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {AB2ADDF2-5307-4F0A-9E34-E7A2242176CF}.Release|Any CPU.Build.0 = Release|Any CPU
{EF135479-CBF6-4E03-B6EB-55EA850946A3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{EF135479-CBF6-4E03-B6EB-55EA850946A3}.Debug|Any CPU.Build.0 = Debug|Any CPU
{EF135479-CBF6-4E03-B6EB-55EA850946A3}.Release|Any CPU.ActiveCfg = Release|Any CPU
@@ -2310,6 +2304,24 @@ Global
{6B545252-7BC0-4FF2-B6FB-F37C27C87B73}.Debug|Any CPU.Build.0 = Debug|Any CPU
{6B545252-7BC0-4FF2-B6FB-F37C27C87B73}.Release|Any CPU.ActiveCfg = Release|Any CPU
{6B545252-7BC0-4FF2-B6FB-F37C27C87B73}.Release|Any CPU.Build.0 = Release|Any CPU
+ {F6FE1203-D39F-40DD-BD89-82CFF8AD694E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {F6FE1203-D39F-40DD-BD89-82CFF8AD694E}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {F6FE1203-D39F-40DD-BD89-82CFF8AD694E}.Debug|Any CPU.Deploy.0 = Debug|Any CPU
+ {F6FE1203-D39F-40DD-BD89-82CFF8AD694E}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {F6FE1203-D39F-40DD-BD89-82CFF8AD694E}.Release|Any CPU.Build.0 = Release|Any CPU
+ {F6FE1203-D39F-40DD-BD89-82CFF8AD694E}.Release|Any CPU.Deploy.0 = Release|Any CPU
+ {35A953A9-FEF5-4DCE-86FB-EE9B298FBA5B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {35A953A9-FEF5-4DCE-86FB-EE9B298FBA5B}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {35A953A9-FEF5-4DCE-86FB-EE9B298FBA5B}.Debug|Any CPU.Deploy.0 = Debug|Any CPU
+ {35A953A9-FEF5-4DCE-86FB-EE9B298FBA5B}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {35A953A9-FEF5-4DCE-86FB-EE9B298FBA5B}.Release|Any CPU.Build.0 = Release|Any CPU
+ {35A953A9-FEF5-4DCE-86FB-EE9B298FBA5B}.Release|Any CPU.Deploy.0 = Release|Any CPU
+ {BA371CFB-C07A-4D29-B700-EAD37DD30D6F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {BA371CFB-C07A-4D29-B700-EAD37DD30D6F}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {BA371CFB-C07A-4D29-B700-EAD37DD30D6F}.Debug|Any CPU.Deploy.0 = Debug|Any CPU
+ {BA371CFB-C07A-4D29-B700-EAD37DD30D6F}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {BA371CFB-C07A-4D29-B700-EAD37DD30D6F}.Release|Any CPU.Build.0 = Release|Any CPU
+ {BA371CFB-C07A-4D29-B700-EAD37DD30D6F}.Release|Any CPU.Deploy.0 = Release|Any CPU
{A65353C4-D300-421D-AD04-5D69AF02BD9F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{A65353C4-D300-421D-AD04-5D69AF02BD9F}.Debug|Any CPU.Build.0 = Debug|Any CPU
{A65353C4-D300-421D-AD04-5D69AF02BD9F}.Debug|Any CPU.Deploy.0 = Debug|Any CPU
@@ -2485,8 +2497,6 @@ Global
{262EB4C5-8F3B-4BD2-9448-EA136549D38C} = {2EEF65DD-A7F6-4E60-8CB6-6783231CDD3F}
{E2D4DFD5-F251-42E7-975B-F82CBEB3F35B} = {8C198F16-DD20-46E5-8D34-1AD95DFC438A}
{949DBB54-777B-4C58-A39D-EEA02F00DAB4} = {DD2F1AA1-B2FB-40B7-9537-0070F5F97173}
- {0A1A1B26-9653-49ED-91C4-43DC5E129EFD} = {5DA778E0-E827-4A63-844B-1166BEEB8897}
- {AB2ADDF2-5307-4F0A-9E34-E7A2242176CF} = {27F8F5B1-F535-4116-BB16-63454D21D13B}
{EF135479-CBF6-4E03-B6EB-55EA850946A3} = {6416DC2C-DED8-44E7-8783-24EFB7F9C682}
{728ECF00-EB02-4981-87F9-A72A163DB93C} = {C724C5EE-7972-41DA-9FDB-42416980F25C}
{59EED95C-1CA7-466C-853C-BF14E1EF43A9} = {21C511DD-43DD-486E-86D7-18D8F6810ACD}
@@ -2823,6 +2833,9 @@ Global
{9FC9AAAC-9654-4A54-8FC7-7B76D95A4E6F} = {8EE895A8-B28B-4432-B273-29115038A8DE}
{E3BDF7CE-658E-480E-8EB7-B981C6DEAE0F} = {BDD4ACA9-4A60-40D8-9EFA-B97DAA346CD3}
{6B545252-7BC0-4FF2-B6FB-F37C27C87B73} = {9FC9AAAC-9654-4A54-8FC7-7B76D95A4E6F}
+ {F6FE1203-D39F-40DD-BD89-82CFF8AD694E} = {27F8F5B1-F535-4116-BB16-63454D21D13B}
+ {35A953A9-FEF5-4DCE-86FB-EE9B298FBA5B} = {5DA778E0-E827-4A63-844B-1166BEEB8897}
+ {BA371CFB-C07A-4D29-B700-EAD37DD30D6F} = {5DA778E0-E827-4A63-844B-1166BEEB8897}
{A65353C4-D300-421D-AD04-5D69AF02BD9F} = {D47B0BF3-B61F-4F83-BD73-3E749DFD470C}
{3ACEB0E7-9EA2-43A6-93E2-E9A14644E7BE} = {23CAD9E3-4913-4CC0-93DF-91494B3CFC44}
{F809885F-C4D9-460F-B231-3E2F01984F99} = {17E22697-CB77-4F38-AB13-BBDBD53B7829}