Actually works, and with mbed os 5 latest
Dependents: CCS811-TEST Mbed-Connect-Cloud-Demo Mbed-Connect-Cloud-Demo HTTP-all-sensors ... more
Fork of CCS811 by
Diff: CCS811.cpp
- Revision:
- 1:4acc5b63a984
- Parent:
- 0:b5dbfc21185d
- Child:
- 2:64a96d555ef0
diff -r b5dbfc21185d -r 4acc5b63a984 CCS811.cpp
--- a/CCS811.cpp Tue Jun 27 05:17:02 2017 +0000
+++ b/CCS811.cpp Wed Sep 13 15:31:53 2017 +0000
@@ -1,6 +1,6 @@
#include "CCS811.h"
-CCS811::CCS811(I2C& i2c) : m_i2c(i2c), pc(p5, p4) {
+CCS811::CCS811(I2C* i2c) : m_i2c(i2c), pc(USBTX, USBRX) {
}
@@ -8,39 +8,116 @@
** Initial CCS811 need write MODE register and should Write APP START register to begin measurement.
**/
void CCS811::init() {
+ wait_ms(50);
+
char send[2];
+ char read[8];
+ char hwv[8];
+ char hwd[8];
+
+ read[0] = CCS811_REG_STATUS; //0x00
+
+ m_i2c->write(CCS811_I2C_ADDR, read, 1);
+ m_i2c->read(CCS811_I2C_ADDR, hwv, 1);
- if (!checkHW()) {
- return;
- }else {
- pc.printf("CCS811 is confirm!\r\n");
- }
+ wait_us(50);
+
+ send[0] = CCS811_REG_APP_START; //0xF4
+
+ wait_us(50);
+
+ m_i2c->write(CCS811_I2C_ADDR, send, 1);
+
+ wait_us(50);
+
+ read[0] = CCS811_REG_STATUS; //0x00
- send[0] = CCS811_REG_MEAS_MODE;
- send[1] = CCS811_MEASUREMENT_MODE1;
+ wait_us(50);
+
+ m_i2c->write(CCS811_I2C_ADDR, read, 1);
+ m_i2c->read(CCS811_I2C_ADDR, hwd, 1);
- m_i2c.write(CCS811_I2C_ADDR, send, 2);
+ wait_us(50);
+
- send[0] = CCS811_REG_APP_START;
- send[1] = 0x00;
+ send[0] = CCS811_REG_MEAS_MODE; //0x01
+ send[1] = CCS811_MEASUREMENT_MODE1; //0x10
+
+ m_i2c->write(CCS811_I2C_ADDR, send, 2);
+ wait_us(50);
+
+ wait_us(50);
+
- m_i2c.write(CCS811_I2C_ADDR, send, 2);
+ read[0] = CCS811_REG_STATUS; //0x00
+
+ wait_us(50);
+
+ m_i2c->write(CCS811_I2C_ADDR, read, 1);
+ m_i2c->read(CCS811_I2C_ADDR, hwd, 1);
+
+ wait_us(50);
}
int CCS811::setMeasureMode(char mode) {
char send[2];
- send[0] = CCS811_MEASUREMENT_MODE1;
+ send[0] = CCS811_REG_MEAS_MODE;
send[1] = mode;
- m_i2c.write(CCS811_I2C_ADDR, send, 2);
+ m_i2c->write(CCS811_I2C_ADDR, send, 2);
+
+// send[0] = CCS811_REG_APP_START;
+// send[1] = 0x00;
+
+// m_i2c->write(CCS811_I2C_ADDR, send, 2);
+
+ return 0;
+}
+
+bool CCS811::readstatus() {
+
+ char read[8];
+ char hwd[8];
+
+ read[0] = CCS811_REG_STATUS; //0x00
+
+ m_i2c->write(CCS811_I2C_ADDR, read, 1);
+ m_i2c->read(CCS811_I2C_ADDR, hwd, 1);
+
+ pc.printf("STATUS 0x%X\r\n", hwd[0]);
- send[0] = CCS811_REG_APP_START;
- send[1] = 0x00;
+ return 0;
+}
+
+bool CCS811::readmeas() {
+
+ char read[8];
+ char hwd[8];
+
+ read[0] = CCS811_REG_MEAS_MODE; //0x01
+
+ m_i2c->write(CCS811_I2C_ADDR, read, 1);
+ m_i2c->read(CCS811_I2C_ADDR, hwd, 1);
+
+ pc.printf("meas 0x%X\r\n", hwd[0]);
- m_i2c.write(CCS811_I2C_ADDR, send, 2);
+ return 0;
+}
+
+bool CCS811::readerror() {
+
+ char read[8];
+ char hwv[8];
+
+ read[0] = CCS811_REG_ERROR_ID; //0xE0
+
+ m_i2c->write(CCS811_I2C_ADDR, read, 1);
+ m_i2c->read(CCS811_I2C_ADDR, hwv, 1);
+
+ pc.printf("error 0x%X \r\n", hwv[0]);
return 0;
}
@@ -49,20 +126,20 @@
** Here is that you can read CCS811 with co2 ppm and tvoc bbm is unsigned value
**/
int CCS811::readData(uint16_t *ECO2, uint16_t *TVOC) {
-
+
char recv[8];
-
-
-
- recv[0] = CCS811_REG_ALG_RESULT_DATA;
- m_i2c.write(CCS811_I2C_ADDR, recv, 1);
- m_i2c.read( CCS811_I2C_ADDR, recv, 8);
+ char send[1];
-// pc.printf("%X %X\r\n", recv[0], recv[1]);
-// pc.printf("%X %X\r\n", recv[2], recv[3]);
-// pc.printf("%X %X\r\n", recv[4], recv[5]);
-// pc.printf("%X %X\r\n", recv[6], recv[7]);
-
+ send[0] = CCS811_REG_ALG_RESULT_DATA;
+ m_i2c->write(CCS811_I2C_ADDR, send, 1, true);
+ m_i2c->read(CCS811_I2C_ADDR, recv, 8, false);
+ wait_ms(1);
+/*
+ pc.printf("%X %X\r\n", recv[0], recv[1]);
+ pc.printf("%X %X\r\n", recv[2], recv[3]);
+ pc.printf("%X %X\r\n", recv[4], recv[5]);
+ pc.printf("%X %X\r\n", recv[6], recv[7]);
+*/
*ECO2 = (uint16_t) (recv[0] <<8) + recv[1];
*TVOC = (uint16_t) (recv[2] <<8) + recv[3];
@@ -80,8 +157,8 @@
read[0] = CCS811_REG_HW_ID;
- m_i2c.write(CCS811_I2C_ADDR, read, 1, false);
- m_i2c.read(CCS811_I2C_ADDR, hid, 1, false);
+ m_i2c->write(CCS811_I2C_ADDR, read, 1, false);
+ m_i2c->read(CCS811_I2C_ADDR, hid, 1, false);
// pc.printf("%X\r\n", hid[0]);
@@ -100,7 +177,7 @@
char rstCMD[5] = {CCS811_REG_SW_RESET, 0x11,0xE5,0x72,0x8A};
- m_i2c.write(CCS811_I2C_ADDR, rstCMD, 5);
+ m_i2c->write(CCS811_I2C_ADDR, rstCMD, 5);
return false;
Andrea Corrado

Air Quality Breakout - CCS811