M5Unit-ENV 1.7.4 git rev:e3384a7
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#include <M5UnitComponent.hpp>
14#include <m5_utility/stl/extension.hpp>
15
16#if defined(ARDUINO)
17#include <bme68xLibrary.h>
18#else
19#include <bme68x/bme68x.h>
20#endif
21
22// Enable BSEC2 (IAQ) only where the prebuilt blob exists and the headers are actually available.
23// Arduino users opt in by installing boschsensortec/bsec2. ESP-IDF native users opt in via
24// CONFIG_M5UNIT_ENV_ENABLE_BSEC2, which makes the in-repo components/bsec2 recipe expose headers.
25#if defined(ARDUINO)
26#if __has_include(<bsec2.h>) && \
27 (defined(CONFIG_IDF_TARGET_ESP32) || defined(CONFIG_IDF_TARGET_ESP32S3) || defined(CONFIG_IDF_TARGET_ESP32C3))
28#define UNIT_BME688_USING_BSEC2
29#endif
30#elif __has_include(<inc/bsec_interface.h>)
31#define UNIT_BME688_USING_BSEC2
32#endif
33
34#if defined(UNIT_BME688_USING_BSEC2)
35#if defined(ARDUINO)
36#include <bsec2.h>
37#else
38#include <inc/bsec_datatypes.h>
39// ESP-IDF native uses the raw BSEC API directly (no Arduino Bsec2 wrapper). The BME688 code relies
40// on two small helpers that the Arduino wrapper (bsec2.h) provides but the raw API headers do not;
41// define them here identically. BSEC_NUMBER_OUTPUTS comes from <inc/bsec_datatypes.h>.
42#ifndef BSEC_CHECK_INPUT
43#define BSEC_CHECK_INPUT(x, shift) (x & (1 << (shift - 1)))
44#endif
45typedef bsec_output_t bsecData;
46typedef struct {
47 bsecData output[BSEC_NUMBER_OUTPUTS];
48 uint8_t nOutputs;
49} bsecOutputs;
50#endif
51#endif
52
53#include <memory>
54#include <limits>
55#include <initializer_list>
56
57namespace m5 {
58namespace unit {
59
64namespace bme688 {
65
70enum class Mode : uint8_t {
71 Sleep,
72 Forced,
73 Parallel,
76};
77
80
84using bme68xData = struct bme68x_data;
89using bme68xDev = struct bme68x_dev;
94using bme68xConf = struct bme68x_conf;
100struct bme68xHeatrConf : bme68x_heatr_conf {
101 uint16_t temp_prof[10]{};
102 uint16_t dur_prof[10]{};
103 bme68xHeatrConf() : bme68x_heatr_conf()
104 {
105 heatr_temp_prof = temp_prof;
106 heatr_dur_prof = dur_prof;
107 }
108};
113using bme68xCalibration = struct bme68x_calib_data;
115
120enum class Oversampling : uint8_t {
121 None,
122 x1,
123 x2,
124 x4,
125 x8,
126 x16,
127};
128
133enum class Filter : uint8_t {
134 None,
135 Coeff_1,
136 Coeff_3,
137 Coeff_7,
138 Coeff_15,
139 Coeff_31,
140 Coeff_63,
141 Coeff_127,
142};
143
148enum class ODR : uint8_t {
149 MS_0_59,
150 MS_62_5,
151 MS_125,
152 MS_250,
153 MS_500,
154 MS_1000,
155 MS_10,
156 MS_20,
157 None,
158};
159
165struct GasWait {
166 GasWait() : value{0}
167 {
168 }
173 enum class Factor { x1, x4, x16, x64 };
177 inline uint8_t step() const
178 {
179 return value & 0x3F;
180 }
182 inline Factor factor() const
183 {
184 return static_cast<Factor>((value >> 6) & 0x03);
185 }
187
191 inline void step(const uint8_t s)
192 {
193 value = (value & ~0x3F) | (s & 0x3F);
194 }
196 inline void factor(const Factor f)
197 {
198 value = (value & ~(0x03 << 6)) | (m5::stl::to_underlying(f) << 6);
199 }
201
204 static uint8_t from(const uint16_t duration)
205 {
206 uint8_t f{};
207 uint16_t d{duration};
208 while (d > 0x3F) {
209 d >>= 2;
210 ++f;
211 }
212 return (f <= 0x03) ? ((uint8_t)d | (f << 6)) : 0xFF;
213 }
216 static uint16_t to(const uint8_t v)
217 {
218 constexpr uint16_t tbl[] = {1, 4, 16, 64};
219 return (v & 0x3F) * tbl[(v >> 6) & 0x03];
220 }
221
222 uint8_t value{};
223};
224
225#if defined(UNIT_BME688_USING_BSEC2)
226namespace bsec2 {
227
229constexpr uint8_t ACCURACY_UNAVAILABLE{0xFF};
230
235enum class SampleRate : uint8_t {
236 Disabled,
237 LowPower,
238 UltraLowPower,
239 UltraLowPowerMeasurementOnDemand,
241 Scan,
242 Continuous,
243};
244
246template <typename T>
247void is_bsec_virtual_sensor_t()
248{
249 static_assert(std::is_same<T, bsec_virtual_sensor_t>::value, "Argument must be of type bsec_virtual_sensor_t");
250}
252
259inline uint32_t virtual_sensor_array_to_bits(const bsec_virtual_sensor_t* ss, const size_t len)
260{
261 uint32_t ret{};
262 for (size_t i = 0; i < len; ++i) {
263 ret |= ((uint32_t)1U) << ss[i];
264 }
265 return ret;
266}
267
273template <typename... Args>
274uint32_t subscribe_to_bits(Args... args)
275{
276 // In a C++17 or later environment, it can be written like this...
277 // static_assert(std::conjunction<std::is_same<Args, bsec_virtual_sensor_t>...>::value,
278 // "All arguments must be of type bsec_virtual_sensor_t");
279 int discard[] = {(is_bsec_virtual_sensor_t<Args>(), 0)...};
280 (void)discard;
281
282 bsec_virtual_sensor_t tmp[] = {args...};
283 constexpr size_t n = sizeof...(args);
284 return virtual_sensor_array_to_bits(tmp, n);
285}
286
287} // namespace bsec2
288#endif
289
294struct Data {
295 bme688::bme68xData raw{};
296#if defined(UNIT_BME688_USING_BSEC2)
297 bsecOutputs raw_outputs{};
298
300 float get(const bsec_virtual_sensor_t vs) const;
307 uint8_t accuracy(const bsec_virtual_sensor_t vs) const;
313 int64_t timestamp(const bsec_virtual_sensor_t vs) const;
315 inline uint8_t iaq_accuracy() const
316 {
317 return accuracy(BSEC_OUTPUT_IAQ);
318 }
320 inline float iaq() const
321 {
322 return get(BSEC_OUTPUT_IAQ);
323 }
325 inline float static_iaq() const
326 {
327 return get(BSEC_OUTPUT_STATIC_IAQ);
328 }
330 inline float co2() const
331 {
332 return get(BSEC_OUTPUT_CO2_EQUIVALENT);
333 }
335 inline float voc() const
336 {
337 return get(BSEC_OUTPUT_BREATH_VOC_EQUIVALENT);
338 }
340 inline float temperature() const
341 {
342 return get(BSEC_OUTPUT_RAW_TEMPERATURE);
343 }
345 inline float pressure() const
346 {
347 return get(BSEC_OUTPUT_RAW_PRESSURE);
348 }
350 inline float humidity() const
351 {
352 return get(BSEC_OUTPUT_RAW_HUMIDITY);
353 }
355 inline float gas() const
356 {
357 return get(BSEC_OUTPUT_RAW_GAS);
358 }
360 inline bool gas_stabilization() const
361 {
362 return get(BSEC_OUTPUT_STABILIZATION_STATUS) == 1.0f;
363 }
365 inline bool gas_run_in_status() const
366 {
367 return get(BSEC_OUTPUT_RUN_IN_STATUS) == 1.0f;
368 }
370 inline float heat_compensated_temperature() const
371 {
372 return get(BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE);
373 }
375 inline float heat_compensated_humidity() const
376 {
377 return get(BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY);
378 }
380 inline float compensated_gas() const
381 {
382 return get(BSEC_OUTPUT_COMPENSATED_GAS);
383 }
385 inline float gas_percentage() const
386 {
387 return get(BSEC_OUTPUT_GAS_PERCENTAGE);
388 }
390 inline float gas_estimate_1() const
391 {
392 return get(BSEC_OUTPUT_GAS_ESTIMATE_1);
393 }
395 inline float gas_estimate_2() const
396 {
397 return get(BSEC_OUTPUT_GAS_ESTIMATE_2);
398 }
400 inline float gas_estimate_3() const
401 {
402 return get(BSEC_OUTPUT_GAS_ESTIMATE_3);
403 }
405 inline float gas_estimate_4() const
406 {
407 return get(BSEC_OUTPUT_GAS_ESTIMATE_4);
408 }
410 inline uint32_t gas_index() const
411 {
412 return get(BSEC_OUTPUT_RAW_GAS_INDEX);
413 }
415 inline float regression_estimate_1() const
416 {
417 return get(BSEC_OUTPUT_REGRESSION_ESTIMATE_1);
418 }
420 inline float regression_estimate_2() const
421 {
422 return get(BSEC_OUTPUT_REGRESSION_ESTIMATE_2);
423 }
425 inline float regression_estimate_3() const
426 {
427 return get(BSEC_OUTPUT_REGRESSION_ESTIMATE_3);
428 }
430 inline float regression_estimate_4() const
431 {
432 return get(BSEC_OUTPUT_REGRESSION_ESTIMATE_4);
433 }
434#endif
436 inline float raw_temperature() const
437 {
438 return raw.temperature;
439 }
441 inline float raw_pressure() const
442 {
443 return raw.pressure;
444 }
446 inline float raw_humidity() const
447 {
448 return raw.humidity;
449 }
451 inline float raw_gas() const
452 {
453 return raw.gas_resistance;
454 }
455};
456
457} // namespace bme688
458
465class UnitBME688 : public Component, public PeriodicMeasurementAdapter<UnitBME688, bme688::Data> {
466 M5_UNIT_COMPONENT_HPP_BUILDER(UnitBME688, 0x77);
467
468public:
473 struct config_t {
475 bool start_periodic{true};
478#if defined(UNIT_BME688_USING_BSEC2) || defined(DOXYGEN_PROCESS)
481
482 uint32_t subscribe_bits{1U << BSEC_OUTPUT_IAQ | 1U << BSEC_OUTPUT_RAW_TEMPERATURE |
483 1U << BSEC_OUTPUT_RAW_PRESSURE | 1U << BSEC_OUTPUT_RAW_HUMIDITY |
484 1U << BSEC_OUTPUT_RAW_GAS | 1U << BSEC_OUTPUT_STABILIZATION_STATUS |
485 1U << BSEC_OUTPUT_RUN_IN_STATUS};
491 bme688::bsec2::SampleRate sample_rate{bme688::bsec2::SampleRate::LowPower};
493#endif
494#if !defined(UNIT_BME688_USING_BSEC2) || defined(DOXYGEN_PROCESS)
497
498 bme688::Mode mode{bme688::Mode::Forced};
504 bme688::Oversampling oversampling_humidity{bme688::Oversampling::x16};
506 bme688::Filter filter{bme688::Filter::None};
508 bme688::ODR odr{bme688::ODR::None};
510 bool heater_enable{true};
512 uint16_t heater_temperature{300};
514 uint16_t heater_duration{100};
516#endif
517 };
518
521
522 inline config_t config() const
523 {
524 return _cfg;
525 }
527 inline void config(const config_t& cfg)
528 {
529 _cfg = cfg;
530 }
532
533 explicit UnitBME688(const uint8_t addr = DEFAULT_ADDRESS);
534 virtual ~UnitBME688()
535 {
536 }
537
538 virtual bool begin() override;
539 virtual void update(const bool force = false) override;
540
544 inline bme688::Mode mode() const
545 {
546 return _mode;
547 }
550 {
551 return _dev.calib;
552 }
554 inline const bme688::bme68xConf& tphSetting() const
555 {
556 return _tphConf;
557 }
560 {
561 return _heaterConf;
562 }
564 inline int8_t ambientTemperature() const
565 {
566 return _dev.amb_temp;
567 }
569
572#if defined(UNIT_BME688_USING_BSEC2)
577 inline float iaq() const
578 {
579 return !empty() ? oldest().iaq() : std::numeric_limits<float>::quiet_NaN();
580 }
586 inline uint8_t iaqAccuracy() const
587 {
588 return !empty() ? oldest().iaq_accuracy() : bme688::bsec2::ACCURACY_UNAVAILABLE;
589 }
591 inline float temperature() const
592 {
593 return !empty() ? oldest().temperature() : std::numeric_limits<float>::quiet_NaN();
594 }
596 inline float pressure() const
597 {
598 return !empty() ? oldest().pressure() : std::numeric_limits<float>::quiet_NaN();
599 }
601 inline float humidity() const
602 {
603 return !empty() ? oldest().humidity() : std::numeric_limits<float>::quiet_NaN();
604 }
606 inline float gas() const
607 {
608 return !empty() ? oldest().gas() : std::numeric_limits<float>::quiet_NaN();
609 }
610#else
612 inline float temperature() const
613 {
614 return !empty() ? oldest().raw_temperature() : std::numeric_limits<float>::quiet_NaN();
615 }
617 inline float pressure() const
618 {
619 return !empty() ? oldest().raw_pressure() : std::numeric_limits<float>::quiet_NaN();
620 }
622 inline float humidity() const
623 {
624 return !empty() ? oldest().raw_humidity() : std::numeric_limits<float>::quiet_NaN();
625 }
627 inline float gas() const
628 {
629 return !empty() ? oldest().raw_gas() : std::numeric_limits<float>::quiet_NaN();
630 }
631#endif
633 float altitude(const float sea_level_pa = 101325.0f) const;
635 float relativeAltitude() const;
639
640#if 0
646 inline uint8_t numberOfRawData() const
647 {
648 return _num_of_data;
649 }
657 inline const bme688::bme68xData* data(const uint8_t idx)
658 {
659 return (idx < _num_of_data) ? &_raw_data[idx] : nullptr;
660 }
661#endif
662
664 inline void setAmbientTemperature(const int8_t temp)
665 {
666 _dev.amb_temp = temp;
667 }
670 [[deprecated("Use setAmbientTemperature")]] inline void setAambientTemperature(const int8_t temp)
671 {
673 }
698 bool readUniqueID(uint32_t& id);
703 bool softReset();
708 bool selfTest();
714 bool writeMode(const bme688::Mode m);
720 bool readMode(bme688::Mode& m);
721
724
759 bool writeTPHSetting(const bme688::bme68xConf& s);
791 bool writeIIRFilter(const bme688::Filter f);
793
796
811
814
822 {
823 return PeriodicMeasurementAdapter<UnitBME688, bme688::Data>::startPeriodicMeasurement(m);
824 }
825#if defined(UNIT_BME688_USING_BSEC2) || defined(DOXYGEN_PROCESS)
833 inline bool startPeriodicMeasurement(const uint32_t subscribe_bits,
834 const bme688::bsec2::SampleRate sr = bme688::bsec2::SampleRate::LowPower)
835 {
836 return PeriodicMeasurementAdapter<UnitBME688, bme688::Data>::startPeriodicMeasurement(subscribe_bits, sr);
837 }
846 inline bool startPeriodicMeasurement(const bsec_virtual_sensor_t* ss, const size_t len,
847 const bme688::bsec2::SampleRate sr = bme688::bsec2::SampleRate::LowPower)
848 {
849 return ss ? startPeriodicMeasurement(bme688::bsec2::virtual_sensor_array_to_bits(ss, len), sr) : false;
850 }
851
852#endif
858 {
859 return PeriodicMeasurementAdapter<UnitBME688, bme688::Data>::stopPeriodicMeasurement();
860 }
862
865
876 [[deprecated("Use measureSingleshot")]] inline bool measureSingleShot(bme688::bme68xData& data)
877 {
878 return measureSingleshot(data);
879 }
881
882#if defined(UNIT_BME688_USING_BSEC2) || defined(DOXYGEN_PROCESS)
885
891 {
892 return _temperatureOffset;
893 }
898 void bsec2SetTemperatureOffset(const float offset)
899 {
900 _temperatureOffset = offset;
901 }
907 const bsec_version_t& bsec2Version() const
908 {
909 return _bsec2_version;
910 }
919 bool bsec2SetConfig(const uint8_t* cfg, const size_t sz = BSEC_MAX_PROPERTY_BLOB_SIZE);
927 bool bsec2GetConfig(uint8_t* cfg, uint32_t& actualSize);
933 bool bsec2SetState(const uint8_t* state);
941 bool bsec2GetState(uint8_t* state, uint32_t& actualSize);
950 bool bsec2UpdateSubscription(const uint32_t sensorBits, const bme688::bsec2::SampleRate sr);
960 inline bool bsec2UpdateSubscription(const bsec_virtual_sensor_t* ss, const size_t len,
961 const bme688::bsec2::SampleRate sr)
962 {
963 return bsec2UpdateSubscription(bme688::bsec2::virtual_sensor_array_to_bits(ss, len), sr);
964 }
970 inline bool bsec2IsSubscribed(const bsec_virtual_sensor_t id)
971 {
972 return _bsec2_subscription & (1U << id);
973 }
979 uint32_t bsec2Subscription() const
980 {
981 return _bsec2_subscription;
982 }
989 bool bsec2Subscribe(const bsec_virtual_sensor_t id);
995 bool bsec2Unsubscribe(const bsec_virtual_sensor_t id);
1002#endif
1003
1004protected:
1005 static int8_t read_function(uint8_t reg_addr, uint8_t* reg_data, uint32_t length, void* intf_ptr);
1006 static int8_t write_function(uint8_t reg_addr, const uint8_t* reg_data, uint32_t length, void* intf_ptr);
1007
1008 bool start_periodic_measurement(const bme688::Mode m);
1009 bool stop_periodic_measurement();
1010#if defined(UNIT_BME688_USING_BSEC2)
1011 bool start_periodic_measurement(const uint32_t subscribe_bits, const bme688::bsec2::SampleRate sr);
1012#endif
1013
1014 bool write_mode_forced();
1015 bool write_mode_parallel();
1016 bool fetch_data();
1017
1018 void update_bme688(const bool force);
1019 bool read_measurement();
1020#if defined(UNIT_BME688_USING_BSEC2)
1021 bool process_data(bsecOutputs& outputs, const int64_t ns, const bme688::bme68xData& data);
1022 void update_bsec2(const bool force);
1023#endif
1024
1025 inline virtual bool in_periodic() const override
1026 {
1027 return _periodic || (_bsec2_subscription != 0);
1028 }
1029
1030 M5_UNIT_COMPONENT_PERIODIC_MEASUREMENT_ADAPTER_HPP_BUILDER(UnitBME688, bme688::Data);
1031
1032protected:
1033 bme688::Mode _mode{bme688::Mode::Sleep};
1034
1035 // bme68x
1036 bme688::bme68xData _raw_data[3]{}; // latest data
1037 uint8_t _num_of_data{};
1038 bme688::bme68xDev _dev{};
1039 bme688::bme68xConf _tphConf{};
1040 bme688::bme68xHeatrConf _heaterConf{};
1041
1042 // BSEC2
1043 uint32_t _bsec2_subscription{}; // Enabled virtual sensor bit
1044
1045#if defined(UNIT_BME688_USING_BSEC2)
1046 bsec_version_t _bsec2_version{};
1047 std::unique_ptr<uint8_t> _bsec2_work{};
1048 bsec_bme_settings_t _bsec2_settings{};
1049
1050 bme688::Mode _bsec2_mode{};
1051 bme688::bsec2::SampleRate _bsec2_sr{};
1052
1053 bsecOutputs _outputs{};
1054 float _temperatureOffset{};
1055#endif
1056
1057 std::unique_ptr<m5::container::CircularBuffer<bme688::Data>> _data{};
1058
1059 bool _waiting{};
1060 types::elapsed_time_t _can_measure_time{};
1061
1062 config_t _cfg{};
1063 float _altitude_reference_pa{101325.0f};
1064};
1065
1067namespace bme688 {
1068namespace command {
1069constexpr uint8_t CHIP_ID{0xD0};
1070constexpr uint8_t RESET{0xE0};
1071constexpr uint8_t VARIANT_ID{0xF0};
1072
1073constexpr uint8_t IDAC_HEATER_0{0x50}; // ...9
1074constexpr uint8_t RES_HEAT_0{0x5A}; // ...9
1075constexpr uint8_t GAS_WAIT_0{0x64}; // ...9
1076constexpr uint8_t GAS_WAIT_SHARED{0x6E};
1077
1078constexpr uint8_t CTRL_GAS_0{0x70};
1079constexpr uint8_t CTRL_GAS_1{0x71};
1080constexpr uint8_t CTRL_HUMIDITY{0x72};
1081constexpr uint8_t CTRL_MEASUREMENT{0x74};
1082constexpr uint8_t CONFIG{0x75};
1083
1084constexpr uint8_t MEASUREMENT_STATUS_0{0x1D};
1085constexpr uint8_t MEASUREMENT_STATUS_1{0x2E};
1086constexpr uint8_t MEASUREMENT_STATUS_2{0x3F};
1087
1088constexpr uint8_t MEASUREMENT_GROUP_INDEX_0{0x1F};
1089constexpr uint8_t MEASUREMENT_GROUP_INDEX_1{0x30};
1090constexpr uint8_t MEASUREMENT_GROUP_INDEX_2{0x41};
1091
1092constexpr uint8_t UNIQUE_ID{0x83};
1093
1094// calibration
1095constexpr uint8_t CALIBRATION_GROUP_0{0x8A};
1096constexpr uint8_t CALIBRATION_GROUP_1{0xE1};
1097constexpr uint8_t CALIBRATION_GROUP_2{0x00};
1098constexpr uint8_t CALIBRATION_TEMPERATURE_1_LOW{0xE9};
1099constexpr uint8_t CALIBRATION_TEMPERATURE_2_LOW{0x8A};
1100constexpr uint8_t CALIBRATION_TEMPERATURE_3{0x8C};
1101constexpr uint8_t CALIBRATION_PRESSURE_1_LOW{0x8E};
1102constexpr uint8_t CALIBRATION_PRESSURE_2_LOW{0x90};
1103constexpr uint8_t CALIBRATION_PRESSURE_3{0x92};
1104constexpr uint8_t CALIBRATION_PRESSURE_4_LOW{0x94};
1105constexpr uint8_t CALIBRATION_PRESSURE_5_LOW{0x96};
1106constexpr uint8_t CALIBRATION_PRESSURE_6{0x99};
1107constexpr uint8_t CALIBRATION_PRESSURE_7{0x98};
1108constexpr uint8_t CALIBRATION_PRESSURE_8_LOW{0x9C};
1109constexpr uint8_t CALIBRATION_PRESSURE_9_LOW{0x9E};
1110constexpr uint8_t CALIBRATION_PRESSURE_10{0xA0};
1111constexpr uint8_t CALIBRATION_HUMIDITY_12{0xE2};
1112constexpr uint8_t CALIBRATION_HUMIDITY_1_HIGH{0xE3};
1113constexpr uint8_t CALIBRATION_HUMIDITY_2_HIGH{0xE1};
1114constexpr uint8_t CALIBRATION_HUMIDITY_3{0xE4};
1115constexpr uint8_t CALIBRATION_HUMIDITY_4{0xE5};
1116constexpr uint8_t CALIBRATION_HUMIDITY_5{0xE6};
1117constexpr uint8_t CALIBRATION_HUMIDITY_6{0xE7};
1118constexpr uint8_t CALIBRATION_HUMIDITY_7{0xE8};
1119constexpr uint8_t CALIBRATION_GAS_1{0xED};
1120constexpr uint8_t CALIBRATION_GAS_2_LOW{0xEB};
1121constexpr uint8_t CALIBRATION_GAS_3{0xEE};
1122constexpr uint8_t CALIBRATION_RES_HEAT_RANGE{0x02}; // [5:4]
1123constexpr uint8_t CALIBRATION_RES_HEAT_VAL{0x00};
1124
1125} // namespace command
1126} // namespace bme688
1128
1129} // namespace unit
1130} // namespace m5
1131#endif
BME688 unit.
Definition unit_BME688.hpp:465
void config(const config_t &cfg)
Set the configuration.
Definition unit_BME688.hpp:527
bool bsec2Unsubscribe(const bsec_virtual_sensor_t id)
Unsubscribe virtual sensor.
bool writeIIRFilter(const bme688::Filter f)
Write IIRFilter.
Definition unit_BME688.cpp:691
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:960
bool readHeaterSetting(bme688::bme68xHeatrConf &hs)
Read heater setting.
Definition unit_BME688.cpp:704
bool bsec2SetState(const uint8_t *state)
Restore the internal state.
float altitude(const float sea_level_pa=101325.0f) const
Absolute altitude (m) versus the given sea-level pressure (QNH, Pa)
Definition unit_BME688.cpp:1063
bool readOversamplingPressure(bme688::Oversampling &os)
Read pressure oversampling.
Definition unit_BME688.cpp:602
const bsec_version_t & bsec2Version() const
Gets the BSEC2 library version.
Definition unit_BME688.hpp:907
void setAambientTemperature(const int8_t temp)
Sets the ambient temperature.
Definition unit_BME688.hpp:670
bool readIIRFilter(bme688::Filter &f)
Read IIRFilter.
Definition unit_BME688.cpp:624
bool writeCalibration(const bme688::bme68xCalibration &c)
write calibration
Definition unit_BME688.cpp:525
bool readUniqueID(uint32_t &id)
Read unique ID.
Definition unit_BME688.cpp:452
float relativeAltitude() const
Altitude (m) relative to the last setAltitudeReference() tare point (0 m at that pressure)
Definition unit_BME688.cpp:1068
float bsec2GetTemperatureOffset() const
Gets the temperature offset(Celsius)
Definition unit_BME688.hpp:890
bool measureSingleShot(bme688::bme68xData &data)
Take a single measurement.
Definition unit_BME688.hpp:876
bool bsec2GetState(uint8_t *state, uint32_t &actualSize)
Retrieve the current internal library state.
void setAmbientTemperature(const int8_t temp)
Sets the ambient temperature.
Definition unit_BME688.hpp:664
float gas() const
Oldest measured gas (Ohm)
Definition unit_BME688.hpp:627
bool softReset()
Software reset.
Definition unit_BME688.cpp:466
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:846
bool bsec2IsSubscribed(const bsec_virtual_sensor_t id)
is virtual sensor Subscribed?
Definition unit_BME688.hpp:970
const bme688::bme68xConf & tphSetting() const
Gets the TPH setting.
Definition unit_BME688.hpp:554
bool readMode(bme688::Mode &m)
Read operation mode.
Definition unit_BME688.cpp:727
bool bsec2UpdateSubscription(const uint32_t sensorBits, const bme688::bsec2::SampleRate sr)
Subscribe to library virtual sensors outputs.
bool measureSingleshot(bme688::bme68xData &data)
Take a single measurement.
Definition unit_BME688.cpp:738
bool selfTest()
Self-test.
Definition unit_BME688.cpp:473
void setAltitudeReference()
Tare the current pressure as the 0 m reference for relativeAltitude()
Definition unit_BME688.cpp:1073
bme688::Mode mode() const
Current mode.
Definition unit_BME688.hpp:544
bool readOversamplingHumidity(bme688::Oversampling &os)
Read humidity oversampling.
Definition unit_BME688.cpp:613
bool readOversamplingTemperature(bme688::Oversampling &os)
Read temperature oversampling.
Definition unit_BME688.cpp:591
bool writeOversamplingTemperature(const bme688::Oversampling os)
Write temperature oversampling.
Definition unit_BME688.cpp:652
bool writeTPHSetting(const bme688::bme68xConf &s)
Write TPH setting.
Definition unit_BME688.cpp:581
bool bsec2GetConfig(uint8_t *cfg, uint32_t &actualSize)
Retrieve the current library configuration.
bool writeMode(const bme688::Mode m)
Write operation mode.
Definition unit_BME688.cpp:718
void bsec2SetTemperatureOffset(const float offset)
Set the temperature offset(Celsius)
Definition unit_BME688.hpp:898
bool bsec2SetConfig(const uint8_t *cfg, const size_t sz=BSEC_MAX_PROPERTY_BLOB_SIZE)
Update algorithm configuration parameters Update bsec2 configuration settings.
bool writeOversamplingHumidity(const bme688::Oversampling os)
Write humidity oversampling.
Definition unit_BME688.cpp:678
bool writeOversamplingPressure(const bme688::Oversampling os)
Write pressure oversampling.
Definition unit_BME688.cpp:665
bool bsec2Subscribe(const bsec_virtual_sensor_t id)
Subscribe virtual sensor.
bool startPeriodicMeasurement(const bme688::Mode m)
Start periodic measurement without BSEC2.
Definition unit_BME688.hpp:821
bool writeHeaterSetting(const bme688::Mode mode, const bme688::bme68xHeatrConf &hs)
Write heater setting.
Definition unit_BME688.cpp:709
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:833
const bme688::bme68xCalibration & calibration() const
Gets the Calibration.
Definition unit_BME688.hpp:549
bool readCalibration(bme688::bme68xCalibration &c)
Read calibration.
Definition unit_BME688.cpp:478
bool bsec2UnsubscribeAll()
Unsubscribe current all sensors.
uint32_t bsec2Subscription() const
Gets the subscription bits.
Definition unit_BME688.hpp:979
float pressure() const
Oldest measured pressure (Pa)
Definition unit_BME688.hpp:617
const bme688::bme68xHeatrConf & heaterSetting() const
Gets the heater setting.
Definition unit_BME688.hpp:559
bool stopPeriodicMeasurement()
Stop periodic measurement.
Definition unit_BME688.hpp:857
int8_t ambientTemperature() const
Gets the ambient temperature.
Definition unit_BME688.hpp:564
uint32_t calculateMeasurementInterval(const bme688::Mode mode, const bme688::bme68xConf &s)
Calculation of measurement intervals without heater.
Definition unit_BME688.cpp:733
bool writeOversampling(const bme688::Oversampling t, const bme688::Oversampling p, const bme688::Oversampling h)
Write oversamplings.
Definition unit_BME688.cpp:635
config_t config() const
Gets the configuration.
Definition unit_BME688.hpp:522
float humidity() const
Oldest measured humidity (%)
Definition unit_BME688.hpp:622
float temperature() const
Oldest measured temperature (Celsius)
Definition unit_BME688.hpp:612
bool readTPHSetting(bme688::bme68xConf &s)
Read TPH setting.
Definition unit_BME688.cpp:576
For BME688.
Top level namespace of M5Stack.
Unit-related namespace.
Settings for begin.
Definition unit_BME688.hpp:473
uint32_t subscribe_bits
Subscribe BSEC2 sensors bits if start on begin.
Definition unit_BME688.hpp:482
bme688::ODR odr
Standby time between sequential mode measurement profiles if start on begin.
Definition unit_BME688.hpp:508
bme688::Oversampling oversampling_pressure
Pressure oversampling if start on begin.
Definition unit_BME688.hpp:502
bme688::Oversampling oversampling_temperature
Temperature oversampling if start on begin.
Definition unit_BME688.hpp:500
uint16_t heater_temperature
The heater temperature for forced mode degree Celsius if start on begin.
Definition unit_BME688.hpp:512
bme688::Mode mode
Measurement mode if start on begin.
Definition unit_BME688.hpp:498
bool start_periodic
Start periodic measurement on begin?
Definition unit_BME688.hpp:475
int8_t ambient_temperature
ambient temperature
Definition unit_BME688.hpp:477
bme688::Filter filter
Filter coefficient if start on begin.
Definition unit_BME688.hpp:506
bool heater_enable
Enable gas measurement if start on begin.
Definition unit_BME688.hpp:510
bme688::bsec2::SampleRate sample_rate
Sampling rate for BSEC2 if start on begin.
Definition unit_BME688.hpp:491
bme688::Oversampling oversampling_humidity
Humidity oversampling if start on begin.
Definition unit_BME688.hpp:504
uint16_t heater_duration
The heating duration for forced mode in milliseconds if start on begin.
Definition unit_BME688.hpp:514
Measurement data group.
Definition unit_BME688.hpp:294
float raw_temperature() const
Gets the raw temperature from bme68xData.
Definition unit_BME688.hpp:436
float raw_gas() const
Gets the raw gas resistance from bme68xData.
Definition unit_BME688.hpp:451
float raw_humidity() const
Gets the raw humidity from bme68xData.
Definition unit_BME688.hpp:446
float raw_pressure() const
Gets the raw pressure from bme68xData.
Definition unit_BME688.hpp:441
GasSensor heater-on time.
Definition unit_BME688.hpp:165
Factor factor() const
Gets the multiplication factor.
Definition unit_BME688.hpp:182
void factor(const Factor f)
Sets the multiplication factor.
Definition unit_BME688.hpp:196
uint8_t value
Use the value as it is in parallel mode.
Definition unit_BME688.hpp:222
static uint16_t to(const uint8_t v)
Conversion from register value to duration for Force/Sequential mode.
Definition unit_BME688.hpp:216
Factor
Multiplier in Forced mode.
Definition unit_BME688.hpp:173
uint8_t step() const
Gets the step value (0-63)
Definition unit_BME688.hpp:177
static uint8_t from(const uint16_t duration)
Conversion from duration to register value for Force/Sequential mode.
Definition unit_BME688.hpp:204
void step(const uint8_t s)
Sets the step value (0-63)
Definition unit_BME688.hpp:191
Setting for gas heater.
Definition unit_BME688.hpp:100
struct bme68x_data bme68xData
Raw data.
Definition unit_BME688.hpp:84
struct bme68x_conf bme68xConf
Setting for temperature, pressure, humidity...
Definition unit_BME688.hpp:94
Mode
Operation mode same as BME68X_xxx_MODE.
Definition unit_BME688.hpp:70
@ 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:113
Filter
IIR Filter setting.
Definition unit_BME688.hpp:133
@ Coeff_1
co-efficient 1
@ Coeff_15
co-efficient 15
@ Coeff_3
co-efficient 3
@ Coeff_31
co-efficient 31
@ Coeff_63
co-efficient 63
@ Coeff_127
co-efficient 127
@ Coeff_7
co-efficient 7
ODR
bme68xConf::odr settings (standbytime Unit:ms)
Definition unit_BME688.hpp:148
Oversampling
Sampling setting.
Definition unit_BME688.hpp:120
struct bme68x_dev bme68xDev
bme68x device
Definition unit_BME688.hpp:89