forked from tinygo-org/drivers
-
Notifications
You must be signed in to change notification settings - Fork 0
/
tmp102.go
68 lines (51 loc) · 1.67 KB
/
tmp102.go
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
// Package tmp102 implements a driver for the TMP102 digital temperature sensor.
//
// Datasheet: https://download.mikroe.com/documents/datasheets/tmp102-data-sheet.pdf
package tmp102 // import "tinygo.org/x/drivers/tmp102"
import "tinygo.org/x/drivers"
// Device holds the already configured I2C bus and the address of the sensor.
type Device struct {
bus drivers.I2C
address uint8
}
// Config is the configuration for the TMP102.
type Config struct {
Address uint8
}
// New creates a new TMP102 connection. The I2C bus must already be configured.
func New(bus drivers.I2C) Device {
return Device{
bus: bus,
}
}
// Configure initializes the sensor with the given parameters.
func (d *Device) Configure(cfg Config) {
if cfg.Address == 0 {
cfg.Address = Address
}
d.address = cfg.Address
}
// Connected checks if the config register can be read and that the configuration is correct.
func (d *Device) Connected() bool {
configData := make([]byte, 2)
err := d.bus.ReadRegister(d.address, RegConfiguration, configData)
// Check the reset configuration values.
if err != nil || configData[0] != 0x60 || configData[1] != 0xA0 {
return false
}
return true
}
// Reads the temperature from the sensor and returns it in celsius milli degrees (°C/1000).
func (d *Device) ReadTemperature() (temperature int32, err error) {
tmpData := make([]byte, 2)
err = d.bus.ReadRegister(d.address, RegTemperature, tmpData)
if err != nil {
return
}
temperatureSum := int32((int16(tmpData[0])<<8 | int16(tmpData[1])) >> 4)
if (temperatureSum & int32(1<<11)) == int32(1<<11) {
temperatureSum |= int32(0xf800)
}
temperature = temperatureSum * 625
return temperature / 10, nil
}