summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/app/datalogger/main.cc35
-rw-r--r--src/driver/Kconfig5
-rw-r--r--src/driver/max44006.cc81
3 files changed, 119 insertions, 2 deletions
diff --git a/src/app/datalogger/main.cc b/src/app/datalogger/main.cc
index c6252b2..6cdba9e 100644
--- a/src/app/datalogger/main.cc
+++ b/src/app/datalogger/main.cc
@@ -36,6 +36,9 @@
#ifdef CONFIG_driver_ds2482
#include "driver/ds2482.h"
#endif
+#ifdef CONFIG_driver_max44006
+#include "driver/max44006.h"
+#endif
#ifdef CONFIG_driver_max44009
#include "driver/max44009.h"
#endif
@@ -149,8 +152,31 @@ void loop(void)
#endif
#ifdef CONFIG_driver_max44009
+ kout << "MAX44006 Temperature: " << max44006.getTemperature() << " counts" << endl;
+ float r, g, b, c, ir;
+ if (max44006.getLight(&r, &g, &b, &c, &ir)) {
+ kout << "MAX44006 Red: ";
+ kout.printf_float(r);
+ kout << " µW/cm²" << endl;
+ kout << "MAX44006 Green: ";
+ kout.printf_float(g);
+ kout << " µW/cm²" << endl;
+ kout << "MAX44006 Blue: ";
+ kout.printf_float(b);
+ kout << " µW/cm²" << endl;
+ kout << "MAX44006 Clear: ";
+ kout.printf_float(c);
+ kout << " µW/cm²" << endl;
+ kout << "MAX44006 IR: ";
+ kout.printf_float(ir);
+ kout << " µW/cm²" << endl;
+ }
+#endif
+
+#ifdef CONFIG_driver_max44009
+ kout << "MAX44009 Brightness: ";
kout.printf_float(max44009.getLux());
- kout << endl;
+ kout << " lx" << endl;
#endif
#ifdef CONFIG_driver_tsl2591
@@ -253,6 +279,13 @@ int main(void)
}
#endif
+#ifdef CONFIG_driver_max44006
+ unsigned char ret;
+ if ((ret = max44006.init()) != 0) {
+ kout << "MAX44006 Initialization failed: " << ret << endl;
+ }
+#endif
+
#ifdef CONFIG_driver_mpu9250
mpu9250.init();
mpu9250.nineAxis();
diff --git a/src/driver/Kconfig b/src/driver/Kconfig
index 13e0dc5..4b3693c 100644
--- a/src/driver/Kconfig
+++ b/src/driver/Kconfig
@@ -56,7 +56,10 @@ depends on meta_driver_i2c
config driver_lm75
bool "LM75 Temperature Sensor"
depends on meta_driver_i2c
-# depends on I2C
+
+config driver_max44006
+bool "MAX44006 RGB + IR Sensor"
+depends on meta_driver_i2c
config driver_max44009
bool "MAX44009 Ambient Light Sensor"
diff --git a/src/driver/max44006.cc b/src/driver/max44006.cc
new file mode 100644
index 0000000..e9b9467
--- /dev/null
+++ b/src/driver/max44006.cc
@@ -0,0 +1,81 @@
+/*
+ * Copyright 2020 Daniel Friesel
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ *
+ * Driver for MAX44006 RGB, IR, and Temperature Sensor.
+ * Does not support interrupts.
+ */
+#include "driver/max44006.h"
+#if defined(CONFIG_meta_driver_hardware_i2c)
+#include "driver/i2c.h"
+#elif defined(CONFIG_driver_softi2c)
+#include "driver/soft_i2c.h"
+#endif
+
+#include "arch.h"
+
+uint8_t MAX44006::init()
+{
+ txbuf[0] = interruptStatusReg;
+ if (i2c.xmit(address, 1, txbuf, 1, rxbuf) != 0) {
+ return 1;
+ }
+
+ if (rxbuf[0] & ~PWRON) {
+ // reset sensor
+ txbuf[1] = 0x10;
+ if (i2c.xmit(address, 2, txbuf, 0, rxbuf) != 0) {
+ return 1;
+ }
+ arch.delay_ms(200);
+ if (i2c.xmit(address, 1, txbuf, 1, rxbuf) != 0) {
+ return 1;
+ }
+ if (rxbuf[0] & ~PWRON) {
+ return 2;
+ }
+ }
+
+ txbuf[0] = ambientConfigReg;
+ txbuf[1] = TEMPEN; // TEMPEN = 1
+ if (i2c.xmit(address, 2, txbuf, 0, rxbuf) != 0) {
+ return 1;
+ }
+
+ txbuf[0] = mainConfigReg;
+ txbuf[1] = MODE_10; // MODE = 10 -> Clear + RGB + IR measurement
+ if (i2c.xmit(address, 2, txbuf, 0, rxbuf) != 0) {
+ return 1;
+ }
+
+ return 0;
+}
+
+uint16_t MAX44006::getTemperature()
+{
+ txbuf[0] = 0x12;
+ if (i2c.xmit(address, 1, txbuf, 2, rxbuf) != 0) {
+ return 0;
+ }
+
+ return (((uint16_t)rxbuf[0] << 8) + rxbuf[1]);
+}
+
+bool MAX44006::getLight(float *red, float *green, float *blue, float *clear, float *ir)
+{
+ txbuf[0] = 0x04;
+ if (i2c.xmit(address, 1, txbuf, 10, rxbuf) != 0) {
+ return false;
+ }
+
+ *clear = (float)(((uint16_t)rxbuf[0] << 8) + rxbuf[1]) * 0.002;
+ *red = (float)(((uint16_t)rxbuf[2] << 8) + rxbuf[3]) * 0.002;
+ *green = (float)(((uint16_t)rxbuf[4] << 8) + rxbuf[5]) * 0.002;
+ *blue = (float)(((uint16_t)rxbuf[6] << 8) + rxbuf[7]) * 0.004;
+ *ir = (float)(((uint16_t)rxbuf[8] << 8) + rxbuf[9]) * 0.002;
+
+ return true;
+}
+
+MAX44006 max44006(0x45);