mirror of
https://github.com/tinygo-org/drivers.git
synced 2026-07-26 10:38:41 +00:00
93 lines
2.3 KiB
Go
93 lines
2.3 KiB
Go
// Package adt7410 provides a driver for the adt7410 I2C Temperature Sensor.
|
|
//
|
|
// Datasheet: https://www.analog.com/media/en/technical-documentation/data-sheets/ADT7410.pdf
|
|
package adt7410 // import "tinygo.org/x/drivers/adt7410"
|
|
|
|
import (
|
|
"time"
|
|
|
|
"tinygo.org/x/drivers"
|
|
"tinygo.org/x/drivers/internal/legacy"
|
|
)
|
|
|
|
type Error uint8
|
|
|
|
const (
|
|
ErrInvalidID Error = 0x1
|
|
)
|
|
|
|
func (e Error) Error() string {
|
|
switch e {
|
|
case ErrInvalidID:
|
|
return "Invalid chip ID"
|
|
default:
|
|
return "Unknown error"
|
|
}
|
|
}
|
|
|
|
type Device struct {
|
|
bus drivers.I2C
|
|
buf []byte
|
|
Address uint8
|
|
}
|
|
|
|
// New returns ADT7410 device for the provided I2C bus using default address.
|
|
// of 0x48 (1001000). To use multiple ADT7410 devices, the last 2 bits of the address
|
|
// can be set using by connecting to the A1 and A0 pins to VDD or GND (for a
|
|
// total of up to 4 devices on a I2C bus). Also note that 10k pullups are
|
|
// recommended for the SDA and SCL lines.
|
|
func New(i2c drivers.I2C) *Device {
|
|
return &Device{
|
|
bus: i2c,
|
|
buf: make([]byte, 2),
|
|
Address: Address,
|
|
}
|
|
}
|
|
|
|
// Configure the ADT7410 device.
|
|
func (d *Device) Configure() (err error) {
|
|
// reset the chip
|
|
d.writeByte(RegReset, 0xFF)
|
|
time.Sleep(10 * time.Millisecond)
|
|
return
|
|
}
|
|
|
|
// Connected returns whether sensor has been found.
|
|
func (d *Device) Connected() bool {
|
|
data := []byte{0}
|
|
legacy.ReadRegister(d.bus, uint8(d.Address), RegID, data)
|
|
return data[0]&0xF8 == 0xC8
|
|
}
|
|
|
|
// ReadTemperature returns the temperature in celsius milli degrees (°C/1000)
|
|
func (d *Device) ReadTemperature() (temperature int32, err error) {
|
|
return (int32(d.readUint16(RegTempValueMSB)) * 1000) / 128, nil
|
|
}
|
|
|
|
// ReadTempC returns the value in the temperature value register, in Celsius.
|
|
func (d *Device) ReadTempC() float32 {
|
|
t := d.readUint16(RegTempValueMSB)
|
|
return float32(int(t)) / 128.0
|
|
}
|
|
|
|
// ReadTempF returns the value in the temperature value register, in Fahrenheit.
|
|
func (d *Device) ReadTempF() float32 {
|
|
return d.ReadTempC()*1.8 + 32.0
|
|
}
|
|
|
|
func (d *Device) writeByte(reg uint8, data byte) {
|
|
d.buf[0] = reg
|
|
d.buf[1] = data
|
|
d.bus.Tx(uint16(d.Address), d.buf, nil)
|
|
}
|
|
|
|
func (d *Device) readByte(reg uint8) byte {
|
|
legacy.ReadRegister(d.bus, d.Address, reg, d.buf)
|
|
return d.buf[0]
|
|
}
|
|
|
|
func (d *Device) readUint16(reg uint8) uint16 {
|
|
legacy.ReadRegister(d.bus, d.Address, reg, d.buf)
|
|
return uint16(d.buf[0])<<8 | uint16(d.buf[1])
|
|
}
|