From 4bd873a82dd8f7a5154ce26f9cb951b9e98bad5a Mon Sep 17 00:00:00 2001 From: soypat Date: Tue, 26 Dec 2023 15:00:56 -0800 Subject: [PATCH] add draft apds9930 --- apds9930/apds9930.go | 68 ++++++++++++++++++++++++ apds9930/registers.go | 19 +++++++ examples/apds9930/proximity/proximity.go | 39 ++++++++++++++ 3 files changed, 126 insertions(+) create mode 100644 apds9930/apds9930.go create mode 100644 apds9930/registers.go create mode 100644 examples/apds9930/proximity/proximity.go diff --git a/apds9930/apds9930.go b/apds9930/apds9930.go new file mode 100644 index 0000000..1e59d79 --- /dev/null +++ b/apds9930/apds9930.go @@ -0,0 +1,68 @@ +package apds9930 + +import "tinygo.org/x/drivers" + +type Dev struct { + bus drivers.I2C + _txerr error + addr uint16 + buf [8]byte +} + +func New(bus drivers.I2C, addr uint8) Dev { + return Dev{bus: bus, addr: uint16(addr)} +} + +func (d *Dev) Init() error { + d.txNew() + d.txWrite8(regENABLE, 0x00) // disable all features. + d.txWrite8(regATIME, 0xee) // set default integration time. + d.txWrite8(regPPULSE, 0x04) + d.txWrite8(regWTIME, 0xee) // set default wait time. + d.txWrite8(regPTIME, 0xff) // set default pulse count. + d.txWrite8(regCONTROL, 0x20) + return d.txErr() +} + +func (d *Dev) EnableProximity() error { + d.txNew() + d.txWrite8(regENABLE, 8|4|2|1) + return d.txErr() +} + +func (d *Dev) ProximityAvailable() bool { + d.txNew() + return d.txRead8(regSTATUS)&0x20 == 1 +} + +func (d *Dev) ReadProximity() uint8 { + d.txNew() + h := d.txRead8(regPDATAH) + l := d.txRead8(regPDATAL) + if d.txErr() != nil { + return 0 + } + return (h << 8) | l +} + +func (d *Dev) txRead8(reg uint8) uint8 { + if d.txErr() != nil { + return 0 + } + d.buf[0] = reg | 0xa0 + d._txerr = d.bus.Tx(d.addr, d.buf[:1], d.buf[1:2]) + return d.buf[1] +} + +func (d *Dev) txWrite8(reg uint8, val uint8) { + if d.txErr() != nil { + return + } + d.buf[0] = reg | 0x80 + d.buf[1] = val + d._txerr = d.bus.Tx(d.addr, d.buf[:2], nil) +} + +func (d *Dev) txNew() { d._txerr = nil } + +func (d *Dev) txErr() error { return d._txerr } diff --git a/apds9930/registers.go b/apds9930/registers.go new file mode 100644 index 0000000..79587e5 --- /dev/null +++ b/apds9930/registers.go @@ -0,0 +1,19 @@ +package apds9930 + +const ( + regENABLE = 0x00 + regATIME = 0x01 + regPTIME = 0x02 + regWTIME = 0x03 + regPILTL = 0x08 + regPILTH = 0x09 + regPIHTL = 0x0A + regPIHTH = 0x0B + regCONFIG = 0x0D + regPPULSE = 0x0E + regCONTROL = 0x0F + regSTATUS = 0x13 + regPDATAL = 0x18 + regPDATAH = 0x19 + regPOFFSET = 0x1E +) diff --git a/examples/apds9930/proximity/proximity.go b/examples/apds9930/proximity/proximity.go new file mode 100644 index 0000000..e7861b1 --- /dev/null +++ b/examples/apds9930/proximity/proximity.go @@ -0,0 +1,39 @@ +package main + +import ( + "machine" + "time" + + "tinygo.org/x/drivers/apds9930" +) + +func main() { + // Sleep to catch any errors through the serial monitor. + time.Sleep(1000 * time.Millisecond) + bus := machine.I2C0 + // use Nano 33 BLE Sense's internal I2C bus + err := bus.Configure(machine.I2CConfig{ + SCL: machine.GP1, + SDA: machine.GP0, + Frequency: 100 * machine.KHz, + }) + if err != nil { + panic(err.Error()) + } + sensor := apds9930.New(bus, 0x39) + + err = sensor.Init() + if err != nil { + panic(err) + } + err = sensor.EnableProximity() + if err != nil { + panic(err) + } + println("proximity enabled!") + for { + time.Sleep(50 * time.Millisecond) + prox := sensor.ReadProximity() + println("proximity:", prox) + } +}