Skip to content
Snippets Groups Projects

Update sensor config from api; CO2 Sensor; Refactor & Tidy-Up

Merged Callum Inglis requested to merge update-sensor-config-from-api into DEV
1 file
+ 8
8
Compare changes
  • Side-by-side
  • Inline
#include "CCS811.h"
int CCS811::begin(void)
{
uint8_t id=0;
Wire.begin();
softReset();
delay(100);
if(readReg(CCS811_REG_HW_ID,&id,1) != 1){DBG("");
DBG("bus data access error");DBG("");
return ERR_DATA_BUS;DBG("");
}
DBG("real sensor id=");DBG(id);
if(id != CCS811_HW_ID){DBG("");
delay(1);
return ERR_IC_VERSION;
}
writeReg(CCS811_BOOTLOADER_APP_START, NULL, 0);
setMeasurementMode(0,0,eMode4);
setInTempHum(25, 50);
return ERR_OK;
}
void CCS811::softReset(){
uint8_t value[4] = {0x11, 0xE5, 0x72, 0x8A};
writeReg(CCS811_REG_SW_RESET, value, 4);
}
bool CCS811::checkDataReady()
{
int8_t status[1] = {0};
readReg(CCS811_REG_STATUS, status, 1);
DBG(status[0],HEX);
if(!((status[0] >> 3) & 0x01))
return false;
else
return true;
}
uint16_t CCS811::readBaseLine(){
uint8_t buffer[2];
readReg(CCS811_REG_BASELINE, buffer, 2);
return buffer[0]<<8|buffer[1];
}
void CCS811::writeBaseLine(uint16_t baseLine){
uint8_t buffer[2];
buffer[0] = baseLine>>8;
buffer[1] = baseLine;
writeReg(CCS811_REG_BASELINE, buffer, 2);
}
void CCS811::setMeasurementMode(uint8_t thresh, uint8_t interrupt, eDRIVE_MODE_t mode){
uint8_t measurement[1] = {0};
measurement[0] = (thresh << 2) | (interrupt << 3) | (mode << 4);
writeReg(CCS811_REG_MEAS_MODE, measurement, 1);
}
void CCS811::setMeasCycle(eCycle_t cycle){
uint8_t measurement[1] = {0};
measurement[0] = cycle << 4;
writeReg(CCS811_REG_MEAS_MODE, measurement, 1);
}
uint8_t CCS811::getMeasurementMode(){
uint8_t meas[1] = {0};
readReg(CCS811_REG_MEAS_MODE, meas, 1);
return meas[0];
}
void CCS811::setThresholds(uint16_t lowToMed, uint16_t medToHigh)
{
uint8_t buffer[] = {(uint8_t)((lowToMed >> 8) & 0xF),
(uint8_t)(lowToMed & 0xF),
(uint8_t)((medToHigh >> 8) & 0xF),
(uint8_t)(medToHigh & 0xF)};
writeReg(CCS811_REG_THRESHOLDS, buffer, 5);
uint8_t buf[1];
readReg(CCS811_REG_THRESHOLDS, buf, 1);
Serial.println(buf[0],HEX);
}
uint16_t CCS811::getCO2PPM(){
uint8_t buffer[8];
readReg(CCS811_REG_ALG_RESULT_DATA, buffer, 8);
eCO2 = (((uint16_t)buffer[0] << 8) | (uint16_t)buffer[1]);
return eCO2;
}
uint16_t CCS811::getTVOCPPB(){
uint8_t buffer[8];
readReg(CCS811_REG_ALG_RESULT_DATA, buffer, 8);
eTVOC = (((uint16_t)buffer[2] << 8) | (uint16_t)buffer[3]);
return eTVOC;
}
void CCS811::setInTempHum(float temperature, float humidity) // compensate for temperature and relative humidity
{
int _temp, _rh;
if(temperature>0)
_temp = (int)temperature + 0.5; // this will round off the floating point to the nearest integer value
else if(temperature<0) // account for negative temperatures
_temp = (int)temperature - 0.5;
_temp = _temp + 25; // temperature high byte is stored as T+25°C in the sensor's memory so the value of byte is positive
_rh = (int)humidity + 0.5; // this will round off the floating point to the nearest integer value
uint8_t envData[4];
envData[0] = _rh << 1; // shift the binary number to left by 1. This is stored as a 7-bit value
envData[1] = 0; // most significant fractional bit. Using 0 here - gives us accuracy of +/-1%. Current firmware (2016) only supports fractional increments of 0.5
envData[2] = _temp << 1;
envData[3] = 0;
writeReg(CCS811_REG_ENV_DATA, &envData, 4);
}
void CCS811::writeReg(uint8_t reg, const void* pBuf, size_t size)
{
if(pBuf == NULL){
DBG("pBuf ERROR!! : null pointer");
}
uint8_t * _pBuf = (uint8_t *)pBuf;
_pWire->beginTransmission(_deviceAddr);
_pWire->write(&reg, 1);
for(uint16_t i = 0; i < size; i++){
_pWire->write(_pBuf[i]);
}
_pWire->endTransmission();
}
uint8_t CCS811::readReg(uint8_t reg, const void* pBuf, size_t size)
{
if(pBuf == NULL){
DBG("pBuf ERROR!! : null pointer");
}
uint8_t * _pBuf = (uint8_t *)pBuf;
_pWire->beginTransmission(_deviceAddr);
_pWire->write(&reg, 1);
if( _pWire->endTransmission() != 0){
return 0;
}
_pWire->requestFrom(_deviceAddr, (uint8_t) size);
for(uint16_t i = 0; i < size; i++){
_pBuf[i] = _pWire->read();
}
_pWire->endTransmission();
return size;
}
Loading