hybridgroup.gobot/drivers/i2c/bh1750_driver.go

84 lines
1.9 KiB
Go

package i2c
import (
"errors"
"time"
)
const bh1750DefaultAddress = 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
)
// BH1750Driver is a driver for the BH1750 digital Ambient Light Sensor IC for I²C bus interface.
type BH1750Driver struct {
*Driver
mode byte
}
// NewBH1750Driver creates a new driver with specified i2c interface
// Params:
//
// c 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(c Connector, options ...func(Config)) *BH1750Driver {
h := &BH1750Driver{
Driver: NewDriver(c, "BH1750", bh1750DefaultAddress),
mode: BH1750_CONTINUOUS_HIGH_RES_MODE,
}
h.afterStart = h.initialize
for _, option := range options {
option(h)
}
// TODO: add commands for API
return h
}
// RawSensorData returns the raw value from the bh1750
func (h *BH1750Driver) RawSensorData() (int, error) {
buf := []byte{0, 0}
bytesRead, err := h.connection.Read(buf)
if err != nil {
return 0, err
}
if bytesRead != 2 {
return 0, errors.New("wrong number of bytes read")
}
level := int(buf[0])<<8 | int(buf[1])
return level, nil
}
// Lux returns the adjusted value from the bh1750
func (h *BH1750Driver) Lux() (int, error) {
rawLux, err := h.RawSensorData()
lux := int(float64(rawLux) / 1.2)
return lux, err
}
func (h *BH1750Driver) initialize() error {
err := h.connection.WriteByte(h.mode)
time.Sleep(10 * time.Microsecond)
if err != nil {
return err
}
return nil
}