|
| 1 | +// Package lps22hb implements a driver for LPS22HB, a MEMS nano pressure sensor. |
| 2 | +// |
| 3 | +// Datasheet: https://www.st.com/resource/en/datasheet/dm00140895.pdf |
| 4 | +// |
| 5 | +package lps22hb |
| 6 | + |
| 7 | +import ( |
| 8 | + "tinygo.org/x/drivers" |
| 9 | +) |
| 10 | + |
| 11 | +// Device wraps an I2C connection to a HTS221 device. |
| 12 | +type Device struct { |
| 13 | + bus drivers.I2C |
| 14 | + Address uint8 |
| 15 | +} |
| 16 | + |
| 17 | +// Connected returns whether LPS22HB has been found. |
| 18 | +// It does a "who am I" request and checks the response. |
| 19 | +func (d *Device) Connected() bool { |
| 20 | + data := []byte{0} |
| 21 | + d.bus.ReadRegister(d.Address, LPS22HB_WHO_AM_I_REG, data) |
| 22 | + return data[0] == 0xB1 |
| 23 | +} |
| 24 | + |
| 25 | +// Configure sets up the LPS22HB device for communication. |
| 26 | +func (d *Device) Configure() { |
| 27 | + // set to block update mode |
| 28 | + d.bus.WriteRegister(d.Address, LPS22HB_CTRL1_REG, []byte{0x02}) |
| 29 | +} |
| 30 | + |
| 31 | +// ReadPressure returns the pressure in milli pascals (mPa). |
| 32 | +func (d *Device) ReadPressure() (pressure int32, err error) { |
| 33 | + d.waitForOneShot() |
| 34 | + |
| 35 | + // read data |
| 36 | + data := []byte{0, 0, 0} |
| 37 | + d.bus.ReadRegister(d.Address, LPS22HB_PRESS_OUT_REG, data[:1]) |
| 38 | + d.bus.ReadRegister(d.Address, LPS22HB_PRESS_OUT_REG+1, data[1:2]) |
| 39 | + d.bus.ReadRegister(d.Address, LPS22HB_PRESS_OUT_REG+2, data[2:]) |
| 40 | + pValue := float32(uint32(data[2])<<16|uint32(data[1])<<8|uint32(data[0])) / 4096.0 |
| 41 | + |
| 42 | + return int32(pValue * 1000), nil |
| 43 | +} |
| 44 | + |
| 45 | +// ReadTemperature returns the temperature in celsius milli degrees (°C/1000). |
| 46 | +func (d *Device) ReadTemperature() (temperature int32, err error) { |
| 47 | + d.waitForOneShot() |
| 48 | + |
| 49 | + // read data |
| 50 | + data := []byte{0, 0} |
| 51 | + d.bus.ReadRegister(d.Address, LPS22HB_TEMP_OUT_REG, data[:1]) |
| 52 | + d.bus.ReadRegister(d.Address, LPS22HB_TEMP_OUT_REG+1, data[1:]) |
| 53 | + tValue := float32(int16(uint16(data[1])<<8|uint16(data[0]))) / 100.0 |
| 54 | + |
| 55 | + return int32(tValue * 1000), nil |
| 56 | +} |
| 57 | + |
| 58 | +// private functions |
| 59 | + |
| 60 | +// wait and trigger one shot in block update |
| 61 | +func (d *Device) waitForOneShot() { |
| 62 | + // trigger one shot |
| 63 | + d.bus.WriteRegister(d.Address, LPS22HB_CTRL2_REG, []byte{0x01}) |
| 64 | + |
| 65 | + // wait until one shot is cleared |
| 66 | + data := []byte{1} |
| 67 | + for { |
| 68 | + d.bus.ReadRegister(d.Address, LPS22HB_CTRL2_REG, data) |
| 69 | + if data[0]&0x01 == 0 { |
| 70 | + break |
| 71 | + } |
| 72 | + } |
| 73 | +} |
0 commit comments