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
CCS811.cpp@2:64a96d555ef0, 2017-10-19 (annotated)
- 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?
User | Revision | Line number | New 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 |