/
Tmp102.cs
85 lines (75 loc) · 2.78 KB
/
Tmp102.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
using Meadow.Hardware;
using Meadow.Peripherals.Sensors;
using System.Threading.Tasks;
namespace Meadow.Foundation.Sensors.Temperature
{
/// <summary>
/// TMP102 Temperature sensor object
/// </summary>
public partial class Tmp102 : ByteCommsSensorBase<Units.Temperature>,
ITemperatureSensor, II2cPeripheral
{
/// <summary>
/// The default I2C address for the peripheral
/// </summary>
public byte DefaultI2cAddress => (byte)Addresses.Default;
/// <summary>
/// Backing variable for the SensorResolution property
/// </summary>
private Resolution _sensorResolution;
/// <summary>
/// Get / set the resolution of the sensor
/// </summary>
public Resolution SensorResolution
{
get => _sensorResolution;
set
{
BusComms?.ReadRegister(0x01, ReadBuffer.Span);
if (value == Resolution.Resolution12Bits)
{
ReadBuffer.Span[1] &= 0xef;
}
else
{
ReadBuffer.Span[1] |= 0x10;
}
BusComms?.WriteRegister(0x01, ReadBuffer.Span);
_sensorResolution = value;
}
}
/// <summary>
/// The temperature from the last reading
/// </summary>
public Units.Temperature? Temperature { get; protected set; }
/// <summary>
/// Create a new TMP102 object using the default configuration for the sensor
/// </summary>
/// <param name="i2cBus">The I2CBus</param>
/// <param name="address">I2C address of the sensor</param>
public Tmp102(II2cBus i2cBus, byte address = (byte)Addresses.Default)
: base(i2cBus, address, readBufferSize: 2, writeBufferSize: 2)
{
BusComms?.ReadRegister(0x01, ReadBuffer.Span);
_sensorResolution = (ReadBuffer.Span[1] & 0x10) > 0 ?
Resolution.Resolution13Bits : Resolution.Resolution12Bits;
}
/// <summary>
/// Update the Temperature property
/// </summary>
protected override Task<Units.Temperature> ReadSensor()
{
BusComms?.ReadRegister(0x00, ReadBuffer.Span);
int sensorReading;
if (SensorResolution == Resolution.Resolution12Bits)
{
sensorReading = (ReadBuffer.Span[0] << 4) | (ReadBuffer.Span[1] >> 4);
}
else
{
sensorReading = (ReadBuffer.Span[0] << 5) | (ReadBuffer.Span[1] >> 3);
}
return Task.FromResult(new Units.Temperature((float)(sensorReading * 0.0625), Units.Temperature.UnitType.Celsius));
}
}
}