2018-01-12 03:56:23 +08:00
|
|
|
package i2c
|
|
|
|
|
|
|
|
import (
|
|
|
|
"errors"
|
2022-12-09 02:29:51 +08:00
|
|
|
"time"
|
2018-01-12 03:56:23 +08:00
|
|
|
|
|
|
|
"gobot.io/x/gobot"
|
|
|
|
)
|
|
|
|
|
|
|
|
const bh1750Address = 0x23
|
|
|
|
|
|
|
|
const (
|
|
|
|
BH1750_POWER_DOWN = 0x00
|
|
|
|
BH1750_POWER_ON = 0x01
|
|
|
|
BH1750_RESET = 0x07
|
|
|
|
BH1750_CONTINUOUS_HIGH_RES_MODE = 0x10
|
|
|
|
BH1750_CONTINUOUS_HIGH_RES_MODE_2 = 0x11
|
|
|
|
BH1750_CONTINUOUS_LOW_RES_MODE = 0x13
|
|
|
|
BH1750_ONE_TIME_HIGH_RES_MODE = 0x20
|
|
|
|
BH1750_ONE_TIME_HIGH_RES_MODE_2 = 0x21
|
|
|
|
BH1750_ONE_TIME_LOW_RES_MODE = 0x23
|
|
|
|
)
|
|
|
|
|
2018-01-12 23:26:21 +08:00
|
|
|
// BH1750Driver is a driver for the BH1750 digital Ambient Light Sensor IC for I²C bus interface.
|
|
|
|
//
|
2018-01-12 03:56:23 +08:00
|
|
|
type BH1750Driver struct {
|
|
|
|
name string
|
|
|
|
connector Connector
|
|
|
|
connection Connection
|
|
|
|
mode byte
|
|
|
|
Config
|
|
|
|
}
|
|
|
|
|
|
|
|
// NewBH1750Driver creates a new driver with specified i2c interface
|
|
|
|
// Params:
|
|
|
|
// conn Connector - the Adaptor to use with this Driver
|
|
|
|
//
|
|
|
|
// Optional params:
|
|
|
|
// i2c.WithBus(int): bus to use with this driver
|
|
|
|
// i2c.WithAddress(int): address to use with this driver
|
|
|
|
//
|
|
|
|
func NewBH1750Driver(a Connector, options ...func(Config)) *BH1750Driver {
|
|
|
|
m := &BH1750Driver{
|
|
|
|
name: gobot.DefaultName("BH1750"),
|
|
|
|
connector: a,
|
|
|
|
Config: NewConfig(),
|
2022-12-09 02:29:51 +08:00
|
|
|
mode: BH1750_CONTINUOUS_HIGH_RES_MODE,
|
2018-01-12 03:56:23 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
for _, option := range options {
|
|
|
|
option(m)
|
|
|
|
}
|
|
|
|
|
|
|
|
// TODO: add commands for API
|
|
|
|
return m
|
|
|
|
}
|
|
|
|
|
|
|
|
// Name returns the Name for the Driver
|
|
|
|
func (h *BH1750Driver) Name() string { return h.name }
|
|
|
|
|
|
|
|
// SetName sets the Name for the Driver
|
|
|
|
func (h *BH1750Driver) SetName(n string) { h.name = n }
|
|
|
|
|
|
|
|
// Connection returns the connection for the Driver
|
|
|
|
func (h *BH1750Driver) Connection() gobot.Connection { return h.connector.(gobot.Connection) }
|
|
|
|
|
|
|
|
// Start initialized the bh1750
|
|
|
|
func (h *BH1750Driver) Start() (err error) {
|
2022-12-09 02:29:51 +08:00
|
|
|
bus := h.GetBusOrDefault(h.connector.DefaultBus())
|
2018-01-12 03:56:23 +08:00
|
|
|
address := h.GetAddressOrDefault(bh1750Address)
|
|
|
|
|
|
|
|
h.connection, err = h.connector.GetConnection(address, bus)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
err = h.connection.WriteByte(h.mode)
|
|
|
|
time.Sleep(10 * time.Microsecond)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
// Halt returns true if devices is halted successfully
|
|
|
|
func (h *BH1750Driver) Halt() (err error) { return }
|
|
|
|
|
2018-01-12 23:26:21 +08:00
|
|
|
// RawSensorData returns the raw value from the bh1750
|
2018-01-12 03:56:23 +08:00
|
|
|
func (h *BH1750Driver) RawSensorData() (level int, err error) {
|
|
|
|
|
|
|
|
buf := []byte{0, 0}
|
|
|
|
bytesRead, err := h.connection.Read(buf)
|
|
|
|
if bytesRead != 2 {
|
|
|
|
err = errors.New("wrong number of bytes read")
|
|
|
|
return
|
|
|
|
}
|
|
|
|
if err != nil {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
level = int(buf[0])<<8 | int(buf[1])
|
|
|
|
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2018-01-12 23:26:21 +08:00
|
|
|
// Lux returns the adjusted value from the bh1750
|
2018-01-12 03:56:23 +08:00
|
|
|
func (h *BH1750Driver) Lux() (lux int, err error) {
|
|
|
|
|
|
|
|
lux, err = h.RawSensorData()
|
|
|
|
lux = int(float64(lux) / 1.2)
|
|
|
|
|
|
|
|
return
|
|
|
|
}
|