mirror of
https://github.com/tinygo-org/drivers.git
synced 2026-07-26 10:38:41 +00:00
1bb1b621c6
Signed-off-by: deadprogram <ron@hybridgroup.com>
72 lines
1.8 KiB
Go
72 lines
1.8 KiB
Go
// Package bh1750 provides a driver for the BH1750 digital Ambient Light
|
|
//
|
|
// Datasheet:
|
|
// https://www.mouser.com/ds/2/348/bh1750fvi-e-186247.pdf
|
|
package bh1750 // import "tinygo.org/x/drivers/bh1750"
|
|
|
|
import (
|
|
"time"
|
|
|
|
"tinygo.org/x/drivers"
|
|
)
|
|
|
|
// SamplingMode is the sampling's resolution of the measurement
|
|
type SamplingMode byte
|
|
|
|
// Device wraps an I2C connection to a bh1750 device.
|
|
type Device struct {
|
|
bus drivers.I2C
|
|
Address uint16
|
|
mode SamplingMode
|
|
}
|
|
|
|
// New creates a new bh1750 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: bus,
|
|
Address: Address,
|
|
mode: CONTINUOUS_HIGH_RES_MODE,
|
|
}
|
|
}
|
|
|
|
// Configure sets up the device for communication
|
|
func (d *Device) Configure() {
|
|
d.bus.Tx(d.Address, []byte{POWER_ON}, nil)
|
|
d.SetMode(d.mode)
|
|
}
|
|
|
|
// RawSensorData returns the raw value from the bh1750
|
|
func (d *Device) RawSensorData() uint16 {
|
|
|
|
buf := []byte{1, 0}
|
|
d.bus.Tx(d.Address, nil, buf)
|
|
return (uint16(buf[0]) << 8) | uint16(buf[1])
|
|
}
|
|
|
|
// Illuminance returns the adjusted value in mlx (milliLux)
|
|
func (d *Device) Illuminance() int32 {
|
|
|
|
lux := uint32(d.RawSensorData())
|
|
var coef uint32
|
|
if d.mode == CONTINUOUS_HIGH_RES_MODE || d.mode == ONE_TIME_HIGH_RES_MODE {
|
|
coef = HIGH_RES
|
|
} else if d.mode == CONTINUOUS_HIGH_RES_MODE_2 || d.mode == ONE_TIME_HIGH_RES_MODE_2 {
|
|
coef = HIGH_RES2
|
|
} else {
|
|
coef = LOW_RES
|
|
}
|
|
// 100 * coef * lux * (5/6)
|
|
// 5/6 = measurement accuracy as per the datasheet
|
|
return int32(250 * coef * lux / 3)
|
|
}
|
|
|
|
// SetMode changes the reading mode for the sensor
|
|
func (d *Device) SetMode(mode SamplingMode) {
|
|
d.mode = mode
|
|
d.bus.Tx(d.Address, []byte{byte(d.mode)}, nil)
|
|
time.Sleep(10 * time.Millisecond)
|
|
}
|