using Windows.Devices.I2c; namespace GrovePi.I2CDevices { /// /// /// public interface ISHTTemperatureAndHumiditySensor { double TemperatureInCelsius { get; } double TemperatureInFahrenheit { get; } double RelativeHumidity { get; } void Measure(); } /// /// Specifies the model of sensor. /// public enum SHTModel { Sht31 = 0 } /// /// The repeatability setting influences the measurement duration and the current /// consumption of the sensor. /// public enum MeasurementMode { HighRepeatClockStretch = 0, MediumRepeatClockStretch, LowRepeatClockStretch, HighRepeat, MediumRepeat, LowRepeat } internal class SHTTemperatureAndHumiditySensor : ISHTTemperatureAndHumiditySensor { private readonly SHTModel _model; internal I2cDevice _device; private byte[] MeasureHighClockStretch = new byte[2] { 0x2C, 0x06 }; private byte[] MeasureMediumClockStretch = new byte[2] { 0x2C, 0x0D }; private byte[] MeasureLowClockStretch = new byte[2] { 0x2C, 0x10 }; private byte[] MeasureHigh = new byte[2] { 0x24, 0x00 }; private byte[] MeasureMedium = new byte[2] { 0x24, 0x0B }; private byte[] MeasureLow = new byte[2] { 0x24, 0x16 }; private byte[] ReadStatusRegisterCommandAddress = new byte[2] { 0xF3, 0x2D }; private byte[] ClearStatusRegisterCommandAddress = new byte[2] { 0x30, 0x41 }; private byte[] SoftResetCommandAddress = new byte[2] { 0x30, 0xA2 }; private byte[] EnableHeaterCommandAddress = new byte[2] { 0x30, 0x6D }; private byte[] DisableHeaderCommandAddress = new byte[2] { 0x30, 0x66 }; private byte[] BreakCommandAddress = new byte[2] { 0x30, 0x93 }; private byte[] _sensorData = new byte[6]; private byte[] _sensorCommand = new byte[4]; public double TemperatureInCelsius { get; set; } public double TemperatureInFahrenheit { get; set; } public double RelativeHumidity { get; set; } internal SHTTemperatureAndHumiditySensor(I2cDevice sensorDevice, SHTModel model, MeasurementMode measureMode) { _device = sensorDevice; _model = model; switch (measureMode) { case MeasurementMode.HighRepeatClockStretch: _sensorCommand = MeasureHighClockStretch; break; case MeasurementMode.MediumRepeatClockStretch: _sensorCommand = MeasureMediumClockStretch; break; case MeasurementMode.LowRepeatClockStretch: _sensorCommand = MeasureLowClockStretch; break; case MeasurementMode.HighRepeat: _sensorCommand = MeasureHigh; break; case MeasurementMode.MediumRepeat: _sensorCommand = MeasureMedium; break; case MeasurementMode.LowRepeat: _sensorCommand = MeasureLow; break; default: _sensorCommand = MeasureHigh; break; } } public void Measure() { _device.WriteRead(_sensorCommand, _sensorData); TemperatureInCelsius = (((_sensorData[0] * 256) + _sensorData[1]) * 175.0) / 65535.0 - 45.0; TemperatureInFahrenheit = (((_sensorData[0] * 256) + _sensorData[1]) * 315.0) / 65535.0 - 49.0; RelativeHumidity = (((_sensorData[3] * 256) + _sensorData[4])) * 100.0 / 65535.0 - 6.0; } /// /// This triggers the sensor to reset its system controller and reloads calibration data from the memory. /// public void Reset() { _device.Write(SoftResetCommandAddress); } /// /// All flags (Bit 15, 11, 10, 4) in the status register can be cleared (set to zero) /// public void ClearStatusRegister() { _device.Write(ClearStatusRegisterCommandAddress); } /// /// The status register contains information on the operational status of the heater, the alert mode and on /// the execution status of the last command and the last write sequence. /// /// 16bit status register response public byte[] ReadStatusRegister() { var statusResponse = new byte[2]; _device.WriteReadPartial(ReadStatusRegisterCommandAddress, statusResponse); return statusResponse; } /// /// The heater can be switched on and off by command /// public void EnableHeater() { _device.Write(EnableHeaterCommandAddress); } public void DisableHeater() { _device.Write(DisableHeaderCommandAddress); } /// /// It is rrecommended to stop the periodic data acquisition prior to sending another command using the break command. /// Upon reception of the break command the sensor enters the single shot mode. /// internal void Break() { _device.Write(BreakCommandAddress); } } }