Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
CDM7160.cpp
00001 /** 00002 * Project: CDM7160 00003 * Company: yosensi.io 00004 * CodeWriter: Michal Kozlowski 00005 * File: CDM7160.cpp 00006 * Date: 09-09-2019 00007 * Description: CDM7160 Driver Operation File 00008 */ 00009 00010 #include "mbed.h" 00011 #include "CDM7160.h" 00012 00013 00014 CDM7160::CDM7160(PinName sda, PinName scl, uint8_t addr) : pI2C(new I2C(sda, scl)), 00015 _I2C(*pI2C) 00016 { 00017 cdm7160.addr = addr << 1; 00018 cdm7160.co2 = 0; 00019 } 00020 00021 CDM7160::CDM7160(I2C &oI2C, uint8_t addr) : pI2C(NULL), 00022 _I2C(oI2C) 00023 { 00024 cdm7160.addr = (addr << 1); 00025 cdm7160.co2 = 0; 00026 } 00027 00028 CDM7160::~CDM7160() 00029 { 00030 if (NULL != pI2C) delete pI2C; 00031 } 00032 00033 /** 00034 * ==================== PUBLIC FUNCTIONS ==================== 00035 */ 00036 00037 int8_t CDM7160::init(){ 00038 00039 for(uint8_t i=0 ; i<3 ; i++){ 00040 if(control() == CDM7160_SUCCESS) 00041 return CDM7160_I2C_ADDR; 00042 wait_ms(20); 00043 } 00044 return CDM7160_ERROR; 00045 } 00046 00047 int8_t CDM7160::initIntegrated( uint16_t hpa, uint16_t height, 00048 eControlMode mode, 00049 eFunctionSetting atm_alt_correct, 00050 eFunctionSetting pwm_conce, 00051 eFunctionSetting pwm_pin){ 00052 for(uint8_t i=0 ; i<3 ; i++){ 00053 if(control(mode) == CDM7160_SUCCESS){ 00054 if(setSettings(atm_alt_correct, pwm_conce, pwm_pin) == CDM7160_SUCCESS){ 00055 if(setAirPressureAndAltitude(hpa, height) == CDM7160_SUCCESS){ 00056 return CDM7160_I2C_ADDR; 00057 } 00058 00059 } 00060 } 00061 wait_ms(20); 00062 } 00063 00064 return CDM7160_ERROR; 00065 } 00066 00067 int8_t CDM7160::softReset(){ 00068 char data[1] = {0x01}; 00069 if(write(RST, data, 1) == CDM7160_SUCCESS){ 00070 wait(1); 00071 return CDM7160_SUCCESS; 00072 } 00073 return CDM7160_ERROR; 00074 } 00075 00076 int8_t CDM7160::control(eControlMode mode){ 00077 char data[1]; 00078 data[0] = mode; 00079 if(write(CTL, data, 1) == CDM7160_SUCCESS){ 00080 wait_ms(1); 00081 if(read(data,1) == CDM7160_SUCCESS){ 00082 cdm7160.control = data[0]; 00083 return CDM7160_SUCCESS; 00084 } 00085 } 00086 return CDM7160_ERROR; 00087 } 00088 00089 int CDM7160::getCO2(){ 00090 char data[2]; 00091 uint8_t buff[2]; 00092 00093 if(write(DAL) == CDM7160_SUCCESS){ 00094 if(read(data,2) == CDM7160_SUCCESS){ 00095 for(int i=0; i<2; i++){buff[i] = data[i];} 00096 cdm7160.co2 = (int16_t)data[1]<<8 | data[0]; 00097 return cdm7160.co2; 00098 } 00099 } 00100 return CDM7160_ERROR; 00101 } 00102 00103 int8_t CDM7160::getStatus(){ 00104 char data[1]; 00105 00106 if(write(ST1) == CDM7160_SUCCESS){ 00107 if(read(data,1) == CDM7160_SUCCESS){ 00108 cdm7160.status = data[0]; 00109 return CDM7160_SUCCESS; 00110 } 00111 } 00112 00113 return CDM7160_ERROR; 00114 } 00115 00116 int8_t CDM7160::getAlarmLimits(){ 00117 char data[2]; 00118 if(write(ALHI) == CDM7160_SUCCESS){ 00119 if(read(data, 2) == CDM7160_SUCCESS){ 00120 cdm7160.highAlertLimit = data[0]*10; 00121 cdm7160.lowAlertLimit = data[1]*10; 00122 return CDM7160_SUCCESS; 00123 } 00124 } 00125 return CDM7160_ERROR; 00126 } 00127 00128 int8_t CDM7160::setAlarmLimits(uint16_t high_limit, uint16_t low_limit){ 00129 char data[1]; 00130 data[0] = high_limit/10; 00131 if(write(ALHI, data, 1) == CDM7160_SUCCESS){ 00132 wait_ms(1); 00133 data[0] = low_limit/10; 00134 if(write(ALLO, data, 1) == CDM7160_SUCCESS){ 00135 return CDM7160_SUCCESS; 00136 } 00137 } 00138 return CDM7160_ERROR; 00139 } 00140 00141 int8_t CDM7160::getAirPressureAndAltitude(){ 00142 char data[2]; 00143 if(write(HPA) == CDM7160_SUCCESS){ 00144 if(read(data,1) == CDM7160_SUCCESS){ 00145 cdm7160.atmosferic_pressure = data[0] + 800; 00146 if(write(HIT) == CDM7160_SUCCESS){ 00147 if(read(data,1) == CDM7160_SUCCESS){ 00148 cdm7160.altitude = data[0]*10; 00149 return CDM7160_SUCCESS; 00150 } 00151 } 00152 } 00153 } 00154 return CDM7160_ERROR; 00155 } 00156 00157 int8_t CDM7160::setAirPressureAndAltitude(uint16_t hpa, uint16_t height){ 00158 uint8_t atm, alt; 00159 atm = hpa - 800; 00160 alt = height/10; 00161 char data[1] = {atm}; 00162 if(write(HPA, data, 1) == CDM7160_SUCCESS){ 00163 data[0] = alt; 00164 if(write(HIT, data, 1) == CDM7160_SUCCESS){ 00165 return CDM7160_SUCCESS; 00166 } 00167 } 00168 return CDM7160_ERROR; 00169 } 00170 00171 int8_t CDM7160::getSettings(){ 00172 char data[1]; 00173 if(write(FUNC) == CDM7160_SUCCESS){ 00174 if(read(data, 1) == CDM7160_SUCCESS){ 00175 cdm7160.settings = data[0]; 00176 return CDM7160_SUCCESS; 00177 } 00178 } 00179 return CDM7160_ERROR; 00180 } 00181 00182 int8_t CDM7160::setSettings(eFunctionSetting atm_alt_correct, 00183 eFunctionSetting pwm_conce, 00184 eFunctionSetting pwm_pin){ 00185 00186 char data[1]; 00187 data[0] = pwm_pin | pwm_conce | atm_alt_correct; 00188 00189 if(write(FUNC, data, 1) == CDM7160_SUCCESS){ 00190 return CDM7160_SUCCESS; 00191 } 00192 return CDM7160_ERROR; 00193 } 00194 00195 int8_t CDM7160::selfDiagnosis(){ 00196 char data[1]; 00197 if(write(ERR) == CDM7160_SUCCESS){ 00198 if(read(data,1) == CDM7160_SUCCESS){ 00199 cdm7160.selfDiag = data[0]; 00200 return CDM7160_SUCCESS; 00201 } 00202 } 00203 return CDM7160_ERROR; 00204 } 00205 00206 /** 00207 * ==================== PRIVATE FUNCTIONS ==================== 00208 */ 00209 00210 int8_t CDM7160::read(char data[], uint8_t len) { 00211 return _I2C.read((cdm7160.addr + DIR_BIT_READ), data, len); 00212 } 00213 00214 int8_t CDM7160::write(uint8_t reg) { 00215 char regToWrite[1] = {reg}; 00216 return _I2C.write((cdm7160.addr + DIR_BIT_WRITE), regToWrite, 1); 00217 } 00218 00219 int8_t CDM7160::write(uint8_t reg, char data[], uint8_t len) { 00220 char dataToWrite[len + 1]; 00221 dataToWrite[0] = reg; 00222 for(uint8_t i=0; i<len; i++) 00223 dataToWrite[i+1] = data[i]; 00224 return _I2C.write((cdm7160.addr + DIR_BIT_WRITE), dataToWrite, (len + 1)); 00225 }
Generated on Fri Jul 15 2022 13:16:54 by
