summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDaniel Friesel <derf@finalrewind.org>2021-02-26 19:16:55 +0100
committerDaniel Friesel <derf@finalrewind.org>2021-02-26 19:16:55 +0100
commitbdb1590839e5962741140ce2f4db722219f9d6f6 (patch)
treedb565f530096ad63c82640150718fb144c47d9c9 /src
parent9a3d3bcc93f8cefea74af2a86b5834a57738e2c3 (diff)
Add SCD4x driver and datalog integration
Diffstat (limited to 'src')
-rw-r--r--src/app/datalogger/main.cc18
-rw-r--r--src/driver/scd4x.cc40
2 files changed, 58 insertions, 0 deletions
diff --git a/src/app/datalogger/main.cc b/src/app/datalogger/main.cc
index 8740035..46ff6b0 100644
--- a/src/app/datalogger/main.cc
+++ b/src/app/datalogger/main.cc
@@ -45,6 +45,9 @@
#ifdef DRIVER_TSL2591
#include "driver/tsl2591.h"
#endif
+#ifdef DRIVER_SCD4X
+#include "driver/scd4x.h"
+#endif
void loop(void)
{
@@ -136,6 +139,17 @@ void loop(void)
kout << dec << "TSL2591 CH0: " << tsl2591.ch0 << " / CH1: " << tsl2591.ch1;
kout << hex << " (status: 0x" << tsl2591.getStatus() << ")" << endl;
#endif
+
+#ifdef DRIVER_SCD4X
+ scd4x.read();
+ kout << dec << "CO₂: " << scd4x.co2 << " ppm" << endl;
+ kout << "Temperature: ";
+ kout.printf_float(((175.0 * scd4x.rawTemperature) / 65536) - 45);
+ kout << " °c" << endl;
+ kout << "Humidity: ";
+ kout.printf_float((100.0 * scd4x.rawHumidity) / 65536);
+ kout << " %" << endl;
+#endif
}
int main(void)
@@ -224,6 +238,10 @@ int main(void)
tsl2591.init();
#endif
+#ifdef DRIVER_SCD4X
+ scd4x.start();
+#endif
+
arch.idle_loop();
return 0;
diff --git a/src/driver/scd4x.cc b/src/driver/scd4x.cc
new file mode 100644
index 0000000..c0901e8
--- /dev/null
+++ b/src/driver/scd4x.cc
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2021 Daniel Friesel
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+#include "driver/scd4x.h"
+#include "driver/gpio.h"
+#if defined(MULTIPASS_ARCH_HAS_I2C) && !defined(DRIVER_SOFTI2C)
+#include "driver/i2c.h"
+#else
+#include "driver/soft_i2c.h"
+#endif
+
+void SCD4x::start()
+{
+ txbuf[0] = 0x21;
+ txbuf[1] = 0xb1;
+ i2c.xmit(address, 2, txbuf, 0, rxbuf);
+}
+
+void SCD4x::stop()
+{
+ txbuf[0] = 0x3f;
+ txbuf[1] = 0x86;
+ i2c.xmit(address, 2, txbuf, 0, rxbuf);
+}
+
+void SCD4x::read()
+{
+ txbuf[0] = 0xec;
+ txbuf[1] = 0x05;
+
+ if (i2c.xmit(address, 1, txbuf, 9, rxbuf) == 0) {
+ co2 = (rxbuf[0] << 8) + rxbuf[1];
+ rawTemperature = ((rxbuf[3] << 8) + rxbuf[4]);
+ rawHumidity = (rxbuf[6] << 8) + rxbuf[7];
+ }
+}
+
+SCD4x scd4x;