From c93c5e94a71b703f45360bb327091efd672fcb25 Mon Sep 17 00:00:00 2001 From: samkno1 Date: Tue, 19 Jul 2022 23:42:02 -0300 Subject: [PATCH 1/2] humidity sensor SPI data readout --- Core/Src/main.c | 177 +++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 174 insertions(+), 3 deletions(-) diff --git a/Core/Src/main.c b/Core/Src/main.c index ae765f51..52c7b0d5 100644 --- a/Core/Src/main.c +++ b/Core/Src/main.c @@ -27,7 +27,7 @@ /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ - +#include /* USER CODE END Includes */ /* Private typedef -----------------------------------------------------------*/ @@ -47,7 +47,21 @@ /* Private variables ---------------------------------------------------------*/ /* USER CODE BEGIN PV */ - +const uint8_t ctrl_meas = 0b01110100; +const uint8_t ctrl_hum = 0b01110010; +const uint8_t config = 0b01110101; +const uint8_t status = 0b11110011; +const uint8_t hum_msb = 0b11111101; +const uint8_t temp_msb = 0b11111010; +const uint8_t dig_H1_addr = 0b10100001; +const uint8_t dig_H2_addr = 0b11100001; +const uint8_t dig_H3_addr = 0b11100011; +const uint8_t dig_H4_addr = 0b11100100; +const uint8_t dig_H5_addr = 0b11100101; +const uint8_t dig_H6_addr = 0b11100111; +const uint8_t dig_T1_addr = 0b10001000; +const uint8_t dig_T2_addr = 0b10001010; +const uint8_t dig_T3_addr = 0b10001100; /* USER CODE END PV */ /* Private function prototypes -----------------------------------------------*/ @@ -82,7 +96,24 @@ int main(void) * 7. Full regression test as much as possible. If don't know what * regression test is, read up on it. */ - + HAL_StatusTypeDef ret; + uint8_t hum_val[3]; //humidity raw value + uint8_t temp_val[3]; //temperature raw value + typedef int32_t BME280_S32_t; + typedef uint32_t BME280_U32_t; + BME280_S32_t t_fine, adc_T, adc_H; + uint8_t spi_buff[5]; //SPI buffer not for measurements + uint8_t hum_osrs = 0b00000001; //enable humidity with x1 oversampling + uint8_t meas_val = 0b00100001; //set forced mode and turn off press + uint8_t filter_off = 0b00000000; //turn off filter + BME280_U32_t humidity; //final humidity value + uint8_t digT1[2]; + int8_t digT2[2], digT3[2], digH2[2]; + unsigned short dig_T1; + short dig_T2, dig_T3, dig_H2, dig_H4, dig_H5, dig_H4_ls[2], dig_H5_ls[2]; + unsigned char dig_H1, dig_H3, digH6; + char dig_H6; + memset(spi_buff, 0, sizeof(spi_buff)); /* USER CODE END 1 */ /* MCU @@ -117,7 +148,147 @@ int main(void) MX_SPI2_Init(); MX_TIM4_Init(); /* USER CODE BEGIN 2 */ + //select mode 0 + HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_RESET); + HAL_GPIO_WritePin(GPIOB, GPIO_PIN_10, GPIO_PIN_SET); + + //write settings + HAL_SPI_Transmit(&hspi2, (uint8_t *)&ctrl_hum, 1, 100); + HAL_SPI_Transmit(&hspi2, (uint8_t *)&hum_osrs, 1, 100); + HAL_SPI_Transmit(&hspi2, (uint8_t *)&ctrl_meas, 1, 100); + HAL_SPI_Transmit(&hspi2, (uint8_t *)&meas_val, 1, 100); + HAL_SPI_Transmit(&hspi2, (uint8_t *)&config, 1, 100); + HAL_SPI_Transmit(&hspi2, (uint8_t *)&filter_off, 1, 100); + HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_SET); + + spi_buff[0]=1; + + //check status + while(spi_buff[0] & 0b00001000){ //bit masking need bit 3 + HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_RESET); + HAL_GPIO_WritePin(GPIOB, GPIO_PIN_10, GPIO_PIN_SET); + HAL_SPI_Transmit(&hspi2, (uint8_t *)&status, 1, 100); + HAL_SPI_Receive(&hspi2, (uint8_t *)spi_buff, 1, 100); + HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_SET); + } + //read hum data + HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_RESET); + HAL_GPIO_WritePin(GPIOB, GPIO_PIN_10, GPIO_PIN_SET); + HAL_SPI_Transmit(&hspi2, (uint8_t *)&hum_msb, 1, 100); + ret = HAL_SPI_Receive(&hspi2, (uint8_t *)hum_val, 2, 100); + while(ret != HAL_OK){ + ret = HAL_SPI_Receive(&hspi2, (uint8_t *)hum_val, 2, 100); + } + HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_SET); + adc_H = (hum_val[1]>>8)|(hum_val[0]); + + //read temp data + HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_RESET); + HAL_GPIO_WritePin(GPIOB, GPIO_PIN_10, GPIO_PIN_SET); + HAL_SPI_Transmit(&hspi2, (uint8_t *)&temp_msb, 1, 100); + ret = HAL_SPI_Receive(&hspi2, (uint8_t *)temp_val, 1, 100); + while(ret != HAL_OK){ + ret = HAL_SPI_Receive(&hspi2, (uint8_t *)temp_val, 1, 100); + } + HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_SET); + + //correct temp data + adc_T = (temp_val[2] >> 24)|(temp_val[1] >> 21)|temp_val[0]; + + //read data + HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_RESET); + HAL_GPIO_WritePin(GPIOB, GPIO_PIN_10, GPIO_PIN_SET); + HAL_SPI_Transmit(&hspi2, (uint8_t *)&dig_T1_addr, 1, 100); + ret = HAL_SPI_Receive(&hspi2, (uint8_t *)digT1, 2, 100); + while(ret != HAL_OK){ + ret = HAL_SPI_Receive(&hspi2, (uint8_t *)digT1, 2, 100); + } + + dig_T1 = (digT1[1] << 8) | digT1[0]; + + HAL_SPI_Transmit(&hspi2, (uint8_t *)&dig_T2_addr, 1, 100); + ret = HAL_SPI_Receive(&hspi2, (uint8_t *)digT2, 2, 100); + while(ret != HAL_OK){ + ret = HAL_SPI_Receive(&hspi2, (uint8_t *)digT2, 2, 100); + } + + dig_T2 = (int)(digT2[1] << 8) | (int) digT2[0]; + + HAL_SPI_Transmit(&hspi2, (uint8_t *)&dig_T3_addr, 1, 100); + ret = HAL_SPI_Receive(&hspi2, (uint8_t *)digT3, 2, 100); + while(ret != HAL_OK){ + ret = HAL_SPI_Receive(&hspi2, (uint8_t *)digT3, 2, 100); + } + + dig_T3 = (int) ((digT3[1] << 8) | digT3[0]); + + HAL_SPI_Transmit(&hspi2, (uint8_t *)&dig_H1_addr, 1, 100); + ret = HAL_SPI_Receive(&hspi2, (unsigned char *)&dig_H1, 1, 100); + while(ret != HAL_OK){ + ret = HAL_SPI_Receive(&hspi2, (unsigned char *)&dig_H1, 1, 100); + } + + HAL_SPI_Transmit(&hspi2, (uint8_t *)&dig_H2_addr, 1, 100); + ret = HAL_SPI_Receive(&hspi2, (uint8_t *)digH2, 2, 100); + while(ret != HAL_OK){ + ret = HAL_SPI_Receive(&hspi2, (uint8_t *)digH2, 2, 100); + } + + dig_H2 = (int) ((digH2[1] << 8) | digH2[0]); + + HAL_SPI_Transmit(&hspi2, (uint8_t *)&dig_H3_addr, 1, 100); + ret = HAL_SPI_Receive(&hspi2, (unsigned char *)&dig_H3, 1, 100); + while(ret != HAL_OK){ + ret = HAL_SPI_Receive(&hspi2, (unsigned char *)&dig_H3, 1, 100); + } + + HAL_SPI_Transmit(&hspi2, (uint8_t *)&dig_H4_addr, 1, 100); + ret = HAL_SPI_Receive(&hspi2, (uint8_t *)dig_H4_ls, 2, 100); + while(ret != HAL_OK){ + ret = HAL_SPI_Receive(&hspi2, (uint8_t *)dig_H4_ls, 2, 100); + } + + dig_H4_ls[1] = dig_H4_ls[1] & 0b0000000000001111; + dig_H4 = (int) (dig_H4_ls[0] | dig_H4_ls[1]); + + HAL_SPI_Transmit(&hspi2, (uint8_t *)&dig_H5_addr, 1, 100); + ret = HAL_SPI_Receive(&hspi2, (uint8_t *)dig_H5_ls, 2, 100); + while(ret != HAL_OK){ + ret = HAL_SPI_Receive(&hspi2, (uint8_t *)dig_H5_ls, 2, 100); + } + + dig_H5_ls[0] = (dig_H5_ls[0] & 0b1111000000000000) >> 12; + dig_H5_ls[1] = dig_H5_ls[1] << 8; + dig_H5 = (int) (dig_H5_ls[1] | dig_H5_ls[0]); + + HAL_SPI_Transmit(&hspi2, (uint8_t *)&dig_H6_addr, 1, 100); + ret = HAL_SPI_Receive(&hspi2, (unsigned char *)&digH6, 1, 100); + while(ret != HAL_OK){ + ret = HAL_SPI_Receive(&hspi2, (unsigned char *)&digH6, 1, 100); + } + + dig_H6 = (char) digH6; + + HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_SET); + + //perform calculations + BME280_S32_t var1, var2; + var1 = ((((adc_T>>3) - ((BME280_S32_t)dig_T1<<1))) * ((BME280_S32_t)dig_T2)) >> 11; + var2 = (((((adc_T>>4) - ((BME280_S32_t)dig_T1)) * ((adc_T>>4) - ((BME280_S32_t)dig_T1))) >> 12) * + ((BME280_S32_t)dig_T3)) >> 14; + t_fine = var1 + var2; + + BME280_S32_t v_x1_u32r; + v_x1_u32r = (t_fine - ((BME280_S32_t)76800)); + v_x1_u32r = (((((adc_H << 14) - (((BME280_S32_t)dig_H4) << 20) - (((BME280_S32_t)dig_H5) * v_x1_u32r)) + + ((BME280_S32_t)16384)) >> 15) * (((((((v_x1_u32r * ((BME280_S32_t)dig_H6)) >> 10) * (((v_x1_u32r * ((BME280_S32_t)dig_H3)) >> 11) + + ((BME280_S32_t)32768))) >> 10) + ((BME280_S32_t)2097152)) * ((BME280_S32_t)dig_H2) + 8192) >> 14)); + v_x1_u32r = (v_x1_u32r - (((((v_x1_u32r >> 15) * (v_x1_u32r >> 15)) >> 7) * ((BME280_S32_t)dig_H1)) >> 4)); + v_x1_u32r = (v_x1_u32r < 0 ? 0 : v_x1_u32r); + v_x1_u32r = (v_x1_u32r > 419430400 ? 419430400 : v_x1_u32r); + + humidity = (BME280_U32_t) (v_x1_u32r >> 12); /* From here the application moves to the code found in cpp_link.cpp */ cpp_main(); From 6395252f9880f59cc4d58cb64c8302cffd24cdab Mon Sep 17 00:00:00 2001 From: samkno1 Date: Tue, 2 Aug 2022 00:37:37 -0300 Subject: [PATCH 2/2] BME280 module --- Core/Inc/bme280.h | 54 +++++++++++++++ Core/Src/bme280.c | 166 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 220 insertions(+) create mode 100644 Core/Inc/bme280.h create mode 100644 Core/Src/bme280.c diff --git a/Core/Inc/bme280.h b/Core/Inc/bme280.h new file mode 100644 index 00000000..021a9eb8 --- /dev/null +++ b/Core/Inc/bme280.h @@ -0,0 +1,54 @@ +/* + * bme280.h + * + * Created on: Jul. 23, 2022 + * Author: bossm + */ + +#ifndef INC_BME280_H_ +#define INC_BME280_H_ + +#include "main.h" +#define MAX_RAW_HUM_BYTES 3 +#define MAX_RAW_TEMP_BYTES 3 +#define SPI_BUFF_LEN 5 +#define DOUBLE_BYTE_LEN 2 + +const uint8_t ctrl_meas = 0x74; +const uint8_t ctrl_hum = 0x72; +const uint8_t config = 0x75; +const uint8_t status = 0xF3; +const uint8_t hum_msb = 0xFD; +const uint8_t temp_msb = 0xFA; +const uint8_t dig_h1_addr = 0xA1; +const uint8_t dig_h2_addr = 0xE1; +const uint8_t dig_h3_addr = 0xE3; +const uint8_t dig_h4_addr = 0xE4; +const uint8_t dig_h5_addr = 0xE5; +const uint8_t dig_h6_addr = 0xE7; +const uint8_t dig_t1_addr = 0x88; +const uint8_t dig_t2_addr = 0x8A; +const uint8_t dig_t3_addr = 0x8C; + +typedef int32_t bme280_s32_t; +typedef uint32_t bme280_u32_t; +bme280_s32_t t_fine, adc_t, adc_h; +void bme280CompensateT(bme280_s32_t adc_t); +bme280_u32_t bme280CompensateH(bme280_s32_t adc_h); + +uint8_t t1[DOUBLE_BYTE_LEN]; +uint16_t dig_t1; +int8_t t2[DOUBLE_BYTE_LEN], t3[DOUBLE_BYTE_LEN], h2[DOUBLE_BYTE_LEN]; +int16_t dig_t2, dig_t3, dig_h2, dig_h4, dig_h5, dig_h4_ls[DOUBLE_BYTE_LEN], dig_h5_ls[DOUBLE_BYTE_LEN]; +unsigned char dig_h1, dig_h3, h6; +char dig_h6; + +uint8_t spi_buff[SPI_BUFF_LEN]; +uint8_t hum_osrs = 0x1; //enable humidity with x1 oversampling +uint8_t meas_val = 0x21; //set forced mode and turn off pressure +uint8_t filter_off = 0x0; +uint8_t hum_raw_val[MAX_RAW_HUM_BYTES]; +uint8_t temp_raw_val[MAX_RAW_TEMP_BYTES]; +HAL_StatusTypeDef ret; + +#endif /* INC_BME280_H_ */ diff --git a/Core/Src/bme280.c b/Core/Src/bme280.c new file mode 100644 index 00000000..5d7a2878 --- /dev/null +++ b/Core/Src/bme280.c @@ -0,0 +1,166 @@ +/* + * bme280.c + * + * Created on: Jul. 23, 2022 + * Author: bossm + */ + +#include "bme280.h" +#include + +bme280_u32_t bme280(SPI_HandleTypeDef hspi2){ + //select mode 0 + HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_RESET); + HAL_GPIO_WritePin(GPIOB, GPIO_PIN_10, GPIO_PIN_SET); + + //write settings + HAL_SPI_Transmit(&hspi2, (uint8_t *)&ctrl_hum, 1, 100); + HAL_SPI_Transmit(&hspi2, (uint8_t *)&hum_osrs, 1, 100); + HAL_SPI_Transmit(&hspi2, (uint8_t *)&ctrl_meas, 1, 100); + HAL_SPI_Transmit(&hspi2, (uint8_t *)&meas_val, 1, 100); + HAL_SPI_Transmit(&hspi2, (uint8_t *)&config, 1, 100); + HAL_SPI_Transmit(&hspi2, (uint8_t *)&filter_off, 1, 100); + HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_SET); + + memset(spi_buff, 0, sizeof(spi_buff)); + spi_buff[0]=1; + + //check status + while(spi_buff[0] & (1<<3)){ //bit masking need bit 3 + HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_RESET); + HAL_GPIO_WritePin(GPIOB, GPIO_PIN_10, GPIO_PIN_SET); + HAL_SPI_Transmit(&hspi2, (uint8_t *)&status, 1, 100); + HAL_SPI_Receive(&hspi2, (uint8_t *)spi_buff, 1, 100); + HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_SET); + } + + //read hum data + HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_RESET); + HAL_GPIO_WritePin(GPIOB, GPIO_PIN_10, GPIO_PIN_SET); + HAL_SPI_Transmit(&hspi2, (uint8_t *)&hum_msb, 1, 100); + ret = HAL_SPI_Receive(&hspi2, (uint8_t *)hum_raw_val, 2, 100); + while(ret != HAL_OK){ + ret = HAL_SPI_Receive(&hspi2, (uint8_t *)hum_raw_val, 2, 100); + } + HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_SET); + adc_h = (hum_raw_val[1]>>8)|(hum_raw_val[0]); + + //read temp data + HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_RESET); + HAL_GPIO_WritePin(GPIOB, GPIO_PIN_10, GPIO_PIN_SET); + HAL_SPI_Transmit(&hspi2, (uint8_t *)&temp_msb, 1, 100); + ret = HAL_SPI_Receive(&hspi2, (uint8_t *)temp_raw_val, 1, 100); + while(ret != HAL_OK){ + ret = HAL_SPI_Receive(&hspi2, (uint8_t *)temp_raw_val, 1, 100); + } + HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_SET); + + //correct temp data + adc_t = (temp_raw_val[2] >> 24)|(temp_raw_val[1] >> 21)|temp_raw_val[0]; + + //read data + HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_RESET); + HAL_GPIO_WritePin(GPIOB, GPIO_PIN_10, GPIO_PIN_SET); + HAL_SPI_Transmit(&hspi2, (uint8_t *)&dig_t1_addr, 1, 100); + ret = HAL_SPI_Receive(&hspi2, (uint8_t *)t1, 2, 100); + while(ret != HAL_OK){ + ret = HAL_SPI_Receive(&hspi2, (uint8_t *)t1, 2, 100); + } + + dig_t1 = (t1[1] << 8) | t1[0]; + + HAL_SPI_Transmit(&hspi2, (uint8_t *)&dig_t2_addr, 1, 100); + ret = HAL_SPI_Receive(&hspi2, (uint8_t *)t2, 2, 100); + while(ret != HAL_OK){ + ret = HAL_SPI_Receive(&hspi2, (uint8_t *)t2, 2, 100); + } + + dig_t2 = (int)(t2[1] << 8) | (int) t2[0]; + + HAL_SPI_Transmit(&hspi2, (uint8_t *)&dig_t3_addr, 1, 100); + ret = HAL_SPI_Receive(&hspi2, (uint8_t *)t3, 2, 100); + while(ret != HAL_OK){ + ret = HAL_SPI_Receive(&hspi2, (uint8_t *)t3, 2, 100); + } + + dig_t3 = (int) ((t3[1] << 8) | t3[0]); + + HAL_SPI_Transmit(&hspi2, (uint8_t *)&dig_h1_addr, 1, 100); + ret = HAL_SPI_Receive(&hspi2, (unsigned char *)&dig_h1, 1, 100); + while(ret != HAL_OK){ + ret = HAL_SPI_Receive(&hspi2, (unsigned char *)&dig_h1, 1, 100); + } + + HAL_SPI_Transmit(&hspi2, (uint8_t *)&dig_h2_addr, 1, 100); + ret = HAL_SPI_Receive(&hspi2, (uint8_t *)h2, 2, 100); + while(ret != HAL_OK){ + ret = HAL_SPI_Receive(&hspi2, (uint8_t *)h2, 2, 100); + } + + dig_h2 = (int) ((h2[1] << 8) | h2[0]); + + HAL_SPI_Transmit(&hspi2, (uint8_t *)&dig_h3_addr, 1, 100); + ret = HAL_SPI_Receive(&hspi2, (unsigned char *)&dig_h3, 1, 100); + while(ret != HAL_OK){ + ret = HAL_SPI_Receive(&hspi2, (unsigned char *)&dig_h3, 1, 100); + } + + HAL_SPI_Transmit(&hspi2, (uint8_t *)&dig_h4_addr, 1, 100); + ret = HAL_SPI_Receive(&hspi2, (uint8_t *)dig_h4_ls, 2, 100); + while(ret != HAL_OK){ + ret = HAL_SPI_Receive(&hspi2, (uint8_t *)dig_h4_ls, 2, 100); + } + + dig_h4_ls[1] = dig_h4_ls[1] & 0xF; + dig_h4 = (int) (dig_h4_ls[0] | dig_h4_ls[1]); + + HAL_SPI_Transmit(&hspi2, (uint8_t *)&dig_h5_addr, 1, 100); + ret = HAL_SPI_Receive(&hspi2, (uint8_t *)dig_h5_ls, 2, 100); + while(ret != HAL_OK){ + ret = HAL_SPI_Receive(&hspi2, (uint8_t *)dig_h5_ls, 2, 100); + } + + dig_h5_ls[0] = (dig_h5_ls[0] & 0xF000) >> 12; + dig_h5_ls[1] = dig_h5_ls[1] << 8; + dig_h5 = (int) (dig_h5_ls[1] | dig_h5_ls[0]); + + HAL_SPI_Transmit(&hspi2, (uint8_t *)&dig_h6_addr, 1, 100); + ret = HAL_SPI_Receive(&hspi2, (unsigned char *)&h6, 1, 100); + while(ret != HAL_OK){ + ret = HAL_SPI_Receive(&hspi2, (unsigned char *)&h6, 1, 100); + } + + dig_h6 = (char) h6; + + HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_SET); + + return bme280CompensateH(adc_h); +} + +// Returns temperature in DegC, resolution is 0.01 DegC. Output value of “5123” equals 51.23 DegC. +// t_fine carries fine temperature as global value +void bme280CompensateT(bme280_s32_t adc_t){ + bme280_s32_t var1, var2; + var1 = ((((adc_t>>3) - ((bme280_s32_t)dig_t1<<1))) * ((bme280_s32_t)dig_t2)) >> 11; + var2 = (((((adc_t>>4) - ((bme280_s32_t)dig_t1)) * ((adc_t>>4) - ((bme280_s32_t)dig_t1))) >> 12) * + ((bme280_s32_t)dig_t3)) >> 14; + t_fine = var1 + var2; + //T = (t_fine * 5 + 128) >> 8; + //return T; +} + +// Returns humidity in %RH as unsigned 32 bit integer in Q22.10 format (22 integer and 10 fractional bits). +// Output value of “47445” represents 47445/1024 = 46.333 %RH +bme280_u32_t bme280CompensateH(bme280_s32_t adc_h){ + bme280CompensateT(adc_t); + bme280_s32_t v_x1_u32r; + v_x1_u32r = (t_fine - ((bme280_s32_t)76800)); + v_x1_u32r = (((((adc_h << 14) - (((bme280_s32_t)dig_h4) << 20) - (((bme280_s32_t)dig_h5) * v_x1_u32r)) + + ((bme280_s32_t)16384)) >> 15) * (((((((v_x1_u32r * ((bme280_s32_t)dig_h6)) >> 10) * (((v_x1_u32r * + ((bme280_s32_t)dig_h3)) >> 11) + ((bme280_s32_t)32768))) >> 10) + ((bme280_s32_t)2097152)) * + ((bme280_s32_t)dig_h2) + 8192) >> 14)); + v_x1_u32r = (v_x1_u32r - (((((v_x1_u32r >> 15) * (v_x1_u32r >> 15)) >> 7) * ((bme280_s32_t)dig_h1)) >> 4)); + v_x1_u32r = (v_x1_u32r < 0 ? 0 : v_x1_u32r); + v_x1_u32r = (v_x1_u32r > 419430400 ? 419430400 : v_x1_u32r); + return (bme280_u32_t)(v_x1_u32r>>12); +}