mirror of
https://github.com/tinygo-org/drivers.git
synced 2026-07-26 10:38:41 +00:00
93 lines
2.6 KiB
Go
93 lines
2.6 KiB
Go
//go:build tinygo
|
|
// +build tinygo
|
|
|
|
// Package dht provides a driver for DHTXX family temperature and humidity sensors.
|
|
//
|
|
// [1] Datasheet DHT11: https://www.mouser.com/datasheet/2/758/DHT11-Technical-Data-Sheet-Translated-Version-1143054.pdf
|
|
// [2] Datasheet DHT22: https://cdn-shop.adafruit.com/datasheets/Digital+humidity+and+temperature+sensor+AM2302.pdf
|
|
// Adafruit C++ driver: https://github.com/adafruit/DHT-sensor-library
|
|
|
|
package dht // import "tinygo.org/x/drivers/dht"
|
|
|
|
import (
|
|
"machine"
|
|
"time"
|
|
)
|
|
|
|
// 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
|
|
type ErrorCode uint8
|
|
|
|
const (
|
|
startTimeout = time.Millisecond * 200
|
|
startingLow = time.Millisecond * 20
|
|
|
|
C TemperatureScale = iota
|
|
F
|
|
|
|
ChecksumError ErrorCode = iota
|
|
NoSignalError
|
|
NoDataError
|
|
UpdateError
|
|
UninitializedDataError
|
|
)
|
|
|
|
// error interface implementation for ErrorCode
|
|
func (e ErrorCode) Error() string {
|
|
switch e {
|
|
case ChecksumError:
|
|
// DHT returns ChecksumError if all the data from the sensor was received, but the checksum does not match.
|
|
return "checksum mismatch"
|
|
case NoSignalError:
|
|
// DHT returns NoSignalError if there was no reply from the sensor. Check sensor connection or the correct pin
|
|
// sis chosen,
|
|
return "no signal"
|
|
case NoDataError:
|
|
// DHT returns NoDataError if the connection was successfully initialized, but not all 40 bits from
|
|
// the sensor is received
|
|
return "no data"
|
|
case UpdateError:
|
|
// DHT returns UpdateError if ReadMeasurements function is called before time specified in UpdatePolicy or
|
|
// less than 2 seconds after past measurement
|
|
return "cannot update now"
|
|
case UninitializedDataError:
|
|
// DHT returns UninitializedDataError if user attempts to access data before first measurement
|
|
return "no measurements done"
|
|
}
|
|
// should never be reached
|
|
return "unknown error"
|
|
}
|
|
|
|
// Update policy of the DHT device. UpdateTime cannot be shorter than 2 seconds. According to dht specification sensor
|
|
// will return undefined data if update requested less than 2 seconds before last usage
|
|
type UpdatePolicy struct {
|
|
UpdateTime time.Duration
|
|
UpdateAutomatically bool
|
|
}
|
|
|
|
var (
|
|
// timeout counter equal to number of ticks per 1 millisecond
|
|
timeout counter
|
|
)
|
|
|
|
func init() {
|
|
timeout = cyclesPerMillisecond()
|
|
}
|
|
|
|
func cyclesPerMillisecond() counter {
|
|
freq := machine.CPUFrequency()
|
|
freq /= 1000
|
|
return counter(freq)
|
|
}
|