From e391c1bc244838bb050ade946e709f671cd9cf94 Mon Sep 17 00:00:00 2001 From: Daniel Friesel Date: Fri, 18 Oct 2019 10:38:48 +0200 Subject: Add preliminary version of HDC1080 driver (not working reliably yet) --- src/app/i2cdetect/main.cc | 13 ++++++++++++ src/driver/hdc1080.cc | 51 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 64 insertions(+) create mode 100644 src/driver/hdc1080.cc (limited to 'src') diff --git a/src/app/i2cdetect/main.cc b/src/app/i2cdetect/main.cc index acf5ef1..e74ce5b 100644 --- a/src/app/i2cdetect/main.cc +++ b/src/app/i2cdetect/main.cc @@ -25,6 +25,9 @@ #ifdef DRIVER_MAX44009 #include "driver/max44009.h" #endif +#ifdef DRIVER_HDC1080 +#include "driver/hdc1080.h" +#endif #ifdef DRIVER_MMSIMPLE #include "driver/mmsimple.h" #endif @@ -81,6 +84,10 @@ void loop(void) #ifdef DRIVER_CCS811 kout << "CCS811 status is " << ccs811.check() << endl; #endif +#ifdef DRIVER_HDC1080 + kout << "HDC1080 temperature " << hdc1080.getTemp() << " degC" << endl; + kout << "HDC1080 humidity " << hdc1080.getRH() << " %H" << endl; +#endif #ifdef DRIVER_MAX44009 kout.printf_float(max44009.getLux()); kout << endl; @@ -118,6 +125,12 @@ int main(void) #ifdef DRIVER_CCS811 ccs811.init(); #endif +#ifdef DRIVER_HDC1080 + hdc1080.init(); + if (hdc1080.getManufacturerID() != 0x5449) { + kout << "[!] invalid HDC1080 manufacturer ID: " << hex << hdc1080.getManufacturerID() << endl; + } +#endif for (unsigned char i = 0; i < sizeof(i2c_status)/sizeof(unsigned int); i++) { i2c_status[i] = 0; diff --git a/src/driver/hdc1080.cc b/src/driver/hdc1080.cc new file mode 100644 index 0000000..8da2ba7 --- /dev/null +++ b/src/driver/hdc1080.cc @@ -0,0 +1,51 @@ +#include "driver/hdc1080.h" +#include "arch.h" +#if defined(MULTIPASS_ARCH_HAS_I2C) && !defined(DRIVER_SOFTI2C) +#include "driver/i2c.h" +#else +#include "driver/soft_i2c.h" +#endif + +float HDC1080::getTemp() +{ + txbuf[0] = 0x00; + + i2c.xmit(address, 1, txbuf, 0, rxbuf); + + arch.delay_ms(10); + + i2c.xmit(address, 0, txbuf, 2, rxbuf); + + return (((unsigned int)rxbuf[0] << 8) | rxbuf[1]) * .00251770019531250000 - 40.; +} + +float HDC1080::getRH() +{ + txbuf[0] = 0x01; + + i2c.xmit(address, 1, txbuf, 0, rxbuf); + + arch.delay_ms(10); + + i2c.xmit(address, 0, txbuf, 2, rxbuf); + + return (((unsigned int)rxbuf[0] << 8) | rxbuf[1]) * .00152587890625000000; +} + +unsigned int HDC1080::getManufacturerID() +{ + txbuf[0] = 0xfe; + i2c.xmit(address, 1, txbuf, 2, rxbuf); + return (unsigned int)rxbuf[0] << 8 | rxbuf[1]; +} + +void HDC1080::init() +{ + txbuf[0] = 0x02; + txbuf[1] = 0x08; + txbuf[2] = 0x00; + i2c.xmit(address, 3, txbuf, 0, rxbuf); + arch.delay_ms(15); +} + +HDC1080 hdc1080; -- cgit v1.2.3