Andrea Corrado / CCS811

Dependents:   CCS811-TEST Mbed-Connect-Cloud-Demo Mbed-Connect-Cloud-Demo HTTP-all-sensors ... more

Fork of CCS811 by MtM+

Files at this revision

API Documentation at this revision

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:
 };