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.
Fork of ReferredCoursework2016 by
hts221_class.cpp
00001 /** 00002 ****************************************************************************** 00003 * @file hts221_class.cpp 00004 * @author AST / EST 00005 * @version V0.0.1 00006 * @date 14-April-2015 00007 * @brief Implementation file for the HTS221 driver class 00008 ****************************************************************************** 00009 * @attention 00010 * 00011 * <h2><center>© COPYRIGHT(c) 2015 STMicroelectronics</center></h2> 00012 * 00013 * Redistribution and use in source and binary forms, with or without modification, 00014 * are permitted provided that the following conditions are met: 00015 * 1. Redistributions of source code must retain the above copyright notice, 00016 * this list of conditions and the following disclaimer. 00017 * 2. Redistributions in binary form must reproduce the above copyright notice, 00018 * this list of conditions and the following disclaimer in the documentation 00019 * and/or other materials provided with the distribution. 00020 * 3. Neither the name of STMicroelectronics nor the names of its contributors 00021 * may be used to endorse or promote products derived from this software 00022 * without specific prior written permission. 00023 * 00024 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 00025 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 00026 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 00027 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE 00028 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 00029 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 00030 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 00031 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 00032 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 00033 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 00034 * 00035 ****************************************************************************** 00036 */ 00037 00038 /* Includes ------------------------------------------------------------------*/ 00039 #include "hts221_class.h" 00040 #include "hts221.h" 00041 00042 /* Methods -------------------------------------------------------------------*/ 00043 /* betzw - based on: 00044 X-CUBE-MEMS1/trunk/Drivers/BSP/Components/hts221/hts221.c: revision #410, 00045 X-CUBE-MEMS1/trunk: revision #416 00046 */ 00047 00048 /** 00049 * @brief HTS221 Calibration procedure 00050 * @retval HUM_TEMP_OK in case of success, an error code otherwise 00051 */ 00052 HUM_TEMP_StatusTypeDef HTS221::HTS221_Calibration(void) 00053 { 00054 /* Temperature Calibration */ 00055 /* Temperature in degree for calibration ( "/8" to obtain float) */ 00056 uint16_t T0_degC_x8_L, T0_degC_x8_H, T1_degC_x8_L, T1_degC_x8_H; 00057 uint8_t H0_rh_x2, H1_rh_x2; 00058 uint8_t tempReg[2] = {0, 0}; 00059 00060 if(HTS221_IO_Read(tempReg, HTS221_T0_degC_X8_ADDR, 1) != HUM_TEMP_OK) 00061 { 00062 return HUM_TEMP_ERROR; 00063 } 00064 00065 T0_degC_x8_L = (uint16_t)tempReg[0]; 00066 00067 if(HTS221_IO_Read(tempReg, HTS221_T1_T0_MSB_X8_ADDR, 1) != HUM_TEMP_OK) 00068 { 00069 return HUM_TEMP_ERROR; 00070 } 00071 00072 T0_degC_x8_H = (uint16_t) (tempReg[0] & 0x03); 00073 T0_degC = ((float)((T0_degC_x8_H << 8) | (T0_degC_x8_L))) / 8; 00074 00075 if(HTS221_IO_Read(tempReg, HTS221_T1_degC_X8_ADDR, 1) != HUM_TEMP_OK) 00076 { 00077 return HUM_TEMP_ERROR; 00078 } 00079 00080 T1_degC_x8_L = (uint16_t)tempReg[0]; 00081 00082 if(HTS221_IO_Read(tempReg, HTS221_T1_T0_MSB_X8_ADDR, 1) != HUM_TEMP_OK) 00083 { 00084 return HUM_TEMP_ERROR; 00085 } 00086 00087 T1_degC_x8_H = (uint16_t) (tempReg[0] & 0x0C); 00088 T1_degC_x8_H = T1_degC_x8_H >> 2; 00089 T1_degC = ((float)((T1_degC_x8_H << 8) | (T1_degC_x8_L))) / 8; 00090 00091 if(HTS221_IO_Read(tempReg, (HTS221_T0_OUT_L_ADDR | HTS221_I2C_MULTIPLEBYTE_CMD), 2) != HUM_TEMP_OK) 00092 { 00093 return HUM_TEMP_ERROR; 00094 } 00095 00096 T0_out = ((((int16_t)tempReg[1]) << 8) + (int16_t)tempReg[0]); 00097 00098 if(HTS221_IO_Read(tempReg, (HTS221_T1_OUT_L_ADDR | HTS221_I2C_MULTIPLEBYTE_CMD), 2) != HUM_TEMP_OK) 00099 { 00100 return HUM_TEMP_ERROR; 00101 } 00102 00103 T1_out = ((((int16_t)tempReg[1]) << 8) + (int16_t)tempReg[0]); 00104 00105 /* Humidity Calibration */ 00106 /* Humidity in degree for calibration ( "/2" to obtain float) */ 00107 00108 if(HTS221_IO_Read(&H0_rh_x2, HTS221_H0_RH_X2_ADDR, 1) != HUM_TEMP_OK) 00109 { 00110 return HUM_TEMP_ERROR; 00111 } 00112 00113 if(HTS221_IO_Read(&H1_rh_x2, HTS221_H1_RH_X2_ADDR, 1) != HUM_TEMP_OK) 00114 { 00115 return HUM_TEMP_ERROR; 00116 } 00117 00118 if(HTS221_IO_Read(&tempReg[0], (HTS221_H0_T0_OUT_L_ADDR | HTS221_I2C_MULTIPLEBYTE_CMD), 00119 2) != HUM_TEMP_OK) 00120 { 00121 return HUM_TEMP_ERROR; 00122 } 00123 00124 H0_T0_out = ((((int16_t)tempReg[1]) << 8) + (int16_t)tempReg[0]); 00125 00126 if(HTS221_IO_Read(&tempReg[0], (HTS221_H1_T0_OUT_L_ADDR | HTS221_I2C_MULTIPLEBYTE_CMD), 00127 2) != HUM_TEMP_OK) 00128 { 00129 return HUM_TEMP_ERROR; 00130 } 00131 00132 H1_T0_out = ((((int16_t)tempReg[1]) << 8) + (int16_t)tempReg[0]); 00133 00134 H0_rh = ((float)H0_rh_x2) / 2; 00135 H1_rh = ((float)H1_rh_x2) / 2; 00136 00137 return HUM_TEMP_OK; 00138 } 00139 00140 00141 /** 00142 * @brief Set HTS221 Initialization 00143 * @param HTS221_Init the configuration setting for the HTS221 00144 * @retval HUM_TEMP_OK in case of success, an error code otherwise 00145 */ 00146 HUM_TEMP_StatusTypeDef HTS221::HTS221_Init(HUM_TEMP_InitTypeDef *HTS221_Init) 00147 { 00148 uint8_t tmp = 0x00; 00149 00150 /* Configure the low level interface ---------------------------------------*/ 00151 if(HTS221_IO_Init() != HUM_TEMP_OK) 00152 { 00153 return HUM_TEMP_ERROR; 00154 } 00155 00156 if(HTS221_Power_On() != HUM_TEMP_OK) 00157 { 00158 return HUM_TEMP_ERROR; 00159 } 00160 00161 if(HTS221_Calibration() != HUM_TEMP_OK) 00162 { 00163 return HUM_TEMP_ERROR; 00164 } 00165 00166 if(HTS221_IO_Read(&tmp, HTS221_CTRL_REG1_ADDR, 1) != HUM_TEMP_OK) 00167 { 00168 return HUM_TEMP_ERROR; 00169 } 00170 00171 /* Output Data Rate selection */ 00172 tmp &= ~(HTS221_ODR_MASK); 00173 tmp |= HTS221_Init->OutputDataRate; 00174 00175 if(HTS221_IO_Write(&tmp, HTS221_CTRL_REG1_ADDR, 1) != HUM_TEMP_OK) 00176 { 00177 return HUM_TEMP_ERROR; 00178 } 00179 00180 HTS221_IO_ITConfig(); 00181 00182 return HUM_TEMP_OK; 00183 } 00184 00185 /** 00186 * @brief Read ID address of HTS221 00187 * @param ht_id the pointer where the ID of the device is stored 00188 * @retval HUM_TEMP_OK in case of success, an error code otherwise 00189 */ 00190 HUM_TEMP_StatusTypeDef HTS221::HTS221_ReadID(uint8_t *ht_id) 00191 { 00192 if(!ht_id) 00193 { 00194 return HUM_TEMP_ERROR; 00195 } 00196 00197 return HTS221_IO_Read(ht_id, HTS221_WHO_AM_I_ADDR, 1); 00198 } 00199 00200 /** 00201 * @brief Reboot memory content of HTS221 00202 * @retval HUM_TEMP_OK in case of success, an error code otherwise 00203 */ 00204 HUM_TEMP_StatusTypeDef HTS221::HTS221_RebootCmd(void) 00205 { 00206 uint8_t tmpreg; 00207 00208 /* Read CTRL_REG2 register */ 00209 if(HTS221_IO_Read(&tmpreg, HTS221_CTRL_REG2_ADDR, 1) != HUM_TEMP_OK) 00210 { 00211 return HUM_TEMP_ERROR; 00212 } 00213 00214 /* Enable or Disable the reboot memory */ 00215 tmpreg |= HTS221_BOOT_REBOOTMEMORY; 00216 00217 /* Write value to MEMS CTRL_REG2 regsister */ 00218 if(HTS221_IO_Write(&tmpreg, HTS221_CTRL_REG2_ADDR, 1) != HUM_TEMP_OK) 00219 { 00220 return HUM_TEMP_ERROR; 00221 } 00222 00223 return HUM_TEMP_OK; 00224 } 00225 00226 00227 /** 00228 * @brief Read HTS221 output register, and calculate the humidity 00229 * @param pfData the pointer to data output 00230 * @retval HUM_TEMP_OK in case of success, an error code otherwise 00231 */ 00232 HUM_TEMP_StatusTypeDef HTS221::HTS221_GetHumidity(float* pfData) 00233 { 00234 int16_t H_T_out, humidity_t; 00235 uint8_t tempReg[2] = {0, 0}; 00236 uint8_t tmp = 0x00; 00237 float H_rh; 00238 00239 if(HTS221_IO_Read(&tmp, HTS221_CTRL_REG1_ADDR, 1) != HUM_TEMP_OK) 00240 { 00241 return HUM_TEMP_ERROR; 00242 } 00243 00244 /* Output Data Rate selection */ 00245 tmp &= (HTS221_ODR_MASK); 00246 00247 if(tmp == 0x00) 00248 { 00249 if(HTS221_IO_Read(&tmp, HTS221_CTRL_REG2_ADDR, 1) != HUM_TEMP_OK) 00250 { 00251 return HUM_TEMP_ERROR; 00252 } 00253 00254 /* Serial Interface Mode selection */ 00255 tmp &= ~(HTS221_ONE_SHOT_MASK); 00256 tmp |= HTS221_ONE_SHOT_START; 00257 00258 if(HTS221_IO_Write(&tmp, HTS221_CTRL_REG2_ADDR, 1) != HUM_TEMP_OK) 00259 { 00260 return HUM_TEMP_ERROR; 00261 } 00262 00263 do 00264 { 00265 00266 if(HTS221_IO_Read(&tmp, HTS221_STATUS_REG_ADDR, 1) != HUM_TEMP_OK) 00267 { 00268 return HUM_TEMP_ERROR; 00269 } 00270 00271 } 00272 while(!(tmp & 0x02)); 00273 } 00274 00275 00276 if(HTS221_IO_Read(&tempReg[0], (HTS221_HUMIDITY_OUT_L_ADDR | HTS221_I2C_MULTIPLEBYTE_CMD), 00277 2) != HUM_TEMP_OK) 00278 { 00279 return HUM_TEMP_ERROR; 00280 } 00281 00282 H_T_out = ((((int16_t)tempReg[1]) << 8) + (int16_t)tempReg[0]); 00283 00284 H_rh = ( float )(((( H_T_out - H0_T0_out ) * ( H1_rh - H0_rh )) / ( H1_T0_out - H0_T0_out )) + H0_rh ); 00285 00286 // Truncate to specific number of decimal digits 00287 humidity_t = (uint16_t)(H_rh * pow(10.0f, HUM_DECIMAL_DIGITS)); 00288 *pfData = ((float)humidity_t) / pow(10.0f, HUM_DECIMAL_DIGITS); 00289 00290 // Prevent data going below 0% and above 100% due to linear interpolation 00291 if ( *pfData < 0.0f ) *pfData = 0.0f; 00292 if ( *pfData > 100.0f ) *pfData = 100.0f; 00293 00294 return HUM_TEMP_OK; 00295 } 00296 00297 /** 00298 * @brief Read HTS221 output register, and calculate the temperature 00299 * @param pfData the pointer to data output 00300 * @retval HUM_TEMP_OK in case of success, an error code otherwise 00301 */ 00302 HUM_TEMP_StatusTypeDef HTS221::HTS221_GetTemperature(float* pfData) 00303 { 00304 int16_t T_out, temperature_t; 00305 uint8_t tempReg[2] = {0, 0}; 00306 uint8_t tmp = 0x00; 00307 float T_degC; 00308 00309 if(HTS221_IO_Read(&tmp, HTS221_CTRL_REG1_ADDR, 1) != HUM_TEMP_OK) 00310 { 00311 return HUM_TEMP_ERROR; 00312 } 00313 00314 /* Output Data Rate selection */ 00315 tmp &= (HTS221_ODR_MASK); 00316 00317 if(tmp == 0x00) 00318 { 00319 if(HTS221_IO_Read(&tmp, HTS221_CTRL_REG2_ADDR, 1) != HUM_TEMP_OK) 00320 { 00321 return HUM_TEMP_ERROR; 00322 } 00323 00324 /* Serial Interface Mode selection */ 00325 tmp &= ~(HTS221_ONE_SHOT_MASK); 00326 tmp |= HTS221_ONE_SHOT_START; 00327 00328 if(HTS221_IO_Write(&tmp, HTS221_CTRL_REG2_ADDR, 1) != HUM_TEMP_OK) 00329 { 00330 return HUM_TEMP_ERROR; 00331 } 00332 00333 do 00334 { 00335 00336 if(HTS221_IO_Read(&tmp, HTS221_STATUS_REG_ADDR, 1) != HUM_TEMP_OK) 00337 { 00338 return HUM_TEMP_ERROR; 00339 } 00340 00341 } 00342 while(!(tmp & 0x01)); 00343 } 00344 00345 if(HTS221_IO_Read(&tempReg[0], (HTS221_TEMP_OUT_L_ADDR | HTS221_I2C_MULTIPLEBYTE_CMD), 00346 2) != HUM_TEMP_OK) 00347 { 00348 return HUM_TEMP_ERROR; 00349 } 00350 00351 T_out = ((((int16_t)tempReg[1]) << 8) + (int16_t)tempReg[0]); 00352 00353 T_degC = ((float)(T_out - T0_out)) / (T1_out - T0_out) * (T1_degC - T0_degC) + T0_degC; 00354 00355 temperature_t = (int16_t)(T_degC * pow(10.0f, TEMP_DECIMAL_DIGITS)); 00356 00357 *pfData = ((float)temperature_t) / pow(10.0f, TEMP_DECIMAL_DIGITS); 00358 00359 return HUM_TEMP_OK; 00360 } 00361 00362 00363 /** 00364 * @brief Exit the shutdown mode for HTS221 00365 * @retval HUM_TEMP_OK in case of success, an error code otherwise 00366 */ 00367 HUM_TEMP_StatusTypeDef HTS221::HTS221_Power_On(void) 00368 { 00369 uint8_t tmpReg; 00370 00371 /* Read the register content */ 00372 if(HTS221_IO_Read(&tmpReg, HTS221_CTRL_REG1_ADDR, 1) != HUM_TEMP_OK) 00373 { 00374 return HUM_TEMP_ERROR; 00375 } 00376 00377 /* Set the power down bit */ 00378 tmpReg |= HTS221_MODE_ACTIVE; 00379 00380 /* Write register */ 00381 if(HTS221_IO_Write(&tmpReg, HTS221_CTRL_REG1_ADDR, 1) != HUM_TEMP_OK) 00382 { 00383 return HUM_TEMP_ERROR; 00384 } 00385 00386 return HUM_TEMP_OK; 00387 } 00388 00389 /** 00390 * @brief Enter the shutdown mode for HTS221 00391 * @retval HUM_TEMP_OK in case of success, an error code otherwise 00392 */ 00393 HUM_TEMP_StatusTypeDef HTS221::HTS221_Power_OFF(void) 00394 { 00395 uint8_t tmpReg; 00396 00397 /* Read the register content */ 00398 if(HTS221_IO_Read(&tmpReg, HTS221_CTRL_REG1_ADDR, 1) != HUM_TEMP_OK) 00399 { 00400 return HUM_TEMP_ERROR; 00401 } 00402 00403 /* Reset the power down bit */ 00404 tmpReg &= ~(HTS221_MODE_ACTIVE); 00405 00406 /* Write register */ 00407 if(HTS221_IO_Write(&tmpReg, HTS221_CTRL_REG1_ADDR, 1) != HUM_TEMP_OK) 00408 { 00409 return HUM_TEMP_ERROR; 00410 } 00411 00412 return HUM_TEMP_OK; 00413 } 00414 00415 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
Generated on Sat Jul 16 2022 05:47:21 by
