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 MtM+

CCS811.cpp

Committer:
andcor02
Date:
2017-10-19
Revision:
2:64a96d555ef0
Parent:
1:4acc5b63a984

File content as of revision 2:64a96d555ef0:

#include "CCS811.h"

CCS811::CCS811(PinName sda, PinName scl) : _i2c(sda, scl) {
    
}

/**
 ** 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
    
    _i2c.write(CCS811_I2C_ADDR, read, 1);
    _i2c.read(CCS811_I2C_ADDR, hwv, 1);
    
    wait_us(50);
    
    send[0] = CCS811_REG_APP_START; //0xF4
    
    wait_us(50);
    
    _i2c.write(CCS811_I2C_ADDR, send, 1);
    
    wait_us(50);

    read[0] = CCS811_REG_STATUS; //0x00
    
    wait_us(50);

    _i2c.write(CCS811_I2C_ADDR, read, 1);
    _i2c.read(CCS811_I2C_ADDR, hwd, 1);
    
    wait_us(50);

    
    send[0] = CCS811_REG_MEAS_MODE; //0x01
    send[1] = CCS811_MEASUREMENT_MODE1; //0x10
   
    _i2c.write(CCS811_I2C_ADDR, send, 2);
    wait_us(50);   
    
    wait_us(50);

    
    read[0] = CCS811_REG_STATUS; //0x00
    
    wait_us(50);

    
    _i2c.write(CCS811_I2C_ADDR, read, 1);
    _i2c.read(CCS811_I2C_ADDR, hwd, 1);
    
    wait_us(50);   
}

int CCS811::setMeasureMode(char mode) {
    
    char send[2];
    
    send[0] = CCS811_REG_MEAS_MODE;
    send[1] = mode;
    
    _i2c.write(CCS811_I2C_ADDR, send, 2);
    
//    send[0] = CCS811_REG_APP_START;
//    send[1] = 0x00;
    
//    _i2c.write(CCS811_I2C_ADDR, send, 2);
    
    return 0;
}

bool CCS811::readstatus() {

    char read[8];
    char hwd[8];
       
    read[0] = CCS811_REG_STATUS; //0x00
       
    _i2c.write(CCS811_I2C_ADDR, read, 1);
    _i2c.read(CCS811_I2C_ADDR, hwd, 1);
       
    printf("STATUS 0x%X\r\n", hwd[0]);
    
    return 0;
}

bool CCS811::readmeas() {

    char read[8];
    char hwd[8];    
    
    read[0] = CCS811_REG_MEAS_MODE; //0x01
   
    _i2c.write(CCS811_I2C_ADDR, read, 1);
    _i2c.read(CCS811_I2C_ADDR, hwd, 1);
       
    printf("meas 0x%X\r\n", hwd[0]);
    
    return 0;
}

bool CCS811::readerror() {

    char read[8];
    char hwv[8];
    
    read[0] = CCS811_REG_ERROR_ID; //0xE0

    _i2c.write(CCS811_I2C_ADDR, read, 1);
    _i2c.read(CCS811_I2C_ADDR, hwv, 1);

    printf("error 0x%X \r\n", hwv[0]);
    
    return 0;
}

/**
 ** 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];
    char send[1];

    send[0] = CCS811_REG_ALG_RESULT_DATA;
    _i2c.write(CCS811_I2C_ADDR, send, 1, true);
    _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];
    
    return 0;
    
}

/**
 ** Here for check is CCS811 hardware from i2c bus
 **/
bool CCS811::checkHW() {

    char read[1];
    char hid[1];
    
    read[0] = CCS811_REG_HW_ID;
    
    _i2c.write(CCS811_I2C_ADDR, read, 1, false);
    _i2c.read(CCS811_I2C_ADDR, hid, 1, false);
    
//    pc.printf("%X\r\n", hid[0]);
    
    if (hid[0] == 0x81) {
        return true;
    } else {
        return false;
    }
    
}

/**
 **  Here is provide you soft reset CCS811 module 
 **/
bool CCS811::softRest() {
     
    char rstCMD[5] = {CCS811_REG_SW_RESET, 0x11,0xE5,0x72,0x8A};

    _i2c.write(CCS811_I2C_ADDR, rstCMD, 5);
    
    return false;
      
}