mirror of
https://github.com/tinygo-org/drivers.git
synced 2026-07-26 10:38:41 +00:00
Add driver for TMP102 low-power digital temperature sensor (#141)
* tmp102: add driver and example
This commit is contained in:
@@ -52,7 +52,7 @@ func main() {
|
||||
|
||||
## Currently supported devices
|
||||
|
||||
The following 45 devices are supported.
|
||||
The following 46 devices are supported.
|
||||
|
||||
| Device Name | Interface Type |
|
||||
|----------|-------------|
|
||||
@@ -101,6 +101,7 @@ The following 45 devices are supported.
|
||||
| [Waveshare 2.13" e-paper display](https://www.waveshare.com/w/upload/e/e6/2.13inch_e-Paper_Datasheet.pdf) | SPI |
|
||||
| [Waveshare 2.13" (B & C) e-paper display](https://www.waveshare.com/w/upload/d/d3/2.13inch-e-paper-b-Specification.pdf) | SPI |
|
||||
| [WS2812 RGB LED](https://cdn-shop.adafruit.com/datasheets/WS2812.pdf) | GPIO |
|
||||
| [TMP102 I2C Temperature Sensor](https://download.mikroe.com/documents/datasheets/tmp102-data-sheet.pdf) | I2C |
|
||||
|
||||
## Contributing
|
||||
|
||||
|
||||
@@ -0,0 +1,28 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"machine"
|
||||
"time"
|
||||
|
||||
"tinygo.org/x/drivers/tmp102"
|
||||
)
|
||||
|
||||
func main() {
|
||||
machine.I2C0.Configure(machine.I2CConfig{
|
||||
Frequency: machine.TWI_FREQ_400KHZ,
|
||||
})
|
||||
|
||||
thermo := tmp102.New(machine.I2C0)
|
||||
thermo.Configure(tmp102.Config{})
|
||||
|
||||
for {
|
||||
|
||||
temp, _ := thermo.ReadTemperature()
|
||||
|
||||
print(fmt.Sprintf("%.2f°C\r\n", float32(temp)/1000.0))
|
||||
|
||||
time.Sleep(time.Millisecond * 1000)
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
package tmp102
|
||||
|
||||
const (
|
||||
// Default I2C address
|
||||
Address = 0x48
|
||||
|
||||
// Temperature register address
|
||||
RegTemperature = 0x00
|
||||
|
||||
// Configuration register address
|
||||
RegConfiguration = 0x01
|
||||
|
||||
// Low limit register address
|
||||
RegLimitLow = 0x02
|
||||
|
||||
// High limit register address
|
||||
RegLimitHigh = 0x03
|
||||
)
|
||||
@@ -0,0 +1,58 @@
|
||||
// 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 (
|
||||
"machine"
|
||||
)
|
||||
|
||||
// Device holds the already configured I2C bus and the address of the sensor.
|
||||
type Device struct {
|
||||
bus machine.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 machine.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
|
||||
}
|
||||
|
||||
// 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 = d.bus.ReadRegister(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
|
||||
}
|
||||
Reference in New Issue
Block a user