M5Unit-ENV 1.2.0 git rev:d576302
Loading...
Searching...
No Matches
unit_BME688.hpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2024 M5Stack Technology CO LTD
3 *
4 * SPDX-License-Identifier: MIT
5 */
10#ifndef M5_UNIT_ENV_UNIT_BME688_HPP
11#define M5_UNIT_ENV_UNIT_BME688_HPP
12
13#if (defined(ESP_PLATFORM) && (!defined(CONFIG_IDF_TARGET_ESP32C6) && \
14 (!defined(ARDUINO_M5Stack_NanoC6) && !defined(ARDUINO_M5STACK_NANOC6)))) || \
15 defined(DOXYGEN_PROCESS)
16#pragma message "Using BSEC2"
17#define UNIT_BME688_USING_BSEC2
18#endif
19
20#include <M5UnitComponent.hpp>
21#include <m5_utility/stl/extension.hpp>
22
23#if defined(ARDUINO)
24#include <bme68xLibrary.h>
25#else
26#include <bme68x/bme68x.h>
27#endif
28
29#if defined(UNIT_BME688_USING_BSEC2)
30#if defined(ARDUINO)
31#include <bsec2.h>
32#else
33#include <inc/bsec_datatypes.h>
34#endif
35
36#endif
37#include <memory>
38#include <limits>
39#include <initializer_list>
40
41namespace m5 {
42namespace unit {
43
44namespace bme688 {
45
50enum class Mode : uint8_t {
51 Sleep,
52 Forced,
53 Parallel,
56};
57
60
64using bme68xData = struct bme68x_data;
69using bme68xDev = struct bme68x_dev;
74using bme68xConf = struct bme68x_conf;
80struct bme68xHeatrConf : bme68x_heatr_conf {
81 uint16_t temp_prof[10]{};
82 uint16_t dur_prof[10]{};
83 bme68xHeatrConf() : bme68x_heatr_conf()
84 {
85 heatr_temp_prof = temp_prof;
86 heatr_dur_prof = dur_prof;
87 }
88};
93using bme68xCalibration = struct bme68x_calib_data;
95
100enum class Oversampling : uint8_t {
101 None,
102 x1,
103 x2,
104 x4,
105 x8,
106 x16,
107};
108
113enum class Filter : uint8_t {
114 None,
115 Coeff_1,
116 Coeff_3,
117 Coeff_7,
118 Coeff_15,
119 Coeff_31,
120 Coeff_63,
121 Coeff_127,
122};
123
128enum class ODR : uint8_t {
129 MS_0_59, //< 0.59 ms
130 MS_62_5, //< 62.5 ms
131 MS_125, //< 125 ms
132 MS_250,
133 MS_500,
134 MS_1000,
135 MS_10,
136 MS_20,
137 None,
138};
139
145struct GasWait {
146 GasWait() : value{0}
147 {
148 }
153 enum class Factor { x1, x4, x16, x64 };
156 inline uint8_t step() const
157 {
158 return value & 0x3F;
159 }
160 inline Factor factor() const
161 {
162 return static_cast<Factor>((value >> 6) & 0x03);
163 }
165
168 inline void step(const uint8_t s)
169 {
170 value = (value & ~0x3F) | (s & 0x3F);
171 }
172 inline void factor(const Factor f)
173 {
174 value = (value & ~(0x03 << 6)) | (m5::stl::to_underlying(f) << 6);
175 }
177
180 static uint8_t from(const uint16_t duration)
181 {
182 uint8_t f{};
183 uint16_t d{duration};
184 while (d > 0x3F) {
185 d >>= 2;
186 ++f;
187 }
188 return (f <= 0x03) ? ((uint8_t)d | (f << 6)) : 0xFF;
189 }
192 static uint16_t to(const uint8_t v)
193 {
194 constexpr uint16_t tbl[] = {1, 4, 16, 64};
195 return (v & 0x3F) * tbl[(v >> 6) & 0x03];
196 }
197
198 uint8_t value{};
199};
200
201#if defined(UNIT_BME688_USING_BSEC2)
202namespace bsec2 {
203
208enum class SampleRate : uint8_t {
209 Disabled,
210 LowPower,
214 Scan,
215 Continuous,
216};
217
219template <typename T>
220void is_bsec_virtual_sensor_t()
221{
222 static_assert(std::is_same<T, bsec_virtual_sensor_t>::value, "Argument must be of type bsec_virtual_sensor_t");
223}
225
227inline uint32_t virtual_sensor_array_to_bits(const bsec_virtual_sensor_t* ss, const size_t len)
228{
229 uint32_t ret{};
230 for (size_t i = 0; i < len; ++i) {
231 ret |= ((uint32_t)1U) << ss[i];
232 }
233 return ret;
234}
235
239template <typename... Args>
240uint32_t subscribe_to_bits(Args... args)
241{
242 // In a C++17 or later environment, it can be written like this...
243 // static_assert(std::conjunction<std::is_same<Args, bsec_virtual_sensor_t>...>::value,
244 // "All arguments must be of type bsec_virtual_sensor_t");
245 int discard[] = {(is_bsec_virtual_sensor_t<Args>(), 0)...};
246 (void)discard;
247
248 bsec_virtual_sensor_t tmp[] = {args...};
249 constexpr size_t n = sizeof...(args);
250 return virtual_sensor_array_to_bits(tmp, n);
251}
252
253} // namespace bsec2
254#endif
255
260struct Data {
261 bme688::bme68xData raw{};
262#if defined(UNIT_BME688_USING_BSEC2)
263 bsecOutputs raw_outputs{};
264
265 float get(const bsec_virtual_sensor_t vs) const;
266 inline float iaq() const
267 {
268 return get(BSEC_OUTPUT_IAQ);
269 }
270 inline float static_iaq() const
271 {
272 return get(BSEC_OUTPUT_STATIC_IAQ);
273 }
274 inline float co2() const
275 {
276 return get(BSEC_OUTPUT_CO2_EQUIVALENT);
277 }
278 inline float voc() const
279 {
280 return get(BSEC_OUTPUT_BREATH_VOC_EQUIVALENT);
281 }
282 inline float temperature() const
283 {
284 return get(BSEC_OUTPUT_RAW_TEMPERATURE);
285 }
286 inline float pressure() const
287 {
288 return get(BSEC_OUTPUT_RAW_PRESSURE);
289 }
290 inline float humidity() const
291 {
292 return get(BSEC_OUTPUT_RAW_HUMIDITY);
293 }
294 inline float gas() const
295 {
296 return get(BSEC_OUTPUT_RAW_GAS);
297 }
298 inline bool gas_stabilization() const
299 {
300 return get(BSEC_OUTPUT_STABILIZATION_STATUS) == 1.0f;
301 }
302 inline bool gas_run_in_status() const
303 {
304 return get(BSEC_OUTPUT_RUN_IN_STATUS) == 1.0f;
305 }
306 inline float heat_compensated_temperature() const
307 {
308 return get(BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE);
309 }
310 inline float heat_compensated_humidity() const
311 {
312 return get(BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY);
313 }
314 inline float gas_percentage() const
315 {
316 return get(BSEC_OUTPUT_GAS_PERCENTAGE);
317 }
318 inline float gas_estimate_1() const
319 {
320 return get(BSEC_OUTPUT_GAS_ESTIMATE_1);
321 }
322 inline float gas_estimate_2() const
323 {
324 return get(BSEC_OUTPUT_GAS_ESTIMATE_2);
325 }
326 inline float gas_estimate_3() const
327 {
328 return get(BSEC_OUTPUT_GAS_ESTIMATE_3);
329 }
330 inline float gas_estimate_4() const
331 {
332 return get(BSEC_OUTPUT_GAS_ESTIMATE_4);
333 }
334 inline uint32_t gas_index() const
335 {
336 return get(BSEC_OUTPUT_RAW_GAS_INDEX);
337 }
338 inline float regression_estimate_1() const
339 {
340 return get(BSEC_OUTPUT_REGRESSION_ESTIMATE_1);
341 }
342 inline float regression_estimate_2() const
343 {
344 return get(BSEC_OUTPUT_REGRESSION_ESTIMATE_2);
345 }
346 inline float regression_estimate_3() const
347 {
348 return get(BSEC_OUTPUT_REGRESSION_ESTIMATE_3);
349 }
350 inline float regression_estimate_4() const
351 {
352 return get(BSEC_OUTPUT_REGRESSION_ESTIMATE_4);
353 }
354#endif
355 inline float raw_temperature() const
356 {
357 return raw.temperature;
358 }
359 inline float raw_pressure() const
360 {
361 return raw.pressure;
362 }
363 inline float raw_humidity() const
364 {
365 return raw.humidity;
366 }
367 inline float raw_gas() const
368 {
369 return raw.gas_resistance;
370 }
371};
372
373} // namespace bme688
374
381class UnitBME688 : public Component, public PeriodicMeasurementAdapter<UnitBME688, bme688::Data> {
382 M5_UNIT_COMPONENT_HPP_BUILDER(UnitBME688, 0x77);
383
384public:
389 struct config_t {
391 bool start_periodic{true};
394#if defined(UNIT_BME688_USING_BSEC2) || defined(DOXYGEN_PROCESS)
397
398 uint32_t subscribe_bits{1U << BSEC_OUTPUT_IAQ | 1U << BSEC_OUTPUT_RAW_TEMPERATURE |
399 1U << BSEC_OUTPUT_RAW_PRESSURE | 1U << BSEC_OUTPUT_RAW_HUMIDITY |
400 1U << BSEC_OUTPUT_RAW_GAS | 1U << BSEC_OUTPUT_STABILIZATION_STATUS |
401 1U << BSEC_OUTPUT_RUN_IN_STATUS};
407 bme688::bsec2::SampleRate sample_rate{bme688::bsec2::SampleRate::LowPower};
408#endif
409#if !defined(UNIT_BME688_USING_BSEC2) || defined(DOXYGEN_PROCESS)
412
413 bme688::Mode mode{bme688::Mode::Forced};
419 bme688::Oversampling oversampling_humidity{bme688::Oversampling::x16};
421 bme688::Filter filter{bme688::Filter::None};
423 bme688::ODR odr{bme688::ODR::None};
425 bool heater_enable{true};
427 uint16_t heater_temperature{300};
429 uint16_t heater_duration{100};
431#endif
432 };
433
436
438 {
439 return _cfg;
440 }
442 inline void config(const config_t& cfg)
443 {
444 _cfg = cfg;
445 }
447
448 explicit UnitBME688(const uint8_t addr = DEFAULT_ADDRESS);
449 virtual ~UnitBME688()
450 {
451 }
452
453 virtual bool begin() override;
454 virtual void update(const bool force = false) override;
455
459 inline bme688::Mode mode() const
460 {
461 return _mode;
462 }
465 {
466 return _dev.calib;
467 }
469 inline const bme688::bme68xConf& tphSetting() const
470 {
471 return _tphConf;
472 }
475 {
476 return _heaterConf;
477 }
479 inline int8_t ambientTemperature() const
480 {
481 return _dev.amb_temp;
482 }
484
487#if defined(UNIT_BME688_USING_BSEC2)
492 inline float iaq() const
493 {
494 return !empty() ? oldest().iaq() : std::numeric_limits<float>::quiet_NaN();
495 }
497 inline float temperature() const
498 {
499 return !empty() ? oldest().temperature() : std::numeric_limits<float>::quiet_NaN();
500 }
502 inline float pressure() const
503 {
504 return !empty() ? oldest().pressure() : std::numeric_limits<float>::quiet_NaN();
505 }
507 inline float humidity() const
508 {
509 return !empty() ? oldest().humidity() : std::numeric_limits<float>::quiet_NaN();
510 }
512 inline float gas() const
513 {
514 return !empty() ? oldest().gas() : std::numeric_limits<float>::quiet_NaN();
515 }
516#else
518 inline float temperature() const
519 {
520 return !empty() ? oldest().raw_temperature() : std::numeric_limits<float>::quiet_NaN();
521 }
523 inline float pressure() const
524 {
525 return !empty() ? oldest().raw_pressure() : std::numeric_limits<float>::quiet_NaN();
526 }
528 inline float humidity() const
529 {
530 return !empty() ? oldest().raw_humidity() : std::numeric_limits<float>::quiet_NaN();
531 }
533 inline float gas() const
534 {
535 return !empty() ? oldest().raw_gas() : std::numeric_limits<float>::quiet_NaN();
536 }
537#endif
539
540#if 0
546 inline uint8_t numberOfRawData() const
547 {
548 return _num_of_data;
549 }
557 inline const bme688::bme68xData* data(const uint8_t idx)
558 {
559 return (idx < _num_of_data) ? &_raw_data[idx] : nullptr;
560 }
561#endif
562
564 inline void setAambientTemperature(const int8_t temp)
565 {
566 _dev.amb_temp = temp;
567 }
590 bool readUniqueID(uint32_t& id);
595 bool softReset();
600 bool selfTest();
606 bool writeMode(const bme688::Mode m);
612 bool readMode(bme688::Mode& m);
613
616
651 bool writeTPHSetting(const bme688::bme68xConf& s);
682 bool writeIIRFilter(const bme688::Filter f);
684
687
702
705
713 {
714 return PeriodicMeasurementAdapter<UnitBME688, bme688::Data>::startPeriodicMeasurement(m);
715 }
716#if defined(UNIT_BME688_USING_BSEC2) || defined(DOXYGEN_PROCESS)
723 inline bool startPeriodicMeasurement(const uint32_t subscribe_bits,
724 const bme688::bsec2::SampleRate sr = bme688::bsec2::SampleRate::LowPower)
725 {
726 return PeriodicMeasurementAdapter<UnitBME688, bme688::Data>::startPeriodicMeasurement(subscribe_bits, sr);
727 }
735 inline bool startPeriodicMeasurement(const bsec_virtual_sensor_t* ss, const size_t len,
736 const bme688::bsec2::SampleRate sr = bme688::bsec2::SampleRate::LowPower)
737 {
738 return ss ? startPeriodicMeasurement(bme688::bsec2::virtual_sensor_array_to_bits(ss, len), sr) : false;
739 }
740
741#endif
747 {
748 return PeriodicMeasurementAdapter<UnitBME688, bme688::Data>::stopPeriodicMeasurement();
749 }
751
754
764
765#if defined(UNIT_BME688_USING_BSEC2) || defined(DOXYGEN_PROCESS)
769
773 {
774 return _temperatureOffset;
775 }
780 void bsec2SetTemperatureOffset(const float offset)
781 {
782 _temperatureOffset = offset;
783 }
789 const bsec_version_t& bsec2Version() const
790 {
791 return _bsec2_version;
792 }
801 bool bsec2SetConfig(const uint8_t* cfg, const size_t sz = BSEC_MAX_PROPERTY_BLOB_SIZE);
809 bool bsec2GetConfig(uint8_t* cfg, uint32_t& actualSize);
815 bool bsec2SetState(const uint8_t* state);
823 bool bsec2GetState(uint8_t* state, uint32_t& actualSize);
832 bool bsec2UpdateSubscription(const uint32_t sensorBits, const bme688::bsec2::SampleRate sr);
842 inline bool bsec2UpdateSubscription(const bsec_virtual_sensor_t* ss, const size_t len,
844 {
845 return bsec2UpdateSubscription(bme688::bsec2::virtual_sensor_array_to_bits(ss, len), sr);
846 }
852 inline bool bsec2IsSubscribed(const bsec_virtual_sensor_t id)
853 {
854 return _bsec2_subscription & (1U << id);
855 }
861 uint32_t bsec2Subscription() const
862 {
863 return _bsec2_subscription;
864 }
871 bool bsec2Subscribe(const bsec_virtual_sensor_t id);
877 bool bsec2Unsubscribe(const bsec_virtual_sensor_t id);
882 bool bsec2UnsubscribeAll();
884#endif
885
886protected:
887 static int8_t read_function(uint8_t reg_addr, uint8_t* reg_data, uint32_t length, void* intf_ptr);
888 static int8_t write_function(uint8_t reg_addr, const uint8_t* reg_data, uint32_t length, void* intf_ptr);
889
890 bool start_periodic_measurement(const bme688::Mode m);
891 bool stop_periodic_measurement();
892#if defined(UNIT_BME688_USING_BSEC2)
893 bool start_periodic_measurement(const uint32_t subscribe_bits, const bme688::bsec2::SampleRate sr);
894#endif
895
896 bool write_mode_forced();
897 bool write_mode_parallel();
898 bool fetch_data();
899
900 void update_bme688(const bool force);
901 bool read_measurement();
902#if defined(UNIT_BME688_USING_BSEC2)
903 bool process_data(bsecOutputs& outouts, const int64_t ns, const bme688::bme68xData& data);
904 void update_bsec2(const bool force);
905#endif
906
907 inline virtual bool in_periodic() const override
908 {
909 return _periodic || (_bsec2_subscription != 0);
910 }
911
912 M5_UNIT_COMPONENT_PERIODIC_MEASUREMENT_ADAPTER_HPP_BUILDER(UnitBME688, bme688::Data);
913
914protected:
915 bme688::Mode _mode{bme688::Mode::Sleep};
916
917 // bme68x
918 bme688::bme68xData _raw_data[3]{}; // latest data
919 uint8_t _num_of_data{};
920 bme688::bme68xDev _dev{};
921 bme688::bme68xConf _tphConf{};
922 bme688::bme68xHeatrConf _heaterConf{};
923
924 // BSEC2
925 uint32_t _bsec2_subscription{}; // Enabled virtual sensor bit
926
927#if defined(UNIT_BME688_USING_BSEC2)
928 bsec_version_t _bsec2_version{};
929 std::unique_ptr<uint8_t> _bsec2_work{};
930 bsec_bme_settings_t _bsec2_settings{};
931
932 bme688::Mode _bsec2_mode{};
933 bme688::bsec2::SampleRate _bsec2_sr{};
934
935 bsecOutputs _outputs{};
936 float _temperatureOffset{};
937#endif
938
939 std::unique_ptr<m5::container::CircularBuffer<bme688::Data>> _data{};
940
941 bool _waiting{};
942 types::elapsed_time_t _can_measure_time{};
943
944 config_t _cfg{};
945};
946
948namespace bme688 {
949namespace command {
950constexpr uint8_t CHIP_ID{0xD0};
951constexpr uint8_t RESET{0xE0};
952constexpr uint8_t VARIANT_ID{0xF0};
953
954constexpr uint8_t IDAC_HEATER_0{0x50}; // ...9
955constexpr uint8_t RES_HEAT_0{0x5A}; // ...9
956constexpr uint8_t GAS_WAIT_0{0x64}; // ...9
957constexpr uint8_t GAS_WAIT_SHARED{0x6E};
958
959constexpr uint8_t CTRL_GAS_0{0x70};
960constexpr uint8_t CTRL_GAS_1{0x71};
961constexpr uint8_t CTRL_HUMIDITY{0x72};
962constexpr uint8_t CTRL_MEASUREMENT{0x74};
963constexpr uint8_t CONFIG{0x75};
964
965constexpr uint8_t MEASUREMENT_STATUS_0{0x1D};
966constexpr uint8_t MEASUREMENT_STATUS_1{0x2E};
967constexpr uint8_t MEASUREMENT_STATUS_2{0x3F};
968
969constexpr uint8_t MEASUREMENT_GROUP_INDEX_0{0x1F};
970constexpr uint8_t MEASUREMENT_GROUP_INDEX_1{0x30};
971constexpr uint8_t MEASUREMENT_GROUP_INDEX_2{0x41};
972
973constexpr uint8_t UNIQUE_ID{0x83};
974
975// calibration
976constexpr uint8_t CALIBRATION_GROUP_0{0x8A};
977constexpr uint8_t CALIBRATION_GROUP_1{0xE1};
978constexpr uint8_t CALIBRATION_GROUP_2{0x00};
979constexpr uint8_t CALIBRATION_TEMPERATURE_1_LOW{0xE9};
980constexpr uint8_t CALIBRATION_TEMPERATURE_2_LOW{0x8A};
981constexpr uint8_t CALIBRATION_TEMPERATURE_3{0x8C};
982constexpr uint8_t CALIBRATION_PRESSURE_1_LOW{0x8E};
983constexpr uint8_t CALIBRATION_PRESSURE_2_LOW{0x90};
984constexpr uint8_t CALIBRATION_PRESSURE_3{0x92};
985constexpr uint8_t CALIBRATION_PRESSURE_4_LOW{0x94};
986constexpr uint8_t CALIBRATION_PRESSURE_5_LOW{0x96};
987constexpr uint8_t CALIBRATION_PRESSURE_6{0x99};
988constexpr uint8_t CALIBRATION_PRESSURE_7{0x98};
989constexpr uint8_t CALIBRATION_PRESSURE_8_LOW{0x9C};
990constexpr uint8_t CALIBRATION_PRESSURE_9_LOW{0x9E};
991constexpr uint8_t CALIBRATION_PRESSURE_10{0xA0};
992constexpr uint8_t CALIBRATION_HUMIDITY_12{0xE2};
993constexpr uint8_t CALIBRATION_HUMIDITY_1_HIGH{0xE3};
994constexpr uint8_t CALIBRATION_HUMIDITY_2_HIGH{0xE1};
995constexpr uint8_t CALIBRATION_HUMIDITY_3{0xE4};
996constexpr uint8_t CALIBRATION_HUMIDITY_4{0xE5};
997constexpr uint8_t CALIBRATION_HUMIDITY_5{0xE6};
998constexpr uint8_t CALIBRATION_HUMIDITY_6{0xE7};
999constexpr uint8_t CALIBRATION_HUMIDITY_7{0xE8};
1000constexpr uint8_t CALIBRATION_GAS_1{0xED};
1001constexpr uint8_t CALIBRATION_GAS_2_LOW{0xEB};
1002constexpr uint8_t CALIBRATION_GAS_3{0xEE};
1003constexpr uint8_t CALIBRATION_RES_HEAT_RANGE{0x02}; // [5:4]
1004constexpr uint8_t CALIBRATION_RES_HEAT_VAL{0x00};
1005
1006} // namespace command
1007} // namespace bme688
1009
1010} // namespace unit
1011} // namespace m5
1012#endif
BME688 unit.
Definition unit_BME688.hpp:381
void config(const config_t &cfg)
Set the configration.
Definition unit_BME688.hpp:442
bool bsec2Unsubscribe(const bsec_virtual_sensor_t id)
Unsubscribe virtual sensor.
Definition unit_BME688.cpp:870
bool writeIIRFilter(const bme688::Filter f)
Write IIRFilter.
Definition unit_BME688.cpp:646
bool bsec2UpdateSubscription(const bsec_virtual_sensor_t *ss, const size_t len, const bme688::bsec2::SampleRate sr)
Subscribe to library virtual sensors outputs.
Definition unit_BME688.hpp:842
bool readHeaterSetting(bme688::bme68xHeatrConf &hs)
Read heater setting.
Definition unit_BME688.cpp:659
bool bsec2SetState(const uint8_t *state)
Restore the internal state.
Definition unit_BME688.cpp:817
bool readOversamplingPressure(bme688::Oversampling &os)
Read pressure oversampling.
Definition unit_BME688.cpp:557
const bsec_version_t & bsec2Version() const
Gets the BSEC2 library version.
Definition unit_BME688.hpp:789
void setAambientTemperature(const int8_t temp)
Sets the ambient temperature.
Definition unit_BME688.hpp:564
bool readIIRFilter(bme688::Filter &f)
Read IIRFilter.
Definition unit_BME688.cpp:579
bool writeCalibration(const bme688::bme68xCalibration &c)
write calibration
Definition unit_BME688.cpp:480
bool readUniqueID(uint32_t &id)
Read unique ID.
Definition unit_BME688.cpp:407
float bsec2GetTemperatureOffset() const
Gets the temperature offset(Celsius)
Definition unit_BME688.hpp:772
bool measureSingleShot(bme688::bme68xData &data)
Take a single measurement.
Definition unit_BME688.cpp:693
bool bsec2GetState(uint8_t *state, uint32_t &actualSize)
Retrieve the current internal library state.
Definition unit_BME688.cpp:811
float gas() const
Oldest measured gas (Ohm)
Definition unit_BME688.hpp:512
bool softReset()
Software reset.
Definition unit_BME688.cpp:421
bool startPeriodicMeasurement(const bsec_virtual_sensor_t *ss, const size_t len, const bme688::bsec2::SampleRate sr=bme688::bsec2::SampleRate::LowPower)
Start periodic measurement using BSEC2.
Definition unit_BME688.hpp:735
bool bsec2IsSubscribed(const bsec_virtual_sensor_t id)
is virtual sensor Subscribed?
Definition unit_BME688.hpp:852
const bme688::bme68xConf & tphSetting() const
Gets the TPH setting.
Definition unit_BME688.hpp:469
bool readMode(bme688::Mode &m)
Read operation mode.
Definition unit_BME688.cpp:682
bool bsec2UpdateSubscription(const uint32_t sensorBits, const bme688::bsec2::SampleRate sr)
Subscribe to library virtual sensors outputs.
Definition unit_BME688.cpp:823
bool selfTest()
Self-test.
Definition unit_BME688.cpp:428
bme688::Mode mode() const
Current mode.
Definition unit_BME688.hpp:459
bool readOversamplingHumidity(bme688::Oversampling &os)
Read humidity oversampling.
Definition unit_BME688.cpp:568
bool readOversamplingTemperature(bme688::Oversampling &os)
Read temperature oversampling.
Definition unit_BME688.cpp:546
bool writeOversamplingTemperature(const bme688::Oversampling os)
Write temperature oversampling.
Definition unit_BME688.cpp:607
float iaq() const
Oldest measured IAQ.
Definition unit_BME688.hpp:492
bool writeTPHSetting(const bme688::bme68xConf &s)
Write TPH setting.
Definition unit_BME688.cpp:536
bool bsec2GetConfig(uint8_t *cfg, uint32_t &actualSize)
Retrieve the current library configuration.
Definition unit_BME688.cpp:796
bool writeMode(const bme688::Mode m)
Write operation mode.
Definition unit_BME688.cpp:673
void bsec2SetTemperatureOffset(const float offset)
Set the temperature offset(Celsius)
Definition unit_BME688.hpp:780
bool bsec2SetConfig(const uint8_t *cfg, const size_t sz=BSEC_MAX_PROPERTY_BLOB_SIZE)
Update algorithm configuration parameters Update bsec2 configuration settings.
Definition unit_BME688.cpp:802
bool writeOversamplingHumidity(const bme688::Oversampling os)
Write humidity oversampling.
Definition unit_BME688.cpp:633
bool writeOversamplingPressure(const bme688::Oversampling os)
Write pressure oversampling.
Definition unit_BME688.cpp:620
bool bsec2Subscribe(const bsec_virtual_sensor_t id)
Subscribe virtual sensor.
Definition unit_BME688.cpp:856
bool startPeriodicMeasurement(const bme688::Mode m)
Start periodic measurement without BSEC2.
Definition unit_BME688.hpp:712
bool writeHeaterSetting(const bme688::Mode mode, const bme688::bme68xHeatrConf &hs)
Write heater setting.
Definition unit_BME688.cpp:664
bool startPeriodicMeasurement(const uint32_t subscribe_bits, const bme688::bsec2::SampleRate sr=bme688::bsec2::SampleRate::LowPower)
Start periodic measurement using BSEC2.
Definition unit_BME688.hpp:723
const bme688::bme68xCalibration & calibration() const
Gets the Calibration.
Definition unit_BME688.hpp:464
bool readCalibration(bme688::bme68xCalibration &c)
Read calibration.
Definition unit_BME688.cpp:433
bool bsec2UnsubscribeAll()
Unsubacribe currentt all sensors.
Definition unit_BME688.cpp:884
uint32_t bsec2Subscription() const
Gets the subscription bits.
Definition unit_BME688.hpp:861
float pressure() const
Oldest measured pressure (Pa)
Definition unit_BME688.hpp:502
const bme688::bme68xHeatrConf & heaterSetting() const
Gets the heater setiing.
Definition unit_BME688.hpp:474
bool stopPeriodicMeasurement()
Stop periodic measurement.
Definition unit_BME688.hpp:746
int8_t ambientTemperature() const
Gets the ambient temperature.
Definition unit_BME688.hpp:479
uint32_t calculateMeasurementInterval(const bme688::Mode mode, const bme688::bme68xConf &s)
Calculation of measurement intervals without heater.
Definition unit_BME688.cpp:688
bool writeOversampling(const bme688::Oversampling t, const bme688::Oversampling p, const bme688::Oversampling h)
Wite oversamplings.
Definition unit_BME688.cpp:590
config_t config()
Gets the configration.
Definition unit_BME688.hpp:437
float humidity() const
Oldest measured humidity (%)
Definition unit_BME688.hpp:507
float temperature() const
Oldest measured temperature (Celsius)
Definition unit_BME688.hpp:497
bool readTPHSetting(bme688::bme68xConf &s)
Read TPH setting.
Definition unit_BME688.cpp:531
Top level namespace of M5stack.
Unit-related namespace.
Settings for begin.
Definition unit_BME688.hpp:389
uint32_t subscribe_bits
Subscribe BSEC2 sensors bits if start on begin.
Definition unit_BME688.hpp:398
bme688::ODR odr
Standby time between sequential mode measurement profiles if start on begin.
Definition unit_BME688.hpp:423
bme688::Oversampling oversampling_pressure
Pressure oversampling if start on begin.
Definition unit_BME688.hpp:417
bme688::Oversampling oversampling_temperature
Temperature oversampling if start on begin.
Definition unit_BME688.hpp:415
uint16_t heater_temperature
The heater temperature for forced mode degree Celsius if start on begin.
Definition unit_BME688.hpp:427
bme688::Mode mode
Measurement mode if start on begin.
Definition unit_BME688.hpp:413
bool start_periodic
Start periodic measurement on begin?
Definition unit_BME688.hpp:391
int8_t ambient_temperature
ambient temperature
Definition unit_BME688.hpp:393
bme688::Filter filter
Filter coefficient if start on begin.
Definition unit_BME688.hpp:421
bool heater_enable
Enable gas measurement if start on begin.
Definition unit_BME688.hpp:425
bme688::bsec2::SampleRate sample_rate
Sampling rate for BSEC2 if start on begin.
Definition unit_BME688.hpp:407
bme688::Oversampling oversampling_humidity
Humidity oversampling if start on begin.
Definition unit_BME688.hpp:419
uint16_t heater_duration
The heating duration for forced mode in milliseconds if start on begin.
Definition unit_BME688.hpp:429
Measurement data group.
Definition unit_BME688.hpp:260
GasSensor heater-on time.
Definition unit_BME688.hpp:145
uint8_t value
Use the value as it is in parallel mode.
Definition unit_BME688.hpp:198
static uint16_t to(const uint8_t v)
Conversion from register value to duration for Force/Sequencial mode.
Definition unit_BME688.hpp:192
Factor
Multiplier in Forced mode.
Definition unit_BME688.hpp:153
static uint8_t from(const uint16_t duration)
Conversion from duration to register value for Force/Sequencial mode.
Definition unit_BME688.hpp:180
Setting for gas heater.
Definition unit_BME688.hpp:80
struct bme68x_data bme68xData
Raw data.
Definition unit_BME688.hpp:64
struct bme68x_conf bme68xConf
Setting for temperature, pressure, humidity...
Definition unit_BME688.hpp:74
SampleRate
Sample rate for BSEC2.
Definition unit_BME688.hpp:208
@ Scan
Sample rate in case of scan mode (1/10.8 s)
@ LowPower
Sample rate in case of Low Power Mode (0.33Hz) interval 3 sec.
@ UltraLowPower
Sample rate in case of Ultra Low Power Mode (3.3 mHz) interval 300 sec.
@ Continuous
Sample rate in case of Continuous Mode (1Hz) interval 1 sec.
@ Disabled
Sample rate of a disabled sensor.
Mode
Operation mode same as BME68X_xxx_MODE.
Definition unit_BME688.hpp:50
@ Sleep
No measurements are performed.
@ Parallel
Multiple TPHG cycles are performed.
@ Forced
Single TPHG cycle is performed.
struct bme68x_calib_data bme68xCalibration
Calibration parameters.
Definition unit_BME688.hpp:93
uint32_t virtual_sensor_array_to_bits(const bsec_virtual_sensor_t *ss, const size_t len)
Conversion from BSEC2 subscription array to bits.
Definition unit_BME688.hpp:227
Filter
IIR Filter setting.
Definition unit_BME688.hpp:113
ODR
bme68xConf::odr settings (standbytime Unit:ms)
Definition unit_BME688.hpp:128
Oversampling
Definition unit_BME688.hpp:100
struct bme68x_dev bme68xDev
bme68x device
Definition unit_BME688.hpp:69
uint32_t subscribe_to_bits(Args... args)
Make subscribe bits from bsec_virtual_sensor_t.
Definition unit_BME688.hpp:240