Yohei Shimmyo / CCS811
Committer:
rollman
Date:
Thu Mar 05 08:27:24 2020 +0000
Revision:
2:ec392b3a49f2
Parent:
1:57eb62ded32d
Child:
3:423f2830684e
CCS811 holds a serial to PC and instance is passed to the constructor.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
johnathanlyu 0:b5dbfc21185d 1 #include "CCS811.h"
johnathanlyu 0:b5dbfc21185d 2
johnathanlyu 1:57eb62ded32d 3 CCS811::CCS811(I2C& i2c, Serial& pc) : m_i2c(i2c), m_pc(pc) {
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 **/
rollman 2:ec392b3a49f2 10 int CCS811::init() {
johnathanlyu 0:b5dbfc21185d 11 char send[2];
johnathanlyu 0:b5dbfc21185d 12
johnathanlyu 0:b5dbfc21185d 13 if (!checkHW()) {
rollman 2:ec392b3a49f2 14 m_pc.printf("ERROR: CCS811 does not have a correct hardware id.\r\n");
rollman 2:ec392b3a49f2 15 return CCS811_ERR_HWID;
johnathanlyu 0:b5dbfc21185d 16 }else {
johnathanlyu 1:57eb62ded32d 17 m_pc.printf("CCS811 is confirm!\r\n");
johnathanlyu 0:b5dbfc21185d 18 }
johnathanlyu 0:b5dbfc21185d 19
rollman 2:ec392b3a49f2 20 // check valid app
rollman 2:ec392b3a49f2 21 send[0] = CCS811_REG_STATUS;
rollman 2:ec392b3a49f2 22 m_i2c.write(CCS811_I2C_ADDR, send, 1);
rollman 2:ec392b3a49f2 23 m_i2c.read(CCS811_I2C_ADDR, send, 1);
rollman 2:ec392b3a49f2 24 if (!(send[0] & 0x10)){
rollman 2:ec392b3a49f2 25 return CCS811_ERR_INVALID_APP;
rollman 2:ec392b3a49f2 26 }
rollman 2:ec392b3a49f2 27
rollman 2:ec392b3a49f2 28 // send app start
johnathanlyu 1:57eb62ded32d 29 send[0] = CCS811_REG_APP_START;
johnathanlyu 1:57eb62ded32d 30 send[1] = 0x00;
rollman 2:ec392b3a49f2 31 m_i2c.write(CCS811_I2C_ADDR, send, 1);
johnathanlyu 1:57eb62ded32d 32
rollman 2:ec392b3a49f2 33 m_pc.printf("done setting app start\r\n");
rollman 2:ec392b3a49f2 34 {
rollman 2:ec392b3a49f2 35 char status = readStatus();
rollman 2:ec392b3a49f2 36 if (status & 0x01){
rollman 2:ec392b3a49f2 37 char errid = readErr();
rollman 2:ec392b3a49f2 38 printerr_reg1(m_pc, errid);
rollman 2:ec392b3a49f2 39 }
rollman 2:ec392b3a49f2 40 }
rollman 2:ec392b3a49f2 41
rollman 2:ec392b3a49f2 42 // check fw mode
rollman 2:ec392b3a49f2 43 send[0] = CCS811_REG_STATUS;
rollman 2:ec392b3a49f2 44 m_i2c.write(CCS811_I2C_ADDR, send, 1);
rollman 2:ec392b3a49f2 45 m_i2c.read(CCS811_I2C_ADDR, send, 1);
rollman 2:ec392b3a49f2 46 if (!(send[0] & 0x90)){
rollman 2:ec392b3a49f2 47 return CCS811_ERR_INVALID_APPMODE;
rollman 2:ec392b3a49f2 48 }
rollman 2:ec392b3a49f2 49
rollman 2:ec392b3a49f2 50
johnathanlyu 1:57eb62ded32d 51
johnathanlyu 0:b5dbfc21185d 52 send[0] = CCS811_REG_MEAS_MODE;
johnathanlyu 0:b5dbfc21185d 53 send[1] = CCS811_MEASUREMENT_MODE1;
johnathanlyu 0:b5dbfc21185d 54
johnathanlyu 0:b5dbfc21185d 55 m_i2c.write(CCS811_I2C_ADDR, send, 2);
rollman 2:ec392b3a49f2 56 m_pc.printf("setting meas mode\r\n");
rollman 2:ec392b3a49f2 57 {
rollman 2:ec392b3a49f2 58 char status = readStatus();
rollman 2:ec392b3a49f2 59 if (status & 0x01){
rollman 2:ec392b3a49f2 60 char errid = readErr();
rollman 2:ec392b3a49f2 61 printerr_reg1(m_pc, errid);
rollman 2:ec392b3a49f2 62 }
rollman 2:ec392b3a49f2 63 }
rollman 2:ec392b3a49f2 64 m_pc.printf("done set meas mode\r\n");
rollman 2:ec392b3a49f2 65 return 0;
johnathanlyu 0:b5dbfc21185d 66 }
johnathanlyu 0:b5dbfc21185d 67
johnathanlyu 0:b5dbfc21185d 68 int CCS811::setMeasureMode(char mode) {
johnathanlyu 0:b5dbfc21185d 69
johnathanlyu 0:b5dbfc21185d 70 char send[2];
johnathanlyu 0:b5dbfc21185d 71
johnathanlyu 0:b5dbfc21185d 72 send[0] = CCS811_MEASUREMENT_MODE1;
johnathanlyu 0:b5dbfc21185d 73 send[1] = mode;
johnathanlyu 0:b5dbfc21185d 74
johnathanlyu 0:b5dbfc21185d 75 m_i2c.write(CCS811_I2C_ADDR, send, 2);
johnathanlyu 0:b5dbfc21185d 76
johnathanlyu 0:b5dbfc21185d 77 send[0] = CCS811_REG_APP_START;
johnathanlyu 0:b5dbfc21185d 78 send[1] = 0x00;
johnathanlyu 0:b5dbfc21185d 79
johnathanlyu 0:b5dbfc21185d 80 m_i2c.write(CCS811_I2C_ADDR, send, 2);
johnathanlyu 0:b5dbfc21185d 81
johnathanlyu 0:b5dbfc21185d 82 return 0;
johnathanlyu 0:b5dbfc21185d 83 }
johnathanlyu 0:b5dbfc21185d 84
johnathanlyu 0:b5dbfc21185d 85 /**
johnathanlyu 0:b5dbfc21185d 86 ** Here is that you can read CCS811 with co2 ppm and tvoc bbm is unsigned value
johnathanlyu 0:b5dbfc21185d 87 **/
johnathanlyu 0:b5dbfc21185d 88 int CCS811::readData(uint16_t *ECO2, uint16_t *TVOC) {
johnathanlyu 0:b5dbfc21185d 89
johnathanlyu 0:b5dbfc21185d 90 char recv[8];
johnathanlyu 0:b5dbfc21185d 91
johnathanlyu 0:b5dbfc21185d 92
johnathanlyu 0:b5dbfc21185d 93
johnathanlyu 0:b5dbfc21185d 94 recv[0] = CCS811_REG_ALG_RESULT_DATA;
johnathanlyu 0:b5dbfc21185d 95 m_i2c.write(CCS811_I2C_ADDR, recv, 1);
johnathanlyu 0:b5dbfc21185d 96 m_i2c.read( CCS811_I2C_ADDR, recv, 8);
johnathanlyu 0:b5dbfc21185d 97
johnathanlyu 1:57eb62ded32d 98 // m_pc.printf("%X %X\r\n", recv[0], recv[1]);
johnathanlyu 1:57eb62ded32d 99 // m_pc.printf("%X %X\r\n", recv[2], recv[3]);
johnathanlyu 1:57eb62ded32d 100 // m_pc.printf("%X %X\r\n", recv[4], recv[5]);
johnathanlyu 1:57eb62ded32d 101 // m_pc.printf("%X %X\r\n", recv[6], recv[7]);
johnathanlyu 0:b5dbfc21185d 102
johnathanlyu 0:b5dbfc21185d 103 *ECO2 = (uint16_t) (recv[0] <<8) + recv[1];
johnathanlyu 0:b5dbfc21185d 104 *TVOC = (uint16_t) (recv[2] <<8) + recv[3];
johnathanlyu 0:b5dbfc21185d 105
rollman 2:ec392b3a49f2 106 char err_id = recv[5];
rollman 2:ec392b3a49f2 107 if(err_id != 0){
rollman 2:ec392b3a49f2 108 printerr_reg1(m_pc, err_id);
rollman 2:ec392b3a49f2 109 }
rollman 2:ec392b3a49f2 110
johnathanlyu 0:b5dbfc21185d 111 return 0;
johnathanlyu 0:b5dbfc21185d 112
johnathanlyu 0:b5dbfc21185d 113 }
johnathanlyu 0:b5dbfc21185d 114
johnathanlyu 0:b5dbfc21185d 115 /**
johnathanlyu 0:b5dbfc21185d 116 ** Here for check is CCS811 hardware from i2c bus
johnathanlyu 0:b5dbfc21185d 117 **/
johnathanlyu 0:b5dbfc21185d 118 bool CCS811::checkHW() {
johnathanlyu 0:b5dbfc21185d 119
johnathanlyu 0:b5dbfc21185d 120 char read[1];
johnathanlyu 0:b5dbfc21185d 121 char hid[1];
johnathanlyu 0:b5dbfc21185d 122
johnathanlyu 0:b5dbfc21185d 123 read[0] = CCS811_REG_HW_ID;
johnathanlyu 0:b5dbfc21185d 124
johnathanlyu 0:b5dbfc21185d 125 m_i2c.write(CCS811_I2C_ADDR, read, 1, false);
johnathanlyu 0:b5dbfc21185d 126 m_i2c.read(CCS811_I2C_ADDR, hid, 1, false);
johnathanlyu 0:b5dbfc21185d 127
johnathanlyu 0:b5dbfc21185d 128 if (hid[0] == 0x81) {
johnathanlyu 0:b5dbfc21185d 129 return true;
johnathanlyu 0:b5dbfc21185d 130 } else {
johnathanlyu 0:b5dbfc21185d 131 return false;
johnathanlyu 0:b5dbfc21185d 132 }
johnathanlyu 0:b5dbfc21185d 133
johnathanlyu 0:b5dbfc21185d 134 }
johnathanlyu 0:b5dbfc21185d 135
johnathanlyu 0:b5dbfc21185d 136 /**
johnathanlyu 0:b5dbfc21185d 137 ** Here is provide you soft reset CCS811 module
johnathanlyu 0:b5dbfc21185d 138 **/
johnathanlyu 0:b5dbfc21185d 139 bool CCS811::softRest() {
johnathanlyu 0:b5dbfc21185d 140
johnathanlyu 0:b5dbfc21185d 141 char rstCMD[5] = {CCS811_REG_SW_RESET, 0x11,0xE5,0x72,0x8A};
johnathanlyu 0:b5dbfc21185d 142
johnathanlyu 0:b5dbfc21185d 143 m_i2c.write(CCS811_I2C_ADDR, rstCMD, 5);
johnathanlyu 0:b5dbfc21185d 144
johnathanlyu 0:b5dbfc21185d 145 return false;
johnathanlyu 0:b5dbfc21185d 146
johnathanlyu 0:b5dbfc21185d 147 }
johnathanlyu 0:b5dbfc21185d 148
rollman 2:ec392b3a49f2 149 int CCS811::readErr(){
rollman 2:ec392b3a49f2 150 char i2c_buf[2];
rollman 2:ec392b3a49f2 151
rollman 2:ec392b3a49f2 152 i2c_buf[0] = CCS811_REG_ERROR_ID;
rollman 2:ec392b3a49f2 153 m_i2c.write(CCS811_I2C_ADDR, i2c_buf, 1);
rollman 2:ec392b3a49f2 154 m_i2c.read(CCS811_I2C_ADDR, i2c_buf, 1);
rollman 2:ec392b3a49f2 155 return i2c_buf[0];
rollman 2:ec392b3a49f2 156 }
rollman 2:ec392b3a49f2 157
rollman 2:ec392b3a49f2 158 int CCS811::readStatus(){
rollman 2:ec392b3a49f2 159 char i2c_buf[2];
rollman 2:ec392b3a49f2 160
rollman 2:ec392b3a49f2 161 i2c_buf[0] = CCS811_REG_STATUS;
rollman 2:ec392b3a49f2 162 m_i2c.write(CCS811_I2C_ADDR, i2c_buf, 1);
rollman 2:ec392b3a49f2 163 m_i2c.read(CCS811_I2C_ADDR, i2c_buf, 1);
rollman 2:ec392b3a49f2 164 return i2c_buf[0];
rollman 2:ec392b3a49f2 165 }
rollman 2:ec392b3a49f2 166
rollman 2:ec392b3a49f2 167 void printerr(Serial& m_pc, int errid){
rollman 2:ec392b3a49f2 168 if (errid == CCS811_ERR_HWID){
rollman 2:ec392b3a49f2 169 m_pc.printf("CCS811_ERR_HWID\r\n");
rollman 2:ec392b3a49f2 170 }else if(errid == CCS811_ERR_INVALID_APP){
rollman 2:ec392b3a49f2 171 m_pc.printf("CCS811_ERR_INVALID_APP\r\n");
rollman 2:ec392b3a49f2 172 }else if(errid == CCS811_ERR_INVALID_APPMODE){
rollman 2:ec392b3a49f2 173 m_pc.printf("CCS811_ERR_INVALID_APPMODE\r\n");
rollman 2:ec392b3a49f2 174 }else if(errid == 0){
rollman 2:ec392b3a49f2 175 m_pc.printf("printerr called but no error\r\n");
rollman 2:ec392b3a49f2 176 return;
rollman 2:ec392b3a49f2 177 }else{
rollman 2:ec392b3a49f2 178 m_pc.printf("Unknown error: %d\r\n", errid);
rollman 2:ec392b3a49f2 179 }
rollman 2:ec392b3a49f2 180 exit(errid);
rollman 2:ec392b3a49f2 181 }
rollman 2:ec392b3a49f2 182
rollman 2:ec392b3a49f2 183 void printerr_reg1(Serial& m_pc, int errid){
rollman 2:ec392b3a49f2 184 m_pc.printf("err reg: %X\r\n", errid);
rollman 2:ec392b3a49f2 185 exit(errid);
rollman 2:ec392b3a49f2 186 }