mirror of
https://github.com/tinygo-org/drivers.git
synced 2026-08-04 23:17:47 +00:00
Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 6763521eff |
@@ -214,6 +214,6 @@ NOTESTS = build examples flash semihosting pcd8544 shiftregister st7789 micropho
|
|||||||
TESTS = $(filter-out $(addsuffix /%,$(NOTESTS)),$(DRIVERS))
|
TESTS = $(filter-out $(addsuffix /%,$(NOTESTS)),$(DRIVERS))
|
||||||
|
|
||||||
unit-test:
|
unit-test:
|
||||||
@go test -v $(addprefix ./,$(TESTS))
|
@go test -v . $(addprefix ./,$(TESTS))
|
||||||
|
|
||||||
test: clean fmt-check unit-test smoke-test
|
test: clean fmt-check unit-test smoke-test
|
||||||
|
|||||||
+2
-13
@@ -60,19 +60,8 @@ func (d *Device) Connected() bool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// ReadTemperature returns the temperature in celsius milli degrees (°C/1000)
|
// ReadTemperature returns the temperature in celsius milli degrees (°C/1000)
|
||||||
func (d *Device) ReadTemperature() (temperature int32, err error) {
|
func (d *Device) ReadTemperature() (temperature drivers.Temperature, err error) {
|
||||||
return (int32(d.readUint16(RegTempValueMSB)) * 1000) / 128, nil
|
return (drivers.Temperature(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) {
|
func (d *Device) writeByte(reg uint8, data byte) {
|
||||||
|
|||||||
+2
-2
@@ -114,14 +114,14 @@ func (d *Device) Reset() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// ReadTemperature returns the temperature in celsius milli degrees (°C/1000)
|
// ReadTemperature returns the temperature in celsius milli degrees (°C/1000)
|
||||||
func (d *Device) ReadTemperature() (int32, error) {
|
func (d *Device) ReadTemperature() (drivers.Temperature, error) {
|
||||||
data, err := d.readData()
|
data, err := d.readData()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, err
|
return 0, err
|
||||||
}
|
}
|
||||||
|
|
||||||
temp, _ := d.calculateTemp(data)
|
temp, _ := d.calculateTemp(data)
|
||||||
return temp, nil
|
return drivers.Temperature(temp), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// ReadPressure returns the pressure in milli pascals mPa
|
// ReadPressure returns the pressure in milli pascals mPa
|
||||||
|
|||||||
+2
-2
@@ -81,7 +81,7 @@ func (d *DeviceSPI) Reset() error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// ReadTemperature returns the temperature in celsius milli degrees (°C/1000).
|
// ReadTemperature returns the temperature in celsius milli degrees (°C/1000).
|
||||||
func (d *DeviceSPI) ReadTemperature() (temperature int32, err error) {
|
func (d *DeviceSPI) ReadTemperature() (temperature drivers.Temperature, err error) {
|
||||||
data := d.buf[:3]
|
data := d.buf[:3]
|
||||||
data[0] = 0x80 | reg_TEMPERATURE_0
|
data[0] = 0x80 | reg_TEMPERATURE_0
|
||||||
data[1] = 0
|
data[1] = 0
|
||||||
@@ -109,7 +109,7 @@ func (d *DeviceSPI) ReadTemperature() (temperature int32, err error) {
|
|||||||
// rawTemperature * 1000 * 64 / 0x8000 + 23000
|
// rawTemperature * 1000 * 64 / 0x8000 + 23000
|
||||||
// rawTemperature * 64000 / 0x8000 + 23000
|
// rawTemperature * 64000 / 0x8000 + 23000
|
||||||
// rawTemperature * 125 / 64 + 23000
|
// rawTemperature * 125 / 64 + 23000
|
||||||
temperature = int32(rawTemperature)*125/64 + 23000
|
temperature = drivers.Temperature(rawTemperature)*125/64 + 23000
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+2
-2
@@ -81,14 +81,14 @@ func (d *Device) Configure() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// ReadTemperature returns the temperature in celsius milli degrees (°C/1000).
|
// ReadTemperature returns the temperature in celsius milli degrees (°C/1000).
|
||||||
func (d *Device) ReadTemperature() (temperature int32, err error) {
|
func (d *Device) ReadTemperature() (temperature drivers.Temperature, err error) {
|
||||||
rawTemp, err := d.rawTemp()
|
rawTemp, err := d.rawTemp()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
b5 := d.calculateB5(rawTemp)
|
b5 := d.calculateB5(rawTemp)
|
||||||
t := (b5 + 8) >> 4
|
t := (b5 + 8) >> 4
|
||||||
return 100 * t, nil
|
return drivers.Temperature(100 * t), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// ReadPressure returns the pressure in milli pascals (mPa).
|
// ReadPressure returns the pressure in milli pascals (mPa).
|
||||||
|
|||||||
+2
-2
@@ -132,7 +132,7 @@ func (d *Device) PrintCali() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// ReadTemperature returns the temperature in celsius milli degrees (°C/1000).
|
// ReadTemperature returns the temperature in celsius milli degrees (°C/1000).
|
||||||
func (d *Device) ReadTemperature() (temperature int32, err error) {
|
func (d *Device) ReadTemperature() (temperature drivers.Temperature, err error) {
|
||||||
data, err := d.readData(REG_TEMP, 3)
|
data, err := d.readData(REG_TEMP, 3)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
@@ -150,7 +150,7 @@ func (d *Device) ReadTemperature() (temperature int32, err error) {
|
|||||||
|
|
||||||
// Convert from degrees to milli degrees by multiplying by 10.
|
// Convert from degrees to milli degrees by multiplying by 10.
|
||||||
// Will output 30250 milli degrees celsius for 30.25 degrees celsius
|
// Will output 30250 milli degrees celsius for 30.25 degrees celsius
|
||||||
temperature = 10 * ((tFine*5 + 128) >> 8)
|
temperature = drivers.Temperature(10 * ((tFine*5 + 128) >> 8))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+4
-4
@@ -133,16 +133,16 @@ func (d *Device) tlinCompensate() (int64, error) {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// ReadTemperature returns the temperature in centicelsius, i.e 2426 / 100 = 24.26 C
|
// ReadTemperature returns the temperature in milli degrees Celsius, i.e 24260 / 1000 = 24.26°C.
|
||||||
func (d *Device) ReadTemperature() (int32, error) {
|
func (d *Device) ReadTemperature() (drivers.Temperature, error) {
|
||||||
|
|
||||||
tlin, err := d.tlinCompensate()
|
tlin, err := d.tlinCompensate()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, err
|
return 0, err
|
||||||
}
|
}
|
||||||
|
|
||||||
temp := (tlin * 25) / 16384
|
temp := (tlin * 125) / 8192
|
||||||
return int32(temp), nil
|
return drivers.Temperature(temp), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// ReadPressure returns the pressure in centipascals, i.e 10132520 / 100 = 101325.20 Pa
|
// ReadPressure returns the pressure in centipascals, i.e 10132520 / 100 = 101325.20 Pa
|
||||||
|
|||||||
@@ -35,18 +35,6 @@ func (d DeviceType) extractData(buf []byte) (temp int16, hum uint16) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// Celsius and Fahrenheit temperature scales
|
|
||||||
type TemperatureScale uint8
|
|
||||||
|
|
||||||
func (t TemperatureScale) convertToFloat(temp int16) float32 {
|
|
||||||
if t == C {
|
|
||||||
return float32(temp) / 10
|
|
||||||
} else {
|
|
||||||
// Fahrenheit
|
|
||||||
return float32(temp)*(9.0/50.) + 32.
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// All functions return ErrorCode instance as error. This class can be used for more efficient error processing
|
// All functions return ErrorCode instance as error. This class can be used for more efficient error processing
|
||||||
type ErrorCode uint8
|
type ErrorCode uint8
|
||||||
|
|
||||||
@@ -57,9 +45,6 @@ const (
|
|||||||
DHT11 DeviceType = iota
|
DHT11 DeviceType = iota
|
||||||
DHT22
|
DHT22
|
||||||
|
|
||||||
C TemperatureScale = iota
|
|
||||||
F
|
|
||||||
|
|
||||||
ChecksumError ErrorCode = iota
|
ChecksumError ErrorCode = iota
|
||||||
NoSignalError
|
NoSignalError
|
||||||
NoDataError
|
NoDataError
|
||||||
|
|||||||
+6
-15
@@ -9,14 +9,15 @@ package dht // import "tinygo.org/x/drivers/dht"
|
|||||||
import (
|
import (
|
||||||
"machine"
|
"machine"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"tinygo.org/x/drivers"
|
||||||
)
|
)
|
||||||
|
|
||||||
// DummyDevice provides a basic interface for DHT devices.
|
// DummyDevice provides a basic interface for DHT devices.
|
||||||
type DummyDevice interface {
|
type DummyDevice interface {
|
||||||
ReadMeasurements() error
|
ReadMeasurements() error
|
||||||
Measurements() (temperature int16, humidity uint16, err error)
|
Measurements() (temperature int16, humidity uint16, err error)
|
||||||
Temperature() (int16, error)
|
Temperature() (drivers.Temperature, error)
|
||||||
TemperatureFloat(scale TemperatureScale) (float32, error)
|
|
||||||
Humidity() (uint16, error)
|
Humidity() (uint16, error)
|
||||||
HumidityFloat() (float32, error)
|
HumidityFloat() (float32, error)
|
||||||
}
|
}
|
||||||
@@ -49,23 +50,13 @@ func (t *device) ReadMeasurements() error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Getter for temperature. Temperature method returns temperature as it is sent by device.
|
// Getter for temperature. The temperature is returned in milli degrees Celsius.
|
||||||
// The temperature is measured temperature in Celsius multiplied by 10.
|
|
||||||
// If no successful measurements for this device was performed, returns UninitializedDataError.
|
// If no successful measurements for this device was performed, returns UninitializedDataError.
|
||||||
func (t *device) Temperature() (int16, error) {
|
func (t *device) Temperature() (drivers.Temperature, error) {
|
||||||
if !t.initialized {
|
if !t.initialized {
|
||||||
return 0, UninitializedDataError
|
return 0, UninitializedDataError
|
||||||
}
|
}
|
||||||
return t.temperature, nil
|
return drivers.Temperature(t.temperature) * 100, nil
|
||||||
}
|
|
||||||
|
|
||||||
// Getter for temperature. TemperatureFloat returns temperature in a given scale.
|
|
||||||
// If no successful measurements for this device was performed, returns UninitializedDataError.
|
|
||||||
func (t *device) TemperatureFloat(scale TemperatureScale) (float32, error) {
|
|
||||||
if !t.initialized {
|
|
||||||
return 0, UninitializedDataError
|
|
||||||
}
|
|
||||||
return scale.convertToFloat(t.temperature), nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Getter for humidity. Humidity returns humidity as it is sent by device.
|
// Getter for humidity. Humidity returns humidity as it is sent by device.
|
||||||
|
|||||||
@@ -9,6 +9,8 @@ package dht // import "tinygo.org/x/drivers/dht"
|
|||||||
import (
|
import (
|
||||||
"machine"
|
"machine"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"tinygo.org/x/drivers"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Device interface provides main functionality of the DHTXX sensors.
|
// Device interface provides main functionality of the DHTXX sensors.
|
||||||
@@ -35,10 +37,9 @@ func (m *managedDevice) Measurements() (temperature int16, humidity uint16, err
|
|||||||
return m.t.Measurements()
|
return m.t.Measurements()
|
||||||
}
|
}
|
||||||
|
|
||||||
// Getter for temperature. Temperature method returns temperature as it is sent by device.
|
// Getter for temperature. The temperature is returned in milli degrees Celsius.
|
||||||
// The temperature is measured temperature in Celsius multiplied by 10.
|
|
||||||
// Depending on the UpdatePolicy of the device may update cached measurements.
|
// Depending on the UpdatePolicy of the device may update cached measurements.
|
||||||
func (m *managedDevice) Temperature() (temp int16, err error) {
|
func (m *managedDevice) Temperature() (temp drivers.Temperature, err error) {
|
||||||
err = m.checkForUpdateOnDataRequest()
|
err = m.checkForUpdateOnDataRequest()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, err
|
return 0, err
|
||||||
@@ -64,16 +65,6 @@ func (m *managedDevice) checkForUpdateOnDataRequest() (err error) {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Getter for temperature. TemperatureFloat returns temperature in a given scale.
|
|
||||||
// Depending on the UpdatePolicy of the device may update cached measurements.
|
|
||||||
func (m *managedDevice) TemperatureFloat(scale TemperatureScale) (float32, error) {
|
|
||||||
err := m.checkForUpdateOnDataRequest()
|
|
||||||
if err != nil {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
return m.t.TemperatureFloat(scale)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Getter for humidity. Humidity returns humidity as it is sent by device.
|
// Getter for humidity. Humidity returns humidity as it is sent by device.
|
||||||
// The humidity is measured in percentages multiplied by 10.
|
// The humidity is measured in percentages multiplied by 10.
|
||||||
// Depending on the UpdatePolicy of the device may update cached measurements.
|
// Depending on the UpdatePolicy of the device may update cached measurements.
|
||||||
|
|||||||
+2
-2
@@ -134,13 +134,13 @@ func (d *Device) ReadTime() (dt time.Time, err error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// ReadTemperature returns the temperature in millicelsius (mC)
|
// ReadTemperature returns the temperature in millicelsius (mC)
|
||||||
func (d *Device) ReadTemperature() (int32, error) {
|
func (d *Device) ReadTemperature() (drivers.Temperature, error) {
|
||||||
data := make([]uint8, 2)
|
data := make([]uint8, 2)
|
||||||
err := d.bus.ReadRegister(uint8(d.Address), REG_TEMP, data)
|
err := d.bus.ReadRegister(uint8(d.Address), REG_TEMP, data)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, err
|
return 0, err
|
||||||
}
|
}
|
||||||
return int32(data[0])*1000 + int32((data[1]>>6)*25)*10, nil
|
return drivers.Temperature(int32(data[0])*1000 + int32((data[1]>>6)*25)*10), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// uint8ToBCD converts a byte to BCD for the DS3231
|
// uint8ToBCD converts a byte to BCD for the DS3231
|
||||||
|
|||||||
@@ -19,8 +19,8 @@ func main() {
|
|||||||
sensor.Configure()
|
sensor.Configure()
|
||||||
|
|
||||||
for {
|
for {
|
||||||
temp := sensor.ReadTempF()
|
temp, _ := sensor.ReadTemperature()
|
||||||
fmt.Printf("temperature: %f\r\n", temp)
|
fmt.Printf("temperature: %f°C\r\n", temp.Celsius())
|
||||||
time.Sleep(time.Second)
|
time.Sleep(time.Second)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ func main() {
|
|||||||
|
|
||||||
for {
|
for {
|
||||||
temp, _ := sensor.ReadTemperature()
|
temp, _ := sensor.ReadTemperature()
|
||||||
println("Temperature:", strconv.FormatFloat(float64(temp)/1000, 'f', 2, 64), "°C")
|
println("Temperature:", strconv.FormatFloat(float64(temp.Celsius()), 'f', 2, 64), "°C")
|
||||||
press, _ := sensor.ReadPressure()
|
press, _ := sensor.ReadPressure()
|
||||||
println("Pressure:", strconv.FormatFloat(float64(press)/100000, 'f', 2, 64), "hPa")
|
println("Pressure:", strconv.FormatFloat(float64(press)/100000, 'f', 2, 64), "hPa")
|
||||||
hum, _ := sensor.ReadHumidity()
|
hum, _ := sensor.ReadHumidity()
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ func main() {
|
|||||||
println("Error reading temperature", err)
|
println("Error reading temperature", err)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
fmt.Printf("Temperature: %.2f °C\n", float32(t)/1000)
|
fmt.Printf("Temperature: %.2f °C\n", t.Celsius())
|
||||||
|
|
||||||
accelX, accelY, accelZ, err := sensor.ReadAcceleration()
|
accelX, accelY, accelZ, err := sensor.ReadAcceleration()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ func main() {
|
|||||||
|
|
||||||
for {
|
for {
|
||||||
temp, _ := sensor.ReadTemperature()
|
temp, _ := sensor.ReadTemperature()
|
||||||
println("Temperature:", float32(temp)/1000, "°C")
|
println("Temperature:", temp.Celsius(), "°C")
|
||||||
|
|
||||||
pressure, _ := sensor.ReadPressure()
|
pressure, _ := sensor.ReadPressure()
|
||||||
println("Pressure", float32(pressure)/100000, "hPa")
|
println("Pressure", float32(pressure)/100000, "hPa")
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ func main() {
|
|||||||
println("Error reading temperature")
|
println("Error reading temperature")
|
||||||
}
|
}
|
||||||
// Temperature in degrees Celsius
|
// Temperature in degrees Celsius
|
||||||
fmt.Printf("Temperature: %.2f °C\n", float32(t)/1000)
|
fmt.Printf("Temperature: %.2f °C\n", t.Celsius())
|
||||||
|
|
||||||
p, err := sensor.ReadPressure()
|
p, err := sensor.ReadPressure()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@@ -38,13 +38,13 @@ func main() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
for {
|
for {
|
||||||
temp, err := sensor.ReadTemperature() // returns the temperature in centicelsius
|
temp, err := sensor.ReadTemperature() // returns the temperature in millicelsius
|
||||||
press, err := sensor.ReadPressure() // returns the pressure in centipascals
|
press, err := sensor.ReadPressure() // returns the pressure in centipascals
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
println(err)
|
println(err)
|
||||||
} else {
|
} else {
|
||||||
println("Temperature: " + strconv.FormatInt(int64(temp), 10) + " cC")
|
println("Temperature:", temp/1000, "C")
|
||||||
println("Pressure: " + strconv.FormatInt(int64(press), 10) + " cPa\n")
|
println("Pressure: " + strconv.FormatInt(int64(press), 10) + " cPa\n")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ func main() {
|
|||||||
fmt.Printf("Date: %d/%s/%02d %02d:%02d:%02d \r\n", dt.Year(), dt.Month(), dt.Day(), dt.Hour(), dt.Minute(), dt.Second())
|
fmt.Printf("Date: %d/%s/%02d %02d:%02d:%02d \r\n", dt.Year(), dt.Month(), dt.Day(), dt.Hour(), dt.Minute(), dt.Second())
|
||||||
}
|
}
|
||||||
temp, _ := rtc.ReadTemperature()
|
temp, _ := rtc.ReadTemperature()
|
||||||
fmt.Printf("Temperature: %.2f °C \r\n", float32(temp)/1000)
|
fmt.Printf("Temperature: %.2f °C \r\n", temp.Celsius())
|
||||||
|
|
||||||
time.Sleep(time.Second * 1)
|
time.Sleep(time.Second * 1)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -23,8 +23,8 @@ func main() {
|
|||||||
println("Acceleration:", float32(x)/1000000, float32(y)/1000000, float32(z)/1000000)
|
println("Acceleration:", float32(x)/1000000, float32(y)/1000000, float32(z)/1000000)
|
||||||
x, y, z = accel.ReadRotation()
|
x, y, z = accel.ReadRotation()
|
||||||
println("Gyroscope:", float32(x)/1000000, float32(y)/1000000, float32(z)/1000000)
|
println("Gyroscope:", float32(x)/1000000, float32(y)/1000000, float32(z)/1000000)
|
||||||
x, _ = accel.ReadTemperature()
|
t, _ := accel.ReadTemperature()
|
||||||
println("Degrees C", float32(x)/1000, "\n\n")
|
println("Degrees C", t.Celsius(), "\n\n")
|
||||||
time.Sleep(time.Millisecond * 1000)
|
time.Sleep(time.Millisecond * 1000)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import (
|
|||||||
"machine"
|
"machine"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"tinygo.org/x/drivers"
|
||||||
"tinygo.org/x/drivers/lsm6dsox"
|
"tinygo.org/x/drivers/lsm6dsox"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -76,7 +77,7 @@ func calibrateGyro(device *lsm6dsox.Device) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Arduino IDE's Serial Plotter
|
// Arduino IDE's Serial Plotter
|
||||||
func printPlotter(ax, ay, az, gx, gy, gz, t int32) {
|
func printPlotter(ax, ay, az, gx, gy, gz int32, t drivers.Temperature) {
|
||||||
if SHOW_ACCELERATION {
|
if SHOW_ACCELERATION {
|
||||||
fmt.Printf("AX:%f, AY:%f, AZ:%f,", axis(ax, 0), axis(ay, 0), axis(az, 0))
|
fmt.Printf("AX:%f, AY:%f, AZ:%f,", axis(ax, 0), axis(ay, 0), axis(az, 0))
|
||||||
}
|
}
|
||||||
@@ -84,7 +85,7 @@ func printPlotter(ax, ay, az, gx, gy, gz, t int32) {
|
|||||||
fmt.Printf("GX:%f, GY:%f, GZ:%f,", axis(gx, cal[0]), axis(gy, cal[1]), axis(gz, cal[2]))
|
fmt.Printf("GX:%f, GY:%f, GZ:%f,", axis(gx, cal[0]), axis(gy, cal[1]), axis(gz, cal[2]))
|
||||||
}
|
}
|
||||||
if SHOW_TEMPERATURE {
|
if SHOW_TEMPERATURE {
|
||||||
fmt.Printf("T:%f", float32(t)/1000)
|
fmt.Printf("T:%f", t.Celsius())
|
||||||
}
|
}
|
||||||
println()
|
println()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ func main() {
|
|||||||
println("Magnetic readings:", x, y, z)
|
println("Magnetic readings:", x, y, z)
|
||||||
|
|
||||||
c, _ := mag.ReadTemperature()
|
c, _ := mag.ReadTemperature()
|
||||||
println("Temperature:", float32(c)/1000, "°C")
|
println("Temperature:", c.Celsius(), "°C")
|
||||||
|
|
||||||
time.Sleep(time.Millisecond * 100)
|
time.Sleep(time.Millisecond * 100)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ func main() {
|
|||||||
|
|
||||||
temp, _ := thermo.ReadTemperature()
|
temp, _ := thermo.ReadTemperature()
|
||||||
|
|
||||||
print(fmt.Sprintf("%.2f°C\r\n", float32(temp)/1000.0))
|
print(fmt.Sprintf("%.2f°C\r\n", temp.Celsius()))
|
||||||
|
|
||||||
time.Sleep(time.Millisecond * 1000)
|
time.Sleep(time.Millisecond * 1000)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -191,14 +191,14 @@ func (d *Device) ReadCompass() (h int32) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// ReadTemperature returns the temperature in Celsius milli degrees (°C/1000)
|
// ReadTemperature returns the temperature in Celsius milli degrees (°C/1000)
|
||||||
func (d *Device) ReadTemperature() (c int32, e error) {
|
func (d *Device) ReadTemperature() (c drivers.Temperature, e error) {
|
||||||
|
|
||||||
data1, data2 := []byte{0}, []byte{0}
|
data1, data2 := []byte{0}, []byte{0}
|
||||||
d.bus.ReadRegister(uint8(d.AccelAddress), OUT_TEMP_H_A, data1)
|
d.bus.ReadRegister(uint8(d.AccelAddress), OUT_TEMP_H_A, data1)
|
||||||
d.bus.ReadRegister(uint8(d.AccelAddress), OUT_TEMP_L_A, data2)
|
d.bus.ReadRegister(uint8(d.AccelAddress), OUT_TEMP_L_A, data2)
|
||||||
|
|
||||||
t := int16((uint16(data1[0])<<8 | uint16(data2[0]))) >> 4 // temperature offsef from 25 °C
|
t := int16((uint16(data1[0])<<8 | uint16(data2[0]))) >> 4 // temperature offsef from 25 °C
|
||||||
c = int32((float32(25) + float32(t)/8) * 1000)
|
c = drivers.Temperature(t)*125 + 25000
|
||||||
e = nil
|
e = nil
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-2
@@ -165,13 +165,13 @@ func (d *Device) ReadRotation() (x int32, y int32, z int32) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// ReadTemperature returns the temperature in celsius milli degrees (°C/1000)
|
// ReadTemperature returns the temperature in celsius milli degrees (°C/1000)
|
||||||
func (d *Device) ReadTemperature() (int32, error) {
|
func (d *Device) ReadTemperature() (drivers.Temperature, error) {
|
||||||
d.bus.ReadRegister(uint8(d.Address), OUT_TEMP_L, d.dataBufferTwo)
|
d.bus.ReadRegister(uint8(d.Address), OUT_TEMP_L, d.dataBufferTwo)
|
||||||
|
|
||||||
// From "Table 5. Temperature sensor characteristics"
|
// From "Table 5. Temperature sensor characteristics"
|
||||||
// temp = value/16 + 25
|
// temp = value/16 + 25
|
||||||
t := 25000 + (int32(int16((int16(d.dataBufferTwo[1])<<8)|int16(d.dataBufferTwo[0])))*125)/2
|
t := 25000 + (int32(int16((int16(d.dataBufferTwo[1])<<8)|int16(d.dataBufferTwo[0])))*125)/2
|
||||||
return t, nil
|
return drivers.Temperature(t), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// ReadSteps returns the steps of the pedometer
|
// ReadSteps returns the steps of the pedometer
|
||||||
|
|||||||
@@ -110,11 +110,11 @@ func (d *Device) ReadRotation() (x int32, y int32, z int32) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// ReadTemperature returns the temperature in celsius milli degrees (°C/1000)
|
// ReadTemperature returns the temperature in celsius milli degrees (°C/1000)
|
||||||
func (d *Device) ReadTemperature() (int32, error) {
|
func (d *Device) ReadTemperature() (drivers.Temperature, error) {
|
||||||
d.bus.ReadRegister(uint8(d.Address), OUT_TEMP_L, d.dataBufferTwo)
|
d.bus.ReadRegister(uint8(d.Address), OUT_TEMP_L, d.dataBufferTwo)
|
||||||
|
|
||||||
// From "Table 4. Temperature sensor characteristics"
|
// From "Table 4. Temperature sensor characteristics"
|
||||||
// temp = value/256 + 25
|
// temp = value/256 + 25
|
||||||
t := 25000 + (int32(int16((int16(d.dataBufferTwo[1])<<8)|int16(d.dataBufferTwo[0])))*125)/32
|
t := 25000 + (int32(int16((int16(d.dataBufferTwo[1])<<8)|int16(d.dataBufferTwo[0])))*125)/32
|
||||||
return t, nil
|
return drivers.Temperature(t), nil
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-2
@@ -49,8 +49,8 @@ func (d Device) ReadMagnetic() (x int16, y int16, z int16) {
|
|||||||
|
|
||||||
// ReadTemperature reads and returns the current die temperature in
|
// ReadTemperature reads and returns the current die temperature in
|
||||||
// celsius milli degrees (°C/1000).
|
// celsius milli degrees (°C/1000).
|
||||||
func (d Device) ReadTemperature() (int32, error) {
|
func (d Device) ReadTemperature() (drivers.Temperature, error) {
|
||||||
data := make([]byte, 1)
|
data := make([]byte, 1)
|
||||||
d.bus.ReadRegister(uint8(d.Address), DIE_TEMP, data)
|
d.bus.ReadRegister(uint8(d.Address), DIE_TEMP, data)
|
||||||
return int32(data[0]) * 1000, nil
|
return drivers.Temperature(data[0]) * 1000, nil
|
||||||
}
|
}
|
||||||
|
|||||||
+5
-5
@@ -31,9 +31,9 @@ func New(bus drivers.I2C) Device {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Read returns the temperature in celsius milli degrees (°C/1000).
|
// Read returns the temperature in celsius milli degrees (°C/1000).
|
||||||
func (d *Device) ReadTemperature() (tempMilliCelsius int32, err error) {
|
func (d *Device) ReadTemperature() (tempMilliCelsius drivers.Temperature, err error) {
|
||||||
tempMilliCelsius, _, err = d.ReadTemperatureHumidity()
|
tempMilliCelsius, _, err = d.ReadTemperatureHumidity()
|
||||||
return tempMilliCelsius, err
|
return drivers.Temperature(tempMilliCelsius), err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Read returns the relative humidity in hundredths of a percent.
|
// Read returns the relative humidity in hundredths of a percent.
|
||||||
@@ -43,15 +43,15 @@ func (d *Device) ReadHumidity() (relativeHumidity int16, err error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Read returns both the temperature and relative humidity.
|
// Read returns both the temperature and relative humidity.
|
||||||
func (d *Device) ReadTemperatureHumidity() (tempMilliCelsius int32, relativeHumidity int16, err error) {
|
func (d *Device) ReadTemperatureHumidity() (tempMilliCelsius drivers.Temperature, relativeHumidity int16, err error) {
|
||||||
var rawTemp, rawHum, errx = d.rawReadings()
|
var rawTemp, rawHum, errx = d.rawReadings()
|
||||||
if errx != nil {
|
if errx != nil {
|
||||||
err = errx
|
err = errx
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
tempMilliCelsius = (35000 * int32(rawTemp) / 13107) - 45000
|
tempMilliCelsius = drivers.Temperature((35000 * int32(rawTemp) / 13107) - 45000)
|
||||||
relativeHumidity = int16(2000 * int32(rawHum) / 13107)
|
relativeHumidity = int16(2000 * int32(rawHum) / 13107)
|
||||||
return tempMilliCelsius, relativeHumidity, err
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// rawReadings returns the sensor's raw values of the temperature and humidity
|
// rawReadings returns the sensor's raw values of the temperature and humidity
|
||||||
|
|||||||
@@ -29,6 +29,8 @@ package thermistor // import "tinygo.org/x/drivers/thermistor"
|
|||||||
import (
|
import (
|
||||||
"machine"
|
"machine"
|
||||||
"math"
|
"math"
|
||||||
|
|
||||||
|
"tinygo.org/x/drivers"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Device holds the ADC pin and the needed settings for calculating the
|
// Device holds the ADC pin and the needed settings for calculating the
|
||||||
@@ -61,7 +63,7 @@ func (d *Device) Configure() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// ReadTemperature returns the temperature in celsius milli degrees (°C/1000)
|
// ReadTemperature returns the temperature in celsius milli degrees (°C/1000)
|
||||||
func (d *Device) ReadTemperature() (temperature int32, err error) {
|
func (d *Device) ReadTemperature() (temperature drivers.Temperature, err error) {
|
||||||
var reading uint32
|
var reading uint32
|
||||||
if d.HighSide {
|
if d.HighSide {
|
||||||
// Thermistor connected from analog input to high logic level.
|
// Thermistor connected from analog input to high logic level.
|
||||||
@@ -82,5 +84,5 @@ func (d *Device) ReadTemperature() (temperature int32, err error) {
|
|||||||
steinhart = 1.0 / steinhart // Invert
|
steinhart = 1.0 / steinhart // Invert
|
||||||
steinhart -= 273.15 // convert to C
|
steinhart -= 273.15 // convert to C
|
||||||
|
|
||||||
return int32(steinhart * 1000), nil
|
return drivers.Temperature(steinhart * 1000), nil
|
||||||
}
|
}
|
||||||
|
|||||||
+3
-3
@@ -46,7 +46,7 @@ func (d *Device) Connected() bool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Reads the temperature from the sensor and returns it in celsius milli degrees (°C/1000).
|
// Reads the temperature from the sensor and returns it in celsius milli degrees (°C/1000).
|
||||||
func (d *Device) ReadTemperature() (temperature int32, err error) {
|
func (d *Device) ReadTemperature() (temperature drivers.Temperature, err error) {
|
||||||
|
|
||||||
tmpData := make([]byte, 2)
|
tmpData := make([]byte, 2)
|
||||||
|
|
||||||
@@ -62,7 +62,7 @@ func (d *Device) ReadTemperature() (temperature int32, err error) {
|
|||||||
temperatureSum |= int32(0xf800)
|
temperatureSum |= int32(0xf800)
|
||||||
}
|
}
|
||||||
|
|
||||||
temperature = temperatureSum * 625
|
temperature = drivers.Temperature(temperatureSum * 625 / 10)
|
||||||
|
|
||||||
return temperature / 10, nil
|
return temperature, nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,17 @@
|
|||||||
|
package drivers
|
||||||
|
|
||||||
|
// This file contains some common units that can be used in a sensor driver.
|
||||||
|
|
||||||
|
// Temperature is a temperature in Celsius milli degrees (°C/1000). For example,
|
||||||
|
// the value 25000 is 25°C.
|
||||||
|
type Temperature int32
|
||||||
|
|
||||||
|
// Celsius returns the temperature in degrees Celsius.
|
||||||
|
func (t Temperature) Celsius() float32 {
|
||||||
|
return float32(t) / 1000
|
||||||
|
}
|
||||||
|
|
||||||
|
// Fahrenheit returns the temperature in degrees Fahrenheit.
|
||||||
|
func (t Temperature) Fahrenheit() float32 {
|
||||||
|
return t.Celsius()*1.8 + 32
|
||||||
|
}
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
package drivers
|
||||||
|
|
||||||
|
import "testing"
|
||||||
|
|
||||||
|
func TestTemperature(t *testing.T) {
|
||||||
|
tests := []struct {
|
||||||
|
t Temperature
|
||||||
|
c float32 // Celsius
|
||||||
|
f float32 // Fahrenheit
|
||||||
|
}{
|
||||||
|
{-40000, -40, -40}, // -40°C
|
||||||
|
{0, 0, 32}, // 0°C
|
||||||
|
{20000, 20, 68}, // 20°C
|
||||||
|
{25000, 25, 77}, // 25°C
|
||||||
|
}
|
||||||
|
for _, tc := range tests {
|
||||||
|
c := tc.t.Celsius()
|
||||||
|
f := tc.t.Fahrenheit()
|
||||||
|
if c != tc.c {
|
||||||
|
t.Errorf("expected value %d to be %f°C, but got %f°C", tc.t, tc.c, c)
|
||||||
|
}
|
||||||
|
if f != tc.f {
|
||||||
|
t.Errorf("expected value %d to be %f°F, but got %f°F", tc.t, tc.f, f)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user