From aef3e4c4f926ca522fac928f33627da90f4e86e3 Mon Sep 17 00:00:00 2001 From: "R.P.Clark" Date: Mon, 18 Sep 2023 16:32:27 +0100 Subject: [PATCH] everything works (gas not attempted yet) --- README.md | 26 +++++++++++++------------- bme680.c | 52 ++++++++++++++++++++++++++++++---------------------- bme680.h | 41 ++++++++++++++++++++++------------------- main.c | 8 ++++---- 4 files changed, 69 insertions(+), 58 deletions(-) diff --git a/README.md b/README.md index dd19efd..8dda08b 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # bme680 -Temperature OK, humidity OK, pressure a bit wonky. Not sure why ! +Example with working temperature, pressure and humidity readout ``` $ ./bme680 @@ -9,26 +9,26 @@ par_t1: 26203 par_t2: 26519 par_t3: 3 par_p1: 35008 -par_p2: 55252 +par_p2: -10284 par_p3: 88 par_p4: 9692 -par_p5: 65334 +par_p5: -202 par_p6: 30 par_p7: 24 -par_p8: 65020 -par_p9: 62067 +par_p8: -516 +par_p9: -3469 par_p10: 30 par_h1: 794 -par_h2: 4003 +par_h2: 1007 par_h3: 0 par_h4: 45 par_h5: 20 par_h6: 120 -par_h7: 156 -temperature: 22.8591 oC (floating-point) -temperature: 2286 oC (integer) -pressure: 146510 Pa (floating-point) -pressure: 60428 Pa (integer) -humidity: 639.392 (floating-point) -humidity: 639001 (integer) +par_h7: -100 +temperature: 22.7519 oC (floating-point) +temperature: 2275 oC (integer x100) +pressure: 99711.8 Pa or 0.997118 bar (floating-point) +pressure: 99708 Pa (integer) +humidity: 62.3145 (floating-point) +humidity: 62289 (integer x1000) ``` diff --git a/bme680.c b/bme680.c index f2bb6ea..7c347da 100644 --- a/bme680.c +++ b/bme680.c @@ -120,20 +120,23 @@ double calc_press_comp_1 ( uint32_t press_adc , bme680_t *bme680 ) { bme680_calibration *cal; cal = &bme680->cal; - - var1 = (bme680->tfine_double / 2.0) - 64000.0; + + var1 = ((double)bme680->tfine_int / 2.0) - 64000.0; var2 = var1 * var1 * ((double)cal->par_p6 / 131072.0); var2 = var2 + (var1 * (double)cal->par_p5 * 2.0); var2 = (var2 / 4.0) + ((double)cal->par_p4 * 65536.0); var1 = ((((double)cal->par_p3 * var1 * var1) / 16384.0) + - ((double)cal->par_p2 * var1)) / 524288.0; + ((double)cal->par_p2 * var1)) / 524288.0; var1 = (1.0 + (var1 / 32768.0)) * (double)cal->par_p1; press_comp = 1048576.0 - (double)press_adc; press_comp = ((press_comp - (var2 / 4096.0)) * 6250.0) / var1; var1 = ((double)cal->par_p9 * press_comp * press_comp) / 2147483648.0; var2 = press_comp * ((double)cal->par_p8 / 32768.0); - var3 = (press_comp / 256.0) * (press_comp / 256.0) * (press_comp / 256.0) * (cal->par_p10 / 131072.0); + var3 = (press_comp / 256.0) * (press_comp / 256.0) * + (press_comp / 256.0) * (cal->par_p10 / 131072.0); press_comp = press_comp + (var1 + var2 + var3 + ((double)cal->par_p7 * 128.0)) / 16.0; + + bme680->press_comp_double = press_comp; return press_comp; } @@ -141,7 +144,7 @@ double calc_press_comp_1 ( uint32_t press_adc , bme680_t *bme680 ) { int calc_press_comp_2 ( uint32_t press_adc , bme680_t *bme680 ) { - uint32_t var1, var2, var3, press_comp; + int32_t var1, var2, var3, press_comp; bme680_calibration *cal; cal = &bme680->cal; @@ -151,21 +154,22 @@ int calc_press_comp_2 ( uint32_t press_adc , bme680_t *bme680 ) { var2 = var2 + ((var1 * (int32_t)cal->par_p5) << 1); var2 = (var2 >> 2) + ((int32_t)cal->par_p4 << 16); var1 = (((((var1 >> 2) * (var1 >> 2)) >> 13) * - ((int32_t)cal->par_p3 << 5)) >> 3) + (((int32_t)cal->par_p2 * var1) >> 1); + ((int32_t)cal->par_p3 << 5)) >> 3) + (((int32_t)cal->par_p2 * var1) >> 1); var1 = var1 >> 18; var1 = ((32768 + var1) * (int32_t)cal->par_p1) >> 15; - press_comp = 1048576 - press_adc; // says "press_raw" in the bosch example + press_comp = 1048576 - press_adc; // bosch code pg 19 says "press_raw" here ??? press_comp = (uint32_t)((press_comp - (var2 >> 12)) * ((uint32_t)3125)); if (press_comp >= (1 << 30)) press_comp = ((press_comp / (uint32_t)var1) << 1); else press_comp = ((press_comp << 1) / (uint32_t)var1); var1 = ((int32_t)cal->par_p9 * (int32_t)(((press_comp >> 3) * - (press_comp >> 3)) >> 13)) >> 12; + (press_comp >> 3)) >> 13)) >> 12; var2 = ((int32_t)(press_comp >> 2) * (int32_t)cal->par_p8) >> 13; var3 = ((int32_t)(press_comp >> 8) * (int32_t)(press_comp >> 8) * (int32_t)(press_comp >> 8) * (int32_t)cal->par_p10) >> 17; press_comp = (int32_t)(press_comp) + ((var1 + var2 + var3 + ((int32_t)cal->par_p7 << 7)) >> 4); + bme680->press_comp_int = press_comp; @@ -175,17 +179,20 @@ int calc_press_comp_2 ( uint32_t press_adc , bme680_t *bme680 ) { double calc_hum_comp_1 ( uint32_t hum_adc , bme680_t *bme680 ) { - double var1, var2, var3, var4, hum_comp; + double var1, var2, var3, var4, hum_comp, temp_comp; bme680_calibration *cal; - cal = &bme680->cal; - var1 = hum_adc - (((double)cal->par_h1 * 16.0) + (((double)cal->par_h3 / 2.0) * bme680->temp_comp_double)); + cal = &bme680->cal; + temp_comp = bme680->temp_comp_double; + + var1 = hum_adc - (((double)cal->par_h1 * 16.0) + (((double)cal->par_h3 / 2.0) * temp_comp)); var2 = var1 * (((double)cal->par_h2 / 262144.0) * (1.0 + (((double)cal->par_h4 / 16384.0) * - bme680->temp_comp_double) + (((double)cal->par_h5 / 1048576.0) * - bme680->temp_comp_double * bme680->temp_comp_double))); + temp_comp) + (((double)cal->par_h5 / 1048576.0) * temp_comp * temp_comp))); var3 = (double)cal->par_h6 / 16384.0; var4 = (double)cal->par_h7 / 2097152.0; - hum_comp = var2 + ((var3 + (var4 * bme680->temp_comp_double)) * var2 * var2); + hum_comp = var2 + ((var3 + (var4 * temp_comp)) * var2 * var2); + + bme680->hum_comp_double = hum_comp; return hum_comp; } @@ -193,24 +200,25 @@ double calc_hum_comp_1 ( uint32_t hum_adc , bme680_t *bme680 ) { int calc_hum_comp_2 ( uint32_t hum_adc , bme680_t *bme680 ) { - uint32_t var1, var2, var3, var4, var5, var6, temp_scaled, hum_comp; + int32_t var1, var2, var3, var4, var5, var6, temp_scaled, hum_comp; bme680_calibration *cal; cal = &bme680->cal; - - temp_scaled = (int32_t)(bme680->temp_comp_int); + + temp_scaled = (int32_t)bme680->temp_comp_int; var1 = (int32_t)hum_adc - (int32_t)((int32_t)cal->par_h1 << 4) - (((temp_scaled * (int32_t)cal->par_h3) / ((int32_t)100)) >> 1); - var2 = ((int32_t)cal->par_h2 * (((temp_scaled * - (int32_t)cal->par_h4) / ((int32_t)100)) + + var2 = ((int32_t)cal->par_h2 * (((temp_scaled * (int32_t)cal->par_h4) / ((int32_t)100)) + (((temp_scaled * ((temp_scaled * (int32_t)cal->par_h5) / ((int32_t)100))) >> 6) / ((int32_t)100)) + ((int32_t)(1 << 14)))) >> 10; var3 = var1 * var2; var4 = (((int32_t)cal->par_h6 << 7) + - ((temp_scaled * (int32_t)cal->par_h7) / ((int32_t)100))) >> 4; + ((temp_scaled * (int32_t)cal->par_h7) / ((int32_t)100))) >> 4; var5 = ((var3 >> 14) * (var3 >> 14)) >> 10; var6 = (var4 * var5) >> 1; - hum_comp = (((var3 + var6) >> 10) * ((int32_t)1000)) >> 12; + hum_comp = (((var3 + var6) >> 10) * ((int32_t) 1000)) >> 12; + + bme680->hum_comp_int = hum_comp; return hum_comp; } @@ -269,7 +277,7 @@ int bme680_calibrate ( int fd , bme680_calibration *cal ) { cal->par_h1 = (buffer[1] << 4) | (buffer[0] & 0xF); err |= i2c_read_reg(fd, 0xE1, 2, buffer); - cal->par_h2 = (buffer[1] << 4) | ((buffer[0] >> 4) & 0xF); + cal->par_h2 = (buffer[0] << 4) | ((buffer[1] >> 4) & 0xF); err |= i2c_read_reg(fd, 0xE4, 1, buffer); cal->par_h3 = buffer[0]; diff --git a/bme680.h b/bme680.h index f96c0ed..62fea15 100644 --- a/bme680.h +++ b/bme680.h @@ -3,26 +3,30 @@ #include typedef struct { + uint16_t par_t1; - uint16_t par_t2; - uint16_t par_t3; // 8 bit word + int16_t par_t2; + int8_t par_t3; + uint16_t par_p1; - uint16_t par_p2; - uint16_t par_p3; // 8 bit word - uint16_t par_p4; - uint16_t par_p5; - uint16_t par_p6; // 8 bit word - uint16_t par_p7; // 8 bit word - uint16_t par_p8; - uint16_t par_p9; - uint16_t par_p10; //8 bit word + int16_t par_p2; + int8_t par_p3; + int16_t par_p4; + int16_t par_p5; + int8_t par_p6; + int8_t par_p7; + int16_t par_p8; + int16_t par_p9; + uint8_t par_p10; + uint16_t par_h1; uint16_t par_h2; - uint16_t par_h3; - uint16_t par_h4; - uint16_t par_h5; - uint16_t par_h6; - uint16_t par_h7; + int8_t par_h3; + int8_t par_h4; + int8_t par_h5; + uint8_t par_h6; + int8_t par_h7; + uint16_t par_g1; uint16_t par_g2; uint16_t par_g3; @@ -52,10 +56,9 @@ typedef struct { void print_calibration(bme680_calibration *); int bme680_calibrate(int, bme680_calibration *); int calc_hum_comp_2(uint32_t, bme680_t *); -double calc_hum_comp_1(uint32_t, bme680_t *); int calc_press_comp_2(uint32_t, bme680_t *); -double calc_press_comp_1(uint32_t, bme680_t *); int calc_temp_comp_2(uint32_t, bme680_t *); double calc_temp_comp_1(uint32_t, bme680_t*); - +double calc_press_comp_1(uint32_t, bme680_t *); +double calc_hum_comp_1(uint32_t, bme680_t *); diff --git a/main.c b/main.c index 9251147..37d7115 100644 --- a/main.c +++ b/main.c @@ -24,7 +24,7 @@ int main(){ uint8_t ctrl_meas, ctrl_hum; uint8_t osrs_t, osrs_p, osrs_h, ctrl_mode; - osrs_t = osrs_p = osrs_h = 0b011; + osrs_t = osrs_p = osrs_h = 0b110; ctrl_mode = 0; ctrl_meas = (osrs_t << 5) | (osrs_p << 2) | ctrl_mode; @@ -72,11 +72,11 @@ int main(){ printf("temperature: %g oC (floating-point)\n", temperature); int temperature2 = calc_temp_comp_2 (temp_adc, &bme680 ); - printf("temperature: %d oC (integer)\n", temperature2); + printf("temperature: %d oC (integer x100)\n", temperature2); double pressure = calc_press_comp_1 ( press_adc , &bme680 ); - printf("pressure: %g Pa (floating-point)\n", pressure); + printf("pressure: %g Pa or %g bar (floating-point)\n", pressure, pressure/1e5); int pressure2 = calc_press_comp_2 (press_adc , &bme680 ); printf("pressure: %d Pa (integer)\n", pressure2); @@ -85,7 +85,7 @@ int main(){ printf("humidity: %g (floating-point)\n", humidity); int humidity2 = calc_hum_comp_2 ( hum_adc, &bme680 ); - printf("humidity: %d (integer)\n", humidity2); + printf("humidity: %d (integer x1000)\n", humidity2); close(fd); return 0;