everything works (gas not attempted yet)
This commit is contained in:
parent
3fef485f97
commit
aef3e4c4f9
26
README.md
26
README.md
@ -1,6 +1,6 @@
|
|||||||
# bme680
|
# bme680
|
||||||
|
|
||||||
Temperature OK, humidity OK, pressure a bit wonky. Not sure why !
|
Example with working temperature, pressure and humidity readout
|
||||||
|
|
||||||
```
|
```
|
||||||
$ ./bme680
|
$ ./bme680
|
||||||
@ -9,26 +9,26 @@ par_t1: 26203
|
|||||||
par_t2: 26519
|
par_t2: 26519
|
||||||
par_t3: 3
|
par_t3: 3
|
||||||
par_p1: 35008
|
par_p1: 35008
|
||||||
par_p2: 55252
|
par_p2: -10284
|
||||||
par_p3: 88
|
par_p3: 88
|
||||||
par_p4: 9692
|
par_p4: 9692
|
||||||
par_p5: 65334
|
par_p5: -202
|
||||||
par_p6: 30
|
par_p6: 30
|
||||||
par_p7: 24
|
par_p7: 24
|
||||||
par_p8: 65020
|
par_p8: -516
|
||||||
par_p9: 62067
|
par_p9: -3469
|
||||||
par_p10: 30
|
par_p10: 30
|
||||||
par_h1: 794
|
par_h1: 794
|
||||||
par_h2: 4003
|
par_h2: 1007
|
||||||
par_h3: 0
|
par_h3: 0
|
||||||
par_h4: 45
|
par_h4: 45
|
||||||
par_h5: 20
|
par_h5: 20
|
||||||
par_h6: 120
|
par_h6: 120
|
||||||
par_h7: 156
|
par_h7: -100
|
||||||
temperature: 22.8591 oC (floating-point)
|
temperature: 22.7519 oC (floating-point)
|
||||||
temperature: 2286 oC (integer)
|
temperature: 2275 oC (integer x100)
|
||||||
pressure: 146510 Pa (floating-point)
|
pressure: 99711.8 Pa or 0.997118 bar (floating-point)
|
||||||
pressure: 60428 Pa (integer)
|
pressure: 99708 Pa (integer)
|
||||||
humidity: 639.392 (floating-point)
|
humidity: 62.3145 (floating-point)
|
||||||
humidity: 639001 (integer)
|
humidity: 62289 (integer x1000)
|
||||||
```
|
```
|
||||||
|
48
bme680.c
48
bme680.c
@ -121,19 +121,22 @@ double calc_press_comp_1 ( uint32_t press_adc , bme680_t *bme680 ) {
|
|||||||
|
|
||||||
cal = &bme680->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 = var1 * var1 * ((double)cal->par_p6 / 131072.0);
|
||||||
var2 = var2 + (var1 * (double)cal->par_p5 * 2.0);
|
var2 = var2 + (var1 * (double)cal->par_p5 * 2.0);
|
||||||
var2 = (var2 / 4.0) + ((double)cal->par_p4 * 65536.0);
|
var2 = (var2 / 4.0) + ((double)cal->par_p4 * 65536.0);
|
||||||
var1 = ((((double)cal->par_p3 * var1 * var1) / 16384.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;
|
var1 = (1.0 + (var1 / 32768.0)) * (double)cal->par_p1;
|
||||||
press_comp = 1048576.0 - (double)press_adc;
|
press_comp = 1048576.0 - (double)press_adc;
|
||||||
press_comp = ((press_comp - (var2 / 4096.0)) * 6250.0) / var1;
|
press_comp = ((press_comp - (var2 / 4096.0)) * 6250.0) / var1;
|
||||||
var1 = ((double)cal->par_p9 * press_comp * press_comp) / 2147483648.0;
|
var1 = ((double)cal->par_p9 * press_comp * press_comp) / 2147483648.0;
|
||||||
var2 = press_comp * ((double)cal->par_p8 / 32768.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;
|
press_comp = press_comp + (var1 + var2 + var3 + ((double)cal->par_p7 * 128.0)) / 16.0;
|
||||||
|
|
||||||
|
|
||||||
bme680->press_comp_double = press_comp;
|
bme680->press_comp_double = press_comp;
|
||||||
return 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 ) {
|
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;
|
bme680_calibration *cal;
|
||||||
|
|
||||||
cal = &bme680->cal;
|
cal = &bme680->cal;
|
||||||
@ -151,22 +154,23 @@ int calc_press_comp_2 ( uint32_t press_adc , bme680_t *bme680 ) {
|
|||||||
var2 = var2 + ((var1 * (int32_t)cal->par_p5) << 1);
|
var2 = var2 + ((var1 * (int32_t)cal->par_p5) << 1);
|
||||||
var2 = (var2 >> 2) + ((int32_t)cal->par_p4 << 16);
|
var2 = (var2 >> 2) + ((int32_t)cal->par_p4 << 16);
|
||||||
var1 = (((((var1 >> 2) * (var1 >> 2)) >> 13) *
|
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 = var1 >> 18;
|
||||||
var1 = ((32768 + var1) * (int32_t)cal->par_p1) >> 15;
|
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));
|
press_comp = (uint32_t)((press_comp - (var2 >> 12)) * ((uint32_t)3125));
|
||||||
if (press_comp >= (1 << 30))
|
if (press_comp >= (1 << 30))
|
||||||
press_comp = ((press_comp / (uint32_t)var1) << 1);
|
press_comp = ((press_comp / (uint32_t)var1) << 1);
|
||||||
else
|
else
|
||||||
press_comp = ((press_comp << 1) / (uint32_t)var1);
|
press_comp = ((press_comp << 1) / (uint32_t)var1);
|
||||||
var1 = ((int32_t)cal->par_p9 * (int32_t)(((press_comp >> 3) *
|
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;
|
var2 = ((int32_t)(press_comp >> 2) * (int32_t)cal->par_p8) >> 13;
|
||||||
var3 = ((int32_t)(press_comp >> 8) * (int32_t)(press_comp >> 8) *
|
var3 = ((int32_t)(press_comp >> 8) * (int32_t)(press_comp >> 8) *
|
||||||
(int32_t)(press_comp >> 8) * (int32_t)cal->par_p10) >> 17;
|
(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);
|
press_comp = (int32_t)(press_comp) + ((var1 + var2 + var3 + ((int32_t)cal->par_p7 << 7)) >> 4);
|
||||||
|
|
||||||
|
|
||||||
bme680->press_comp_int = press_comp;
|
bme680->press_comp_int = press_comp;
|
||||||
|
|
||||||
return press_comp;
|
return 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 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;
|
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) *
|
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) *
|
temp_comp) + (((double)cal->par_h5 / 1048576.0) * temp_comp * temp_comp)));
|
||||||
bme680->temp_comp_double * bme680->temp_comp_double)));
|
|
||||||
var3 = (double)cal->par_h6 / 16384.0;
|
var3 = (double)cal->par_h6 / 16384.0;
|
||||||
var4 = (double)cal->par_h7 / 2097152.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;
|
bme680->hum_comp_double = hum_comp;
|
||||||
return 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 ) {
|
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;
|
bme680_calibration *cal;
|
||||||
|
|
||||||
cal = &bme680->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) -
|
var1 = (int32_t)hum_adc - (int32_t)((int32_t)cal->par_h1 << 4) -
|
||||||
(((temp_scaled * (int32_t)cal->par_h3) / ((int32_t)100)) >> 1);
|
(((temp_scaled * (int32_t)cal->par_h3) / ((int32_t)100)) >> 1);
|
||||||
var2 = ((int32_t)cal->par_h2 * (((temp_scaled *
|
var2 = ((int32_t)cal->par_h2 * (((temp_scaled * (int32_t)cal->par_h4) / ((int32_t)100)) +
|
||||||
(int32_t)cal->par_h4) / ((int32_t)100)) +
|
|
||||||
(((temp_scaled * ((temp_scaled * (int32_t)cal->par_h5) /
|
(((temp_scaled * ((temp_scaled * (int32_t)cal->par_h5) /
|
||||||
((int32_t)100))) >> 6) / ((int32_t)100)) + ((int32_t)(1 << 14)))) >> 10;
|
((int32_t)100))) >> 6) / ((int32_t)100)) + ((int32_t)(1 << 14)))) >> 10;
|
||||||
var3 = var1 * var2;
|
var3 = var1 * var2;
|
||||||
var4 = (((int32_t)cal->par_h6 << 7) +
|
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;
|
var5 = ((var3 >> 14) * (var3 >> 14)) >> 10;
|
||||||
var6 = (var4 * var5) >> 1;
|
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;
|
bme680->hum_comp_int = hum_comp;
|
||||||
return 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);
|
cal->par_h1 = (buffer[1] << 4) | (buffer[0] & 0xF);
|
||||||
|
|
||||||
err |= i2c_read_reg(fd, 0xE1, 2, buffer);
|
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);
|
err |= i2c_read_reg(fd, 0xE4, 1, buffer);
|
||||||
cal->par_h3 = buffer[0];
|
cal->par_h3 = buffer[0];
|
||||||
|
41
bme680.h
41
bme680.h
@ -3,26 +3,30 @@
|
|||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
|
||||||
uint16_t par_t1;
|
uint16_t par_t1;
|
||||||
uint16_t par_t2;
|
int16_t par_t2;
|
||||||
uint16_t par_t3; // 8 bit word
|
int8_t par_t3;
|
||||||
|
|
||||||
uint16_t par_p1;
|
uint16_t par_p1;
|
||||||
uint16_t par_p2;
|
int16_t par_p2;
|
||||||
uint16_t par_p3; // 8 bit word
|
int8_t par_p3;
|
||||||
uint16_t par_p4;
|
int16_t par_p4;
|
||||||
uint16_t par_p5;
|
int16_t par_p5;
|
||||||
uint16_t par_p6; // 8 bit word
|
int8_t par_p6;
|
||||||
uint16_t par_p7; // 8 bit word
|
int8_t par_p7;
|
||||||
uint16_t par_p8;
|
int16_t par_p8;
|
||||||
uint16_t par_p9;
|
int16_t par_p9;
|
||||||
uint16_t par_p10; //8 bit word
|
uint8_t par_p10;
|
||||||
|
|
||||||
uint16_t par_h1;
|
uint16_t par_h1;
|
||||||
uint16_t par_h2;
|
uint16_t par_h2;
|
||||||
uint16_t par_h3;
|
int8_t par_h3;
|
||||||
uint16_t par_h4;
|
int8_t par_h4;
|
||||||
uint16_t par_h5;
|
int8_t par_h5;
|
||||||
uint16_t par_h6;
|
uint8_t par_h6;
|
||||||
uint16_t par_h7;
|
int8_t par_h7;
|
||||||
|
|
||||||
uint16_t par_g1;
|
uint16_t par_g1;
|
||||||
uint16_t par_g2;
|
uint16_t par_g2;
|
||||||
uint16_t par_g3;
|
uint16_t par_g3;
|
||||||
@ -52,10 +56,9 @@ typedef struct {
|
|||||||
void print_calibration(bme680_calibration *);
|
void print_calibration(bme680_calibration *);
|
||||||
int bme680_calibrate(int, bme680_calibration *);
|
int bme680_calibrate(int, bme680_calibration *);
|
||||||
int calc_hum_comp_2(uint32_t, bme680_t *);
|
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 *);
|
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 *);
|
int calc_temp_comp_2(uint32_t, bme680_t *);
|
||||||
double calc_temp_comp_1(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 *);
|
||||||
|
|
||||||
|
8
main.c
8
main.c
@ -24,7 +24,7 @@ int main(){
|
|||||||
uint8_t ctrl_meas, ctrl_hum;
|
uint8_t ctrl_meas, ctrl_hum;
|
||||||
|
|
||||||
uint8_t osrs_t, osrs_p, osrs_h, ctrl_mode;
|
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_mode = 0;
|
||||||
|
|
||||||
ctrl_meas = (osrs_t << 5) | (osrs_p << 2) | ctrl_mode;
|
ctrl_meas = (osrs_t << 5) | (osrs_p << 2) | ctrl_mode;
|
||||||
@ -72,11 +72,11 @@ int main(){
|
|||||||
printf("temperature: %g oC (floating-point)\n", temperature);
|
printf("temperature: %g oC (floating-point)\n", temperature);
|
||||||
|
|
||||||
int temperature2 = calc_temp_comp_2 (temp_adc, &bme680 );
|
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 );
|
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 );
|
int pressure2 = calc_press_comp_2 (press_adc , &bme680 );
|
||||||
printf("pressure: %d Pa (integer)\n", pressure2);
|
printf("pressure: %d Pa (integer)\n", pressure2);
|
||||||
@ -85,7 +85,7 @@ int main(){
|
|||||||
printf("humidity: %g (floating-point)\n", humidity);
|
printf("humidity: %g (floating-point)\n", humidity);
|
||||||
|
|
||||||
int humidity2 = calc_hum_comp_2 ( hum_adc, &bme680 );
|
int humidity2 = calc_hum_comp_2 ( hum_adc, &bme680 );
|
||||||
printf("humidity: %d (integer)\n", humidity2);
|
printf("humidity: %d (integer x1000)\n", humidity2);
|
||||||
|
|
||||||
close(fd);
|
close(fd);
|
||||||
return 0;
|
return 0;
|
||||||
|
Loading…
Reference in New Issue
Block a user