mirror of
https://github.com/tinygo-org/drivers.git
synced 2026-07-26 10:38:41 +00:00
72 lines
1.7 KiB
Go
72 lines
1.7 KiB
Go
// 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"
|
|
"tinygo.org/x/drivers/internal/legacy"
|
|
)
|
|
|
|
// 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 := legacy.ReadRegister(d.bus, 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 = legacy.ReadRegister(d.bus, 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
|
|
}
|