This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts

Constant value for BME280 + nrf52832, SDK v.12.2

Hello, I have been trying to read the temp , hum and pressure value using BME280. The problem i face is i get the same value constantly and it doesn´t change.

I am trying to do the burst read and i can get RESET value but the data remains constant. image description

I tried to compensate the uncompressed value with the API provided by the BME280 datasheet.

uint32_t compensate_P_int64(int32_t adc_P) {
int64_t var1, var2, p;

var1 = ((int64_t) bme280.t_fine) - 128000;
var2 = var1 * var1 * (int64_t) bme280.cp.dig_P6;
var2 = var2 + ((var1 * (int64_t) bme280.cp.dig_P5) << 17);
var2 = var2 + (((int64_t) bme280.cp.dig_P4) << 35);
var1 = ((var1 * var1 * (int64_t) bme280.cp.dig_P3) >> 8)
		+ ((var1 * (int64_t) bme280.cp.dig_P2) << 12);
var1 = (((((int64_t) 1) << 47) + var1)) * ((int64_t) bme280.cp.dig_P1)
		>> 33;
if (var1 == 0) {
	return 0;
}

p = 1048576 - adc_P;
p = (((p << 31) - var2) * 3125) / var1;
var1 = (((int64_t) bme280.cp.dig_P9) * (p >> 13) * (p >> 13)) >> 25;
var2 = (((int64_t) bme280.cp.dig_P8) * p) >> 19;
p = ((p + var1 + var2) >> 8) + (((int64_t) bme280.cp.dig_P7) << 4);

return (uint32_t) p;

}

uint32_t compensate_H_int32(int32_t adc_H) { int32_t v_x1_u32r;

v_x1_u32r = (bme280.t_fine - ((int32_t) 76800));
v_x1_u32r = (((((adc_H << 14) - (((int32_t) bme280.cp.dig_H4) << 20)
		- (((int32_t) bme280.cp.dig_H5) * v_x1_u32r)) + ((int32_t) 16384))
		>> 15)
		* (((((((v_x1_u32r * ((int32_t) bme280.cp.dig_H6)) >> 10)
				* (((v_x1_u32r * ((int32_t) bme280.cp.dig_H3)) >> 11)
						+ ((int32_t) 32768))) >> 10) + ((int32_t) 2097152))
				* ((int32_t) bme280.cp.dig_H2) + 8192) >> 14));

v_x1_u32r = (v_x1_u32r
		- (((((v_x1_u32r >> 15) * (v_x1_u32r >> 15)) >> 7)
				* ((int32_t) bme280.cp.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 (uint32_t) (v_x1_u32r >> 12);

}

int32_t compensate_T_int32(int32_t adc_T) { int32_t var1, var2, T;

var1 = ((((adc_T >> 3) - ((int32_t) bme280.cp.dig_T1 << 1)))
		* ((int32_t) bme280.cp.dig_T2)) >> 11;
var2 = (((((adc_T >> 4) - ((int32_t) bme280.cp.dig_T1))
		* ((adc_T >> 4) - ((int32_t) bme280.cp.dig_T1))) >> 12)
		* ((int32_t) bme280.cp.dig_T3)) >> 14;

bme280.t_fine = var1 + var2;

T = (bme280.t_fine * 5 + 128) >> 8;

return T/100;

}

I can attach my main file and BME20 driver . Any pointers will be appreciated .

Thanks in Advance!bme280_gindumac.c

Related