mirror of
https://github.com/tinygo-org/drivers.git
synced 2026-08-03 06:27:47 +00:00
2a621dc3b1
mcp9808: add support for temperature sensor
99 lines
2.1 KiB
Go
99 lines
2.1 KiB
Go
// Package mcp9808 implements a driver for the MCP9808 High Accuracy I2C Temperature Sensor
|
|
//
|
|
// Datasheet: https://cdn-shop.adafruit.com/datasheets/MCP9808.pdf
|
|
// Module: https://www.adafruit.com/product/1782
|
|
// Only implemented: temperature reading, resolution read & set
|
|
package mcp9808
|
|
|
|
import (
|
|
"encoding/binary"
|
|
"errors"
|
|
|
|
"tinygo.org/x/drivers"
|
|
)
|
|
|
|
type Device struct {
|
|
bus drivers.I2C
|
|
Address uint16
|
|
}
|
|
|
|
func New(bus drivers.I2C) Device {
|
|
return Device{bus, MCP9808_I2CADDR_DEFAULT}
|
|
}
|
|
|
|
func (d *Device) Connected() bool {
|
|
data := make([]byte, 2)
|
|
d.Read(MCP9808_REG_DEVICE_ID, &data)
|
|
return binary.BigEndian.Uint16(data) == MCP9808_DEVICE_ID
|
|
}
|
|
|
|
func (d *Device) ReadTemperature() (float64, error) {
|
|
data := make([]byte, 2)
|
|
var temp float64
|
|
if err := d.Read(MCP9808_REG_AMBIENT_TEMP, &data); err != nil {
|
|
return 0, err
|
|
}
|
|
|
|
data[0] = data[0] & 0x1F
|
|
if data[0]&0x10 == 0x10 {
|
|
data[0] = data[0] & 0x0F
|
|
temp = float64(data[0])*16 + float64(data[1])/16.0 - 256
|
|
}
|
|
temp = float64(data[0])*16 + float64(data[1])/16.0
|
|
return temp, nil
|
|
}
|
|
|
|
func (d *Device) ReadResolution() (resolution, error) {
|
|
data := make([]byte, 2)
|
|
err := d.Read(MCP9808_REG_RESOLUTION, &data)
|
|
if err != nil {
|
|
return 0, err
|
|
}
|
|
switch data[0] {
|
|
case 0:
|
|
return Low, nil
|
|
case 1:
|
|
return Medium, nil
|
|
case 2:
|
|
return High, nil
|
|
case 3:
|
|
return Maximum, nil
|
|
|
|
default:
|
|
return 0, errors.New("unknown resolution")
|
|
}
|
|
}
|
|
|
|
func (d *Device) SetResolution(r resolution) error {
|
|
switch r {
|
|
case Low:
|
|
if err := d.Write(MCP9808_REG_RESOLUTION, []byte{0x00}); err != nil {
|
|
return err
|
|
}
|
|
case Medium:
|
|
if err := d.Write(MCP9808_REG_RESOLUTION, []byte{0x01}); err != nil {
|
|
return err
|
|
}
|
|
case High:
|
|
if err := d.Write(MCP9808_REG_RESOLUTION, []byte{0x02}); err != nil {
|
|
return err
|
|
}
|
|
case Maximum:
|
|
if err := d.Write(MCP9808_REG_RESOLUTION, []byte{0x03}); err != nil {
|
|
return err
|
|
}
|
|
default:
|
|
return nil
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (d *Device) Write(register byte, data []byte) error {
|
|
buf := append([]byte{register}, data...)
|
|
return d.bus.Tx(d.Address, buf, nil)
|
|
}
|
|
|
|
func (d *Device) Read(register byte, data *[]byte) error {
|
|
return d.bus.Tx(d.Address, []byte{register}, *data)
|
|
}
|