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+

Committer:
andcor02
Date:
Thu Oct 19 11:24:59 2017 +0000
Revision:
2:64a96d555ef0
Parent:
1:4acc5b63a984
changed constructor, better compatibility

Who changed what in which revision?

UserRevisionLine numberNew contents of line
johnathanlyu 0:b5dbfc21185d 1 #include "CCS811.h"
johnathanlyu 0:b5dbfc21185d 2
andcor02 2:64a96d555ef0 3 CCS811::CCS811(PinName sda, PinName scl) : _i2c(sda, scl) {
johnathanlyu 0:b5dbfc21185d 4
johnathanlyu 0:b5dbfc21185d 5 }
johnathanlyu 0:b5dbfc21185d 6
johnathanlyu 0:b5dbfc21185d 7 /**
johnathanlyu 0:b5dbfc21185d 8 ** Initial CCS811 need write MODE register and should Write APP START register to begin measurement.
johnathanlyu 0:b5dbfc21185d 9 **/
johnathanlyu 0:b5dbfc21185d 10 void CCS811::init() {
andcor02 1:4acc5b63a984 11 wait_ms(50);
andcor02 1:4acc5b63a984 12
johnathanlyu 0:b5dbfc21185d 13 char send[2];
andcor02 1:4acc5b63a984 14 char read[8];
andcor02 1:4acc5b63a984 15 char hwv[8];
andcor02 1:4acc5b63a984 16 char hwd[8];
andcor02 1:4acc5b63a984 17
andcor02 1:4acc5b63a984 18 read[0] = CCS811_REG_STATUS; //0x00
andcor02 1:4acc5b63a984 19
andcor02 2:64a96d555ef0 20 _i2c.write(CCS811_I2C_ADDR, read, 1);
andcor02 2:64a96d555ef0 21 _i2c.read(CCS811_I2C_ADDR, hwv, 1);
johnathanlyu 0:b5dbfc21185d 22
andcor02 1:4acc5b63a984 23 wait_us(50);
andcor02 1:4acc5b63a984 24
andcor02 1:4acc5b63a984 25 send[0] = CCS811_REG_APP_START; //0xF4
andcor02 1:4acc5b63a984 26
andcor02 1:4acc5b63a984 27 wait_us(50);
andcor02 1:4acc5b63a984 28
andcor02 2:64a96d555ef0 29 _i2c.write(CCS811_I2C_ADDR, send, 1);
andcor02 1:4acc5b63a984 30
andcor02 1:4acc5b63a984 31 wait_us(50);
andcor02 1:4acc5b63a984 32
andcor02 1:4acc5b63a984 33 read[0] = CCS811_REG_STATUS; //0x00
johnathanlyu 0:b5dbfc21185d 34
andcor02 1:4acc5b63a984 35 wait_us(50);
andcor02 1:4acc5b63a984 36
andcor02 2:64a96d555ef0 37 _i2c.write(CCS811_I2C_ADDR, read, 1);
andcor02 2:64a96d555ef0 38 _i2c.read(CCS811_I2C_ADDR, hwd, 1);
johnathanlyu 0:b5dbfc21185d 39
andcor02 1:4acc5b63a984 40 wait_us(50);
andcor02 1:4acc5b63a984 41
johnathanlyu 0:b5dbfc21185d 42
andcor02 1:4acc5b63a984 43 send[0] = CCS811_REG_MEAS_MODE; //0x01
andcor02 1:4acc5b63a984 44 send[1] = CCS811_MEASUREMENT_MODE1; //0x10
andcor02 1:4acc5b63a984 45
andcor02 2:64a96d555ef0 46 _i2c.write(CCS811_I2C_ADDR, send, 2);
andcor02 1:4acc5b63a984 47 wait_us(50);
andcor02 1:4acc5b63a984 48
andcor02 1:4acc5b63a984 49 wait_us(50);
andcor02 1:4acc5b63a984 50
johnathanlyu 0:b5dbfc21185d 51
andcor02 1:4acc5b63a984 52 read[0] = CCS811_REG_STATUS; //0x00
andcor02 1:4acc5b63a984 53
andcor02 1:4acc5b63a984 54 wait_us(50);
andcor02 1:4acc5b63a984 55
johnathanlyu 0:b5dbfc21185d 56
andcor02 2:64a96d555ef0 57 _i2c.write(CCS811_I2C_ADDR, read, 1);
andcor02 2:64a96d555ef0 58 _i2c.read(CCS811_I2C_ADDR, hwd, 1);
andcor02 1:4acc5b63a984 59
andcor02 1:4acc5b63a984 60 wait_us(50);
johnathanlyu 0:b5dbfc21185d 61 }
johnathanlyu 0:b5dbfc21185d 62
johnathanlyu 0:b5dbfc21185d 63 int CCS811::setMeasureMode(char mode) {
johnathanlyu 0:b5dbfc21185d 64
johnathanlyu 0:b5dbfc21185d 65 char send[2];
johnathanlyu 0:b5dbfc21185d 66
andcor02 1:4acc5b63a984 67 send[0] = CCS811_REG_MEAS_MODE;
johnathanlyu 0:b5dbfc21185d 68 send[1] = mode;
johnathanlyu 0:b5dbfc21185d 69
andcor02 2:64a96d555ef0 70 _i2c.write(CCS811_I2C_ADDR, send, 2);
andcor02 1:4acc5b63a984 71
andcor02 1:4acc5b63a984 72 // send[0] = CCS811_REG_APP_START;
andcor02 1:4acc5b63a984 73 // send[1] = 0x00;
andcor02 1:4acc5b63a984 74
andcor02 2:64a96d555ef0 75 // _i2c.write(CCS811_I2C_ADDR, send, 2);
andcor02 1:4acc5b63a984 76
andcor02 1:4acc5b63a984 77 return 0;
andcor02 1:4acc5b63a984 78 }
andcor02 1:4acc5b63a984 79
andcor02 1:4acc5b63a984 80 bool CCS811::readstatus() {
andcor02 1:4acc5b63a984 81
andcor02 1:4acc5b63a984 82 char read[8];
andcor02 1:4acc5b63a984 83 char hwd[8];
andcor02 1:4acc5b63a984 84
andcor02 1:4acc5b63a984 85 read[0] = CCS811_REG_STATUS; //0x00
andcor02 1:4acc5b63a984 86
andcor02 2:64a96d555ef0 87 _i2c.write(CCS811_I2C_ADDR, read, 1);
andcor02 2:64a96d555ef0 88 _i2c.read(CCS811_I2C_ADDR, hwd, 1);
andcor02 1:4acc5b63a984 89
andcor02 2:64a96d555ef0 90 printf("STATUS 0x%X\r\n", hwd[0]);
johnathanlyu 0:b5dbfc21185d 91
andcor02 1:4acc5b63a984 92 return 0;
andcor02 1:4acc5b63a984 93 }
andcor02 1:4acc5b63a984 94
andcor02 1:4acc5b63a984 95 bool CCS811::readmeas() {
andcor02 1:4acc5b63a984 96
andcor02 1:4acc5b63a984 97 char read[8];
andcor02 1:4acc5b63a984 98 char hwd[8];
andcor02 1:4acc5b63a984 99
andcor02 1:4acc5b63a984 100 read[0] = CCS811_REG_MEAS_MODE; //0x01
andcor02 1:4acc5b63a984 101
andcor02 2:64a96d555ef0 102 _i2c.write(CCS811_I2C_ADDR, read, 1);
andcor02 2:64a96d555ef0 103 _i2c.read(CCS811_I2C_ADDR, hwd, 1);
andcor02 1:4acc5b63a984 104
andcor02 2:64a96d555ef0 105 printf("meas 0x%X\r\n", hwd[0]);
johnathanlyu 0:b5dbfc21185d 106
andcor02 1:4acc5b63a984 107 return 0;
andcor02 1:4acc5b63a984 108 }
andcor02 1:4acc5b63a984 109
andcor02 1:4acc5b63a984 110 bool CCS811::readerror() {
andcor02 1:4acc5b63a984 111
andcor02 1:4acc5b63a984 112 char read[8];
andcor02 1:4acc5b63a984 113 char hwv[8];
andcor02 1:4acc5b63a984 114
andcor02 1:4acc5b63a984 115 read[0] = CCS811_REG_ERROR_ID; //0xE0
andcor02 1:4acc5b63a984 116
andcor02 2:64a96d555ef0 117 _i2c.write(CCS811_I2C_ADDR, read, 1);
andcor02 2:64a96d555ef0 118 _i2c.read(CCS811_I2C_ADDR, hwv, 1);
andcor02 1:4acc5b63a984 119
andcor02 2:64a96d555ef0 120 printf("error 0x%X \r\n", hwv[0]);
johnathanlyu 0:b5dbfc21185d 121
johnathanlyu 0:b5dbfc21185d 122 return 0;
johnathanlyu 0:b5dbfc21185d 123 }
johnathanlyu 0:b5dbfc21185d 124
johnathanlyu 0:b5dbfc21185d 125 /**
johnathanlyu 0:b5dbfc21185d 126 ** Here is that you can read CCS811 with co2 ppm and tvoc bbm is unsigned value
johnathanlyu 0:b5dbfc21185d 127 **/
johnathanlyu 0:b5dbfc21185d 128 int CCS811::readData(uint16_t *ECO2, uint16_t *TVOC) {
andcor02 1:4acc5b63a984 129
johnathanlyu 0:b5dbfc21185d 130 char recv[8];
andcor02 1:4acc5b63a984 131 char send[1];
johnathanlyu 0:b5dbfc21185d 132
andcor02 1:4acc5b63a984 133 send[0] = CCS811_REG_ALG_RESULT_DATA;
andcor02 2:64a96d555ef0 134 _i2c.write(CCS811_I2C_ADDR, send, 1, true);
andcor02 2:64a96d555ef0 135 _i2c.read(CCS811_I2C_ADDR, recv, 8, false);
andcor02 1:4acc5b63a984 136 wait_ms(1);
andcor02 1:4acc5b63a984 137 /*
andcor02 1:4acc5b63a984 138 pc.printf("%X %X\r\n", recv[0], recv[1]);
andcor02 1:4acc5b63a984 139 pc.printf("%X %X\r\n", recv[2], recv[3]);
andcor02 1:4acc5b63a984 140 pc.printf("%X %X\r\n", recv[4], recv[5]);
andcor02 1:4acc5b63a984 141 pc.printf("%X %X\r\n", recv[6], recv[7]);
andcor02 1:4acc5b63a984 142 */
johnathanlyu 0:b5dbfc21185d 143 *ECO2 = (uint16_t) (recv[0] <<8) + recv[1];
johnathanlyu 0:b5dbfc21185d 144 *TVOC = (uint16_t) (recv[2] <<8) + recv[3];
johnathanlyu 0:b5dbfc21185d 145
johnathanlyu 0:b5dbfc21185d 146 return 0;
johnathanlyu 0:b5dbfc21185d 147
johnathanlyu 0:b5dbfc21185d 148 }
johnathanlyu 0:b5dbfc21185d 149
johnathanlyu 0:b5dbfc21185d 150 /**
johnathanlyu 0:b5dbfc21185d 151 ** Here for check is CCS811 hardware from i2c bus
johnathanlyu 0:b5dbfc21185d 152 **/
johnathanlyu 0:b5dbfc21185d 153 bool CCS811::checkHW() {
johnathanlyu 0:b5dbfc21185d 154
johnathanlyu 0:b5dbfc21185d 155 char read[1];
johnathanlyu 0:b5dbfc21185d 156 char hid[1];
johnathanlyu 0:b5dbfc21185d 157
johnathanlyu 0:b5dbfc21185d 158 read[0] = CCS811_REG_HW_ID;
johnathanlyu 0:b5dbfc21185d 159
andcor02 2:64a96d555ef0 160 _i2c.write(CCS811_I2C_ADDR, read, 1, false);
andcor02 2:64a96d555ef0 161 _i2c.read(CCS811_I2C_ADDR, hid, 1, false);
johnathanlyu 0:b5dbfc21185d 162
johnathanlyu 0:b5dbfc21185d 163 // pc.printf("%X\r\n", hid[0]);
johnathanlyu 0:b5dbfc21185d 164
johnathanlyu 0:b5dbfc21185d 165 if (hid[0] == 0x81) {
johnathanlyu 0:b5dbfc21185d 166 return true;
johnathanlyu 0:b5dbfc21185d 167 } else {
johnathanlyu 0:b5dbfc21185d 168 return false;
johnathanlyu 0:b5dbfc21185d 169 }
johnathanlyu 0:b5dbfc21185d 170
johnathanlyu 0:b5dbfc21185d 171 }
johnathanlyu 0:b5dbfc21185d 172
johnathanlyu 0:b5dbfc21185d 173 /**
johnathanlyu 0:b5dbfc21185d 174 ** Here is provide you soft reset CCS811 module
johnathanlyu 0:b5dbfc21185d 175 **/
johnathanlyu 0:b5dbfc21185d 176 bool CCS811::softRest() {
johnathanlyu 0:b5dbfc21185d 177
johnathanlyu 0:b5dbfc21185d 178 char rstCMD[5] = {CCS811_REG_SW_RESET, 0x11,0xE5,0x72,0x8A};
johnathanlyu 0:b5dbfc21185d 179
andcor02 2:64a96d555ef0 180 _i2c.write(CCS811_I2C_ADDR, rstCMD, 5);
johnathanlyu 0:b5dbfc21185d 181
johnathanlyu 0:b5dbfc21185d 182 return false;
johnathanlyu 0:b5dbfc21185d 183
johnathanlyu 0:b5dbfc21185d 184 }
johnathanlyu 0:b5dbfc21185d 185