@@ -68,7 +68,10 @@ static uint8_t r8u(uint8_t reg) {
68
68
return ret [0 ];
69
69
}
70
70
71
- /* This part of code is coming from the original bme680.c driver by Bosch.
71
+ // replace 'dev->calib.' with 'bme680_data.'
72
+ // replace 'dev->amb_temp' with 'amb_temp'
73
+
74
+ /**\mainpage
72
75
* Copyright (C) 2017 - 2018 Bosch Sensortec GmbH
73
76
*
74
77
* Redistribution and use in source and binary forms, with or without
@@ -108,20 +111,13 @@ static uint8_t r8u(uint8_t reg) {
108
111
* other rights of third parties which may result from its use.
109
112
* No license is granted by implication or otherwise under any patent or
110
113
* patent rights of the copyright holder.
114
+ *
115
+ * File bme680.c
116
+ * @date 19 Jun 2018
117
+ * @version 3.5.9
118
+ *
111
119
*/
112
120
113
- /**static variables */
114
- /**Look up table for the possible gas range values */
115
- uint32_t lookupTable1 [16 ] = { UINT32_C (2147483647 ), UINT32_C (2147483647 ), UINT32_C (2147483647 ), UINT32_C (2147483647 ),
116
- UINT32_C (2147483647 ), UINT32_C (2126008810 ), UINT32_C (2147483647 ), UINT32_C (2130303777 ), UINT32_C (2147483647 ),
117
- UINT32_C (2147483647 ), UINT32_C (2143188679 ), UINT32_C (2136746228 ), UINT32_C (2147483647 ), UINT32_C (2126008810 ),
118
- UINT32_C (2147483647 ), UINT32_C (2147483647 ) };
119
- /**Look up table for the possible gas range values */
120
- uint32_t lookupTable2 [16 ] = { UINT32_C (4096000000 ), UINT32_C (2048000000 ), UINT32_C (1024000000 ), UINT32_C (512000000 ),
121
- UINT32_C (255744255 ), UINT32_C (127110228 ), UINT32_C (64000000 ), UINT32_C (32258064 ), UINT32_C (16016016 ), UINT32_C (
122
- 8000000 ), UINT32_C (4000000 ), UINT32_C (2000000 ), UINT32_C (1000000 ), UINT32_C (500000 ), UINT32_C (250000 ),
123
- UINT32_C (125000 ) };
124
-
125
121
static uint8_t calc_heater_res (uint16_t temp )
126
122
{
127
123
uint8_t heatr_res ;
@@ -132,9 +128,7 @@ static uint8_t calc_heater_res(uint16_t temp)
132
128
int32_t var5 ;
133
129
int32_t heatr_res_x100 ;
134
130
135
- if (temp < 200 ) /* Cap temperature */
136
- temp = 200 ;
137
- else if (temp > 400 )
131
+ if (temp > 400 ) /* Cap temperature */
138
132
temp = 400 ;
139
133
140
134
var1 = (((int32_t ) amb_temp * bme680_data .par_gh3 ) / 1000 ) * 256 ;
@@ -173,12 +167,12 @@ static int16_t calc_temperature(uint32_t temp_adc)
173
167
int64_t var3 ;
174
168
int16_t calc_temp ;
175
169
176
- var1 = ((int32_t ) temp_adc / 8 ) - ((int32_t ) bme680_data .par_t1 * 2 );
177
- var2 = (var1 * (int32_t ) bme680_data .par_t2 ) / 2048 ;
178
- var3 = ((var1 / 2 ) * (var1 / 2 )) / 4096 ;
179
- var3 = ((var3 ) * ((int32_t ) bme680_data .par_t3 * 16 )) / 16384 ;
170
+ var1 = ((int32_t ) temp_adc >> 3 ) - ((int32_t ) bme680_data .par_t1 << 1 );
171
+ var2 = (var1 * (int32_t ) bme680_data .par_t2 ) >> 11 ;
172
+ var3 = ((var1 >> 1 ) * (var1 >> 1 )) >> 12 ;
173
+ var3 = ((var3 ) * ((int32_t ) bme680_data .par_t3 << 4 )) >> 14 ;
180
174
bme680_data .t_fine = (int32_t ) (var2 + var3 );
181
- calc_temp = (int16_t ) (((bme680_data .t_fine * 5 ) + 128 ) / 256 );
175
+ calc_temp = (int16_t ) (((bme680_data .t_fine * 5 ) + 128 ) >> 8 );
182
176
183
177
return calc_temp ;
184
178
}
@@ -188,27 +182,37 @@ static uint32_t calc_pressure(uint32_t pres_adc)
188
182
int32_t var1 ;
189
183
int32_t var2 ;
190
184
int32_t var3 ;
191
- int32_t calc_pres ;
192
-
193
- var1 = (((int32_t ) bme680_data .t_fine ) / 2 ) - 64000 ;
194
- var2 = ((var1 / 4 ) * (var1 / 4 )) / 2048 ;
195
- var2 = ((var2 ) * (int32_t ) bme680_data .par_p6 ) / 4 ;
196
- var2 = var2 + ((var1 * (int32_t ) bme680_data .par_p5 ) * 2 );
197
- var2 = (var2 / 4 ) + ((int32_t ) bme680_data .par_p4 * 65536 );
198
- var1 = ((var1 / 4 ) * (var1 / 4 )) / 8192 ;
199
- var1 = (((var1 ) * ((int32_t ) bme680_data .par_p3 * 32 )) / 8 ) + (((int32_t ) bme680_data .par_p2 * var1 ) / 2 );
200
- var1 = var1 / 262144 ;
201
- var1 = ((32768 + var1 ) * (int32_t ) bme680_data .par_p1 ) / 32768 ;
202
- calc_pres = (int32_t ) (1048576 - pres_adc );
203
- calc_pres = (int32_t ) ((calc_pres - (var2 / 4096 )) * (3125 ));
204
- calc_pres = ((calc_pres / var1 ) * 2 );
205
- var1 = ((int32_t ) bme680_data .par_p9 * (int32_t ) (((calc_pres / 8 ) * (calc_pres / 8 )) / 8192 )) / 4096 ;
206
- var2 = ((int32_t ) (calc_pres / 4 ) * (int32_t ) bme680_data .par_p8 ) / 8192 ;
207
- var3 = ((int32_t ) (calc_pres / 256 ) * (int32_t ) (calc_pres / 256 ) * (int32_t ) (calc_pres / 256 )
208
- * (int32_t ) bme680_data .par_p10 ) / 131072 ;
209
- calc_pres = (int32_t ) (calc_pres ) + ((var1 + var2 + var3 + ((int32_t ) bme680_data .par_p7 * 128 )) / 16 );
210
-
211
- return (uint32_t ) calc_pres ;
185
+ int32_t pressure_comp ;
186
+
187
+ var1 = (((int32_t )bme680_data .t_fine ) >> 1 ) - 64000 ;
188
+ var2 = ((((var1 >> 2 ) * (var1 >> 2 )) >> 11 ) *
189
+ (int32_t )bme680_data .par_p6 ) >> 2 ;
190
+ var2 = var2 + ((var1 * (int32_t )bme680_data .par_p5 ) << 1 );
191
+ var2 = (var2 >> 2 ) + ((int32_t )bme680_data .par_p4 << 16 );
192
+ var1 = (((((var1 >> 2 ) * (var1 >> 2 )) >> 13 ) *
193
+ ((int32_t )bme680_data .par_p3 << 5 )) >> 3 ) +
194
+ (((int32_t )bme680_data .par_p2 * var1 ) >> 1 );
195
+ var1 = var1 >> 18 ;
196
+ var1 = ((32768 + var1 ) * (int32_t )bme680_data .par_p1 ) >> 15 ;
197
+ pressure_comp = 1048576 - pres_adc ;
198
+ pressure_comp = (int32_t )((pressure_comp - (var2 >> 12 )) * ((uint32_t )3125 ));
199
+ if (pressure_comp >= BME680_MAX_OVERFLOW_VAL )
200
+ pressure_comp = ((pressure_comp / var1 ) << 1 );
201
+ else
202
+ pressure_comp = ((pressure_comp << 1 ) / var1 );
203
+ var1 = ((int32_t )bme680_data .par_p9 * (int32_t )(((pressure_comp >> 3 ) *
204
+ (pressure_comp >> 3 )) >> 13 )) >> 12 ;
205
+ var2 = ((int32_t )(pressure_comp >> 2 ) *
206
+ (int32_t )bme680_data .par_p8 ) >> 13 ;
207
+ var3 = ((int32_t )(pressure_comp >> 8 ) * (int32_t )(pressure_comp >> 8 ) *
208
+ (int32_t )(pressure_comp >> 8 ) *
209
+ (int32_t )bme680_data .par_p10 ) >> 17 ;
210
+
211
+ pressure_comp = (int32_t )(pressure_comp ) + ((var1 + var2 + var3 +
212
+ ((int32_t )bme680_data .par_p7 << 7 )) >> 4 );
213
+
214
+ return (uint32_t )pressure_comp ;
215
+
212
216
}
213
217
214
218
static uint32_t calc_humidity (uint16_t hum_adc )
@@ -222,19 +226,19 @@ static uint32_t calc_humidity(uint16_t hum_adc)
222
226
int32_t temp_scaled ;
223
227
int32_t calc_hum ;
224
228
225
- temp_scaled = (((int32_t ) bme680_data .t_fine * 5 ) + 128 ) / 256 ;
229
+ temp_scaled = (((int32_t ) bme680_data .t_fine * 5 ) + 128 ) >> 8 ;
226
230
var1 = (int32_t ) (hum_adc - ((int32_t ) ((int32_t ) bme680_data .par_h1 * 16 )))
227
- - (((temp_scaled * (int32_t ) bme680_data .par_h3 ) / ((int32_t ) 100 )) / 2 );
231
+ - (((temp_scaled * (int32_t ) bme680_data .par_h3 ) / ((int32_t ) 100 )) >> 1 );
228
232
var2 = ((int32_t ) bme680_data .par_h2
229
- * (((temp_scaled * (int32_t ) bme680_data .par_h4 ) / ((int32_t ) 100 ))
230
- + (((temp_scaled * ((temp_scaled * (int32_t ) bme680_data .par_h5 ) / ((int32_t ) 100 ))) / 64 )
231
- / ((int32_t ) 100 )) + (int32_t ) (1 * 16384 ))) / 1024 ;
233
+ * (((temp_scaled * (int32_t ) bme680_data .par_h4 ) / ((int32_t ) 100 ))
234
+ + (((temp_scaled * ((temp_scaled * (int32_t ) bme680_data .par_h5 ) / ((int32_t ) 100 ))) >> 6 )
235
+ / ((int32_t ) 100 )) + (int32_t ) (1 << 14 ))) >> 10 ;
232
236
var3 = var1 * var2 ;
233
- var4 = (int32_t ) bme680_data .par_h6 * 128 ;
234
- var4 = ((var4 ) + ((temp_scaled * (int32_t ) bme680_data .par_h7 ) / ((int32_t ) 100 ))) / 16 ;
235
- var5 = ((var3 / 16384 ) * (var3 / 16384 )) / 1024 ;
236
- var6 = (var4 * var5 ) / 2 ;
237
- calc_hum = (((var3 + var6 ) / 1024 ) * ((int32_t ) 1000 )) / 4096 ;
237
+ var4 = (int32_t ) bme680_data .par_h6 << 7 ;
238
+ var4 = ((var4 ) + ((temp_scaled * (int32_t ) bme680_data .par_h7 ) / ((int32_t ) 100 ))) >> 4 ;
239
+ var5 = ((var3 >> 14 ) * (var3 >> 14 )) >> 10 ;
240
+ var6 = (var4 * var5 ) >> 1 ;
241
+ calc_hum = (((var3 + var6 ) >> 10 ) * ((int32_t ) 1000 )) >> 12 ;
238
242
239
243
if (calc_hum > 100000 ) /* Cap at 100%rH */
240
244
calc_hum = 100000 ;
@@ -244,21 +248,36 @@ static uint32_t calc_humidity(uint16_t hum_adc)
244
248
return (uint32_t ) calc_hum ;
245
249
}
246
250
251
+
252
+ /**static variables */
253
+ /**Look up table 1 for the possible gas range values */
254
+ uint32_t lookupTable1 [16 ] = { UINT32_C (2147483647 ), UINT32_C (2147483647 ), UINT32_C (2147483647 ), UINT32_C (2147483647 ),
255
+ UINT32_C (2147483647 ), UINT32_C (2126008810 ), UINT32_C (2147483647 ), UINT32_C (2130303777 ),
256
+ UINT32_C (2147483647 ), UINT32_C (2147483647 ), UINT32_C (2143188679 ), UINT32_C (2136746228 ),
257
+ UINT32_C (2147483647 ), UINT32_C (2126008810 ), UINT32_C (2147483647 ), UINT32_C (2147483647 ) };
258
+ /**Look up table 2 for the possible gas range values */
259
+ uint32_t lookupTable2 [16 ] = { UINT32_C (4096000000 ), UINT32_C (2048000000 ), UINT32_C (1024000000 ), UINT32_C (512000000 ),
260
+ UINT32_C (255744255 ), UINT32_C (127110228 ), UINT32_C (64000000 ), UINT32_C (32258064 ), UINT32_C (16016016 ),
261
+ UINT32_C (8000000 ), UINT32_C (4000000 ), UINT32_C (2000000 ), UINT32_C (1000000 ), UINT32_C (500000 ),
262
+ UINT32_C (250000 ), UINT32_C (125000 ) };
263
+
247
264
static uint32_t calc_gas_resistance (uint16_t gas_res_adc , uint8_t gas_range )
248
265
{
249
266
int64_t var1 ;
250
267
uint64_t var2 ;
251
268
int64_t var3 ;
252
269
uint32_t calc_gas_res ;
253
270
254
- var1 = (int64_t ) ((1340 + (5 * (int64_t ) bme680_data .range_sw_err )) * ((int64_t ) lookupTable1 [gas_range ])) / 65536 ;
255
- var2 = (((int64_t ) ((int64_t ) gas_res_adc * 32768 ) - (int64_t ) (16777216 )) + var1 );
256
- var3 = (((int64_t ) lookupTable2 [gas_range ] * (int64_t ) var1 ) / 512 );
257
- calc_gas_res = (uint32_t ) ((var3 + ((int64_t ) var2 / 2 )) / (int64_t ) var2 );
271
+ var1 = (int64_t ) ((1340 + (5 * (int64_t ) bme680_data .range_sw_err )) *
272
+ ((int64_t ) lookupTable1 [gas_range ])) >> 16 ;
273
+ var2 = (((int64_t ) ((int64_t ) gas_res_adc << 15 ) - (int64_t ) (16777216 )) + var1 );
274
+ var3 = (((int64_t ) lookupTable2 [gas_range ] * (int64_t ) var1 ) >> 9 );
275
+ calc_gas_res = (uint32_t ) ((var3 + ((int64_t ) var2 >> 1 )) / (int64_t ) var2 );
258
276
259
277
return calc_gas_res ;
260
278
}
261
279
280
+
262
281
uint16_t calc_dur ()
263
282
{
264
283
uint32_t tph_dur ; /* Calculate in us */
0 commit comments