Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: CCS811-TEST Mbed-Connect-Cloud-Demo Mbed-Connect-Cloud-Demo HTTP-all-sensors ... more
Fork of CCS811 by
Revision 1:4acc5b63a984, committed 2017-09-13
- Comitter:
- andcor02
- Date:
- Wed Sep 13 15:31:53 2017 +0000
- Parent:
- 0:b5dbfc21185d
- Child:
- 2:64a96d555ef0
- Commit message:
- Actually works, and with mbed os 5 latest
Changed in this revision
CCS811.cpp | Show annotated file Show diff for this revision Revisions of this file |
CCS811.h | Show annotated file Show diff for this revision Revisions of this file |
--- 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;
--- a/CCS811.h Tue Jun 27 05:17:02 2017 +0000 +++ b/CCS811.h Wed Sep 13 15:31:53 2017 +0000 @@ -2,7 +2,7 @@ #define CCS811_H //CCS811 register define -#define CCS811_I2C_ADDR 0xB4 +#define CCS811_I2C_ADDR 0xB6 //This is already left shifted 0x5B, if using other address, should be 0xB4 which is 0x5A left shifted. #define CCS811_REG_STATUS 0x00 //Status. #define CCS811_REG_MEAS_MODE 0x01 //Mesurement mode and conditions register. #define CCS811_REG_ALG_RESULT_DATA 0x02 //Algorithm result. 2 bytes co2 ppm next 2 bytes ppb VOC level. @@ -34,14 +34,17 @@ class CCS811 { public: - CCS811(I2C& i2c); + CCS811(I2C* i2c); void init(); int setMeasureMode(char mode); int readData(uint16_t *ECO2, uint16_t *TVOC); bool checkHW(); bool softRest(); + bool readstatus(); + bool readmeas(); + bool readerror(); protected: - I2C m_i2c; + I2C* m_i2c; Serial pc; private: };