@@ -128,7 +128,34 @@ package body BME280 is
128
128
129
129
Value.T3 := Unsigned_16 (Data (16#8C# )) +
130
130
Shift_Left (Unsigned_16 (Data (16#8D# )), 8 );
131
+
132
+ Value.H1 := Unsigned_8 (Data (16#A1# ));
133
+ end ;
134
+
135
+ declare
136
+ use type HAL.UInt8;
137
+ Data : HAL.UInt8_Array (16#E1# .. 16#E7# );
138
+ begin
139
+ Read (Data, Success);
140
+
141
+ if not Success then
142
+ return ;
143
+ end if ;
144
+
145
+ Value.H2 := Unsigned_16 (Data (16#E1# )) +
146
+ Shift_Left (Unsigned_16 (Data (16#E2# )), 8 );
147
+
148
+ Value.H3 := Unsigned_8 (Data (16#E3# ));
149
+
150
+ Value.H4 := Shift_Left (Unsigned_16 (Data (16#E4# )), 4 ) +
151
+ Unsigned_16 (Data (16#E5# ) and 16#0F# );
152
+
153
+ Value.H5 := Shift_Right (Unsigned_16 (Data (16#E5# )), 4 ) +
154
+ Shift_Left (Unsigned_16 (Data (16#E6# )), 4 );
155
+
156
+ Value.H6 := Unsigned_8 (Data (16#E7# ));
131
157
end ;
158
+
132
159
end Read_Calibration ;
133
160
134
161
-- --------------------
@@ -196,6 +223,46 @@ package body BME280 is
196
223
197
224
end Generic_Sensor ;
198
225
226
+ -- ------------
227
+ -- Humidity --
228
+ -- ------------
229
+
230
+ function Humidity
231
+ (Value : Measurement;
232
+ Temperature : Deci_Celsius;
233
+ Calibration : Calibration_Constants) return Relative_Humidity
234
+ is
235
+ Var_1 : constant Integer :=
236
+ Integer (Temperature / Deci_Celsius'Small) - 76800 ;
237
+ Var_2 : Integer := Integer (Value.Raw_Hum) * 16384 ;
238
+ Var_3 : Integer := Integer (Calibration.H4) * 1048576 ;
239
+ Var_4 : Integer := Integer (Calibration.H5) * Var_1;
240
+ Var_5 : Integer := (Var_2 - Var_3 - Var_4 + 16384 ) / 32768 ;
241
+
242
+ begin
243
+ -- var2 = (var1 * ((int32_t)calib_data->dig_h6)) / 1024;
244
+ Var_2 := Var_1 * Integer (Calibration.H6) / 1024 ;
245
+ -- var3 = (var1 * ((int32_t)calib_data->dig_h3)) / 2048;
246
+ Var_3 := Var_1 * Integer (Calibration.H3) / 2048 ;
247
+ -- var4 = ((var2 * (var3 + (int32_t)32768)) / 1024) + (int32_t)2097152;
248
+ Var_4 := Var_2 * (Var_3 + 32768 ) / 1024 + 2097152 ;
249
+ -- var2 = ((var4 * ((int32_t)calib_data->dig_h2)) + 8192) / 16384;
250
+ Var_2 := (Var_4 * Integer (Calibration.H2) + 8192 ) / 16384 ;
251
+ -- var3 = var5 * var2;
252
+ Var_3 := Var_5 * Var_2;
253
+ -- var4 = ((var3 / 32768) * (var3 / 32768)) / 128;
254
+ Var_4 := (Var_3 / 32768 )**2 / 128 ;
255
+ -- var5 = var3 - ((var4 * ((int32_t)calib_data->dig_h1)) / 16);
256
+ Var_5 := Var_3 - Var_4 * Integer (Calibration.H1) / 16 ;
257
+ Var_5 := Integer'Max (0 , Integer'Min (100 * 2 ** 10 , Var_5 / 4096 ));
258
+
259
+ return Relative_Humidity'Small * Var_5;
260
+ end Humidity ;
261
+
262
+ -- ---------------
263
+ -- Temperature --
264
+ -- ---------------
265
+
199
266
function Temperature
200
267
(Value : Measurement;
201
268
Calibration : Calibration_Constants) return Deci_Celsius
@@ -207,7 +274,7 @@ package body BME280 is
207
274
(Diff * Integer (Calibration.T2)) / 2 ** 11 ;
208
275
209
276
Val_2 : constant Integer :=
210
- (Diff / 2 ) ** 2 / 2 ** 11 * Integer (Calibration.T3) / 2 ** 14 ;
277
+ (Diff / 2 ) ** 2 / 2 ** 12 * Integer (Calibration.T3) / 2 ** 14 ;
211
278
212
279
begin
213
280
return Deci_Celsius'Small * (Val_1 + Val_2);
0 commit comments