mirror of
https://github.com/tinygo-org/drivers.git
synced 2026-08-09 09:23:39 +00:00
6763521eff
This type should be used whenever a sensor (or actuator?) works with a
temperature. For example, this commit changes the signature:
ReadTemperature() (int32, error)
to the following:
ReadTemperature() (drivers.Temperature, error)
I believe this is much clearer in intent. It also makes it trivial to
introduce common conversions. For example, there are already Celsius()
and Fahrenheit() methods to convert to the given units, as a floating
point. More units could be added as needed, for example a CelsiusInt().
57 lines
1.8 KiB
Go
57 lines
1.8 KiB
Go
// Package mag3110 implements a driver for the MAG3110 3-axis magnetometer by
|
|
// Freescale/NXP.
|
|
//
|
|
// Datasheet: https://www.nxp.com/docs/en/data-sheet/MAG3110.pdf
|
|
//
|
|
package mag3110 // import "tinygo.org/x/drivers/mag3110"
|
|
|
|
import "tinygo.org/x/drivers"
|
|
|
|
// Device wraps an I2C connection to a MAG3110 device.
|
|
type Device struct {
|
|
bus drivers.I2C
|
|
Address uint16
|
|
}
|
|
|
|
// New creates a new MAG3110 connection. The I2C bus must already be
|
|
// configured.
|
|
//
|
|
// This function only creates the Device object, it does not touch the device.
|
|
func New(bus drivers.I2C) Device {
|
|
return Device{bus, Address}
|
|
}
|
|
|
|
// Connected returns whether a MAG3110 has been found.
|
|
// It does a "who am I" request and checks the response.
|
|
func (d Device) Connected() bool {
|
|
data := []byte{0}
|
|
d.bus.ReadRegister(uint8(d.Address), WHO_AM_I, data)
|
|
return data[0] == 0xC4
|
|
}
|
|
|
|
// Configure sets up the device for communication.
|
|
func (d Device) Configure() {
|
|
d.bus.WriteRegister(uint8(d.Address), CTRL_REG2, []uint8{0x80}) // Power down when not used
|
|
}
|
|
|
|
// ReadMagnetic reads the vectors of the magnetic field of the device and
|
|
// returns it.
|
|
func (d Device) ReadMagnetic() (x int16, y int16, z int16) {
|
|
d.bus.WriteRegister(uint8(d.Address), CTRL_REG1, []uint8{0x1a}) // Request a measurement
|
|
|
|
data := make([]byte, 6)
|
|
d.bus.ReadRegister(uint8(d.Address), OUT_X_MSB, data)
|
|
x = int16((uint16(data[0]) << 8) | uint16(data[1]))
|
|
y = int16((uint16(data[2]) << 8) | uint16(data[3]))
|
|
z = int16((uint16(data[4]) << 8) | uint16(data[5]))
|
|
return
|
|
}
|
|
|
|
// ReadTemperature reads and returns the current die temperature in
|
|
// celsius milli degrees (°C/1000).
|
|
func (d Device) ReadTemperature() (drivers.Temperature, error) {
|
|
data := make([]byte, 1)
|
|
d.bus.ReadRegister(uint8(d.Address), DIE_TEMP, data)
|
|
return drivers.Temperature(data[0]) * 1000, nil
|
|
}
|