first commit

This commit is contained in:
pandacraft 2025-03-21 16:04:17 +01:00
commit a5a0434432
1126 changed files with 439481 additions and 0 deletions

View file

@ -0,0 +1,155 @@
using Windows.Devices.I2c;
namespace GrovePi.I2CDevices
{
/// <summary>
///
/// </summary>
public interface ISHTTemperatureAndHumiditySensor
{
double TemperatureInCelsius { get; }
double TemperatureInFahrenheit { get; }
double RelativeHumidity { get; }
void Measure();
}
/// <summary>
/// Specifies the model of sensor.
/// </summary>
public enum SHTModel
{
Sht31 = 0
}
/// <summary>
/// The repeatability setting influences the measurement duration and the current
/// consumption of the sensor.
/// </summary>
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;
}
/// <summary>
/// This triggers the sensor to reset its system controller and reloads calibration data from the memory.
/// </summary>
public void Reset()
{
_device.Write(SoftResetCommandAddress);
}
/// <summary>
/// All flags (Bit 15, 11, 10, 4) in the status register can be cleared (set to zero)
/// </summary>
public void ClearStatusRegister()
{
_device.Write(ClearStatusRegisterCommandAddress);
}
/// <summary>
/// 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.
/// </summary>
/// <returns>16bit status register response</returns>
public byte[] ReadStatusRegister()
{
var statusResponse = new byte[2];
_device.WriteReadPartial(ReadStatusRegisterCommandAddress, statusResponse);
return statusResponse;
}
/// <summary>
/// The heater can be switched on and off by command
/// </summary>
public void EnableHeater()
{
_device.Write(EnableHeaterCommandAddress);
}
public void DisableHeater()
{
_device.Write(DisableHeaderCommandAddress);
}
/// <summary>
/// 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.
/// </summary>
internal void Break()
{
_device.Write(BreakCommandAddress);
}
}
}