M5Unit-ENV 1.5.0 git rev:6195a2c
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. Arduino: esp32/s3/c3 (unchanged). ESP-IDF
23// native: only when the in-repo components/bsec2 recipe is enabled (CONFIG_M5UNIT_ENV_ENABLE_BSEC2)
24// and has exposed its headers -- detected via __has_include of the BSEC interface header.
25#if defined(ARDUINO)
26#if defined(CONFIG_IDF_TARGET_ESP32) || defined(CONFIG_IDF_TARGET_ESP32S3) || defined(CONFIG_IDF_TARGET_ESP32C3)
27#define UNIT_BME688_USING_BSEC2
28#endif
29#elif __has_include(<inc/bsec_interface.h>)
30#define UNIT_BME688_USING_BSEC2
31#endif
32
33#if defined(UNIT_BME688_USING_BSEC2)
34#if defined(ARDUINO)
35#include <bsec2.h>
36#else
37#include <inc/bsec_datatypes.h>
38// ESP-IDF native uses the raw BSEC API directly (no Arduino Bsec2 wrapper). The BME688 code relies
39// on two small helpers that the Arduino wrapper (bsec2.h) provides but the raw API headers do not;
40// define them here identically. BSEC_NUMBER_OUTPUTS comes from <inc/bsec_datatypes.h>.
41#ifndef BSEC_CHECK_INPUT
42#define BSEC_CHECK_INPUT(x, shift) (x & (1 << (shift - 1)))
43#endif
44typedef bsec_output_t bsecData;
45typedef struct {
46 bsecData output[BSEC_NUMBER_OUTPUTS];
47 uint8_t nOutputs;
48} bsecOutputs;
49#endif
50#endif
51
52#include <memory>
53#include <limits>
54#include <initializer_list>
55
56namespace m5 {
57namespace unit {
58
63namespace bme688 {
64
69enum class Mode : uint8_t {
70 Sleep,
71 Forced,
72 Parallel,
75};
76
79
83using bme68xData = struct bme68x_data;
88using bme68xDev = struct bme68x_dev;
93using bme68xConf = struct bme68x_conf;
99struct bme68xHeatrConf : bme68x_heatr_conf {
100 uint16_t temp_prof[10]{};
101 uint16_t dur_prof[10]{};
102 bme68xHeatrConf() : bme68x_heatr_conf()
103 {
104 heatr_temp_prof = temp_prof;
105 heatr_dur_prof = dur_prof;
106 }
107};
112using bme68xCalibration = struct bme68x_calib_data;
114
119enum class Oversampling : uint8_t {
120 None,
121 x1,
122 x2,
123 x4,
124 x8,
125 x16,
126};
127
132enum class Filter : uint8_t {
133 None,
134 Coeff_1,
135 Coeff_3,
136 Coeff_7,
137 Coeff_15,
138 Coeff_31,
139 Coeff_63,
140 Coeff_127,
141};
142
147enum class ODR : uint8_t {
148 MS_0_59,
149 MS_62_5,
150 MS_125,
151 MS_250,
152 MS_500,
153 MS_1000,
154 MS_10,
155 MS_20,
156 None,
157};
158
164struct GasWait {
165 GasWait() : value{0}
166 {
167 }
172 enum class Factor { x1, x4, x16, x64 };
176 inline uint8_t step() const
177 {
178 return value & 0x3F;
179 }
181 inline Factor factor() const
182 {
183 return static_cast<Factor>((value >> 6) & 0x03);
184 }
186
190 inline void step(const uint8_t s)
191 {
192 value = (value & ~0x3F) | (s & 0x3F);
193 }
195 inline void factor(const Factor f)
196 {
197 value = (value & ~(0x03 << 6)) | (m5::stl::to_underlying(f) << 6);
198 }
200
203 static uint8_t from(const uint16_t duration)
204 {
205 uint8_t f{};
206 uint16_t d{duration};
207 while (d > 0x3F) {
208 d >>= 2;
209 ++f;
210 }
211 return (f <= 0x03) ? ((uint8_t)d | (f << 6)) : 0xFF;
212 }
215 static uint16_t to(const uint8_t v)
216 {
217 constexpr uint16_t tbl[] = {1, 4, 16, 64};
218 return (v & 0x3F) * tbl[(v >> 6) & 0x03];
219 }
220
221 uint8_t value{};
222};
223
224#if defined(UNIT_BME688_USING_BSEC2)
225namespace bsec2 {
226
231enum class SampleRate : uint8_t {
232 Disabled,
233 LowPower,
234 UltraLowPower,
235 UltraLowPowerMeasurementOnDemand,
237 Scan,
238 Continuous,
239};
240
242template <typename T>
243void is_bsec_virtual_sensor_t()
244{
245 static_assert(std::is_same<T, bsec_virtual_sensor_t>::value, "Argument must be of type bsec_virtual_sensor_t");
246}
248
255inline uint32_t virtual_sensor_array_to_bits(const bsec_virtual_sensor_t* ss, const size_t len)
256{
257 uint32_t ret{};
258 for (size_t i = 0; i < len; ++i) {
259 ret |= ((uint32_t)1U) << ss[i];
260 }
261 return ret;
262}
263
269template <typename... Args>
270uint32_t subscribe_to_bits(Args... args)
271{
272 // In a C++17 or later environment, it can be written like this...
273 // static_assert(std::conjunction<std::is_same<Args, bsec_virtual_sensor_t>...>::value,
274 // "All arguments must be of type bsec_virtual_sensor_t");
275 int discard[] = {(is_bsec_virtual_sensor_t<Args>(), 0)...};
276 (void)discard;
277
278 bsec_virtual_sensor_t tmp[] = {args...};
279 constexpr size_t n = sizeof...(args);
280 return virtual_sensor_array_to_bits(tmp, n);
281}
282
283} // namespace bsec2
284#endif
285
290struct Data {
291 bme688::bme68xData raw{};
292#if defined(UNIT_BME688_USING_BSEC2)
293 bsecOutputs raw_outputs{};
294
296 float get(const bsec_virtual_sensor_t vs) const;
298 inline float iaq() const
299 {
300 return get(BSEC_OUTPUT_IAQ);
301 }
303 inline float static_iaq() const
304 {
305 return get(BSEC_OUTPUT_STATIC_IAQ);
306 }
308 inline float co2() const
309 {
310 return get(BSEC_OUTPUT_CO2_EQUIVALENT);
311 }
313 inline float voc() const
314 {
315 return get(BSEC_OUTPUT_BREATH_VOC_EQUIVALENT);
316 }
318 inline float temperature() const
319 {
320 return get(BSEC_OUTPUT_RAW_TEMPERATURE);
321 }
323 inline float pressure() const
324 {
325 return get(BSEC_OUTPUT_RAW_PRESSURE);
326 }
328 inline float humidity() const
329 {
330 return get(BSEC_OUTPUT_RAW_HUMIDITY);
331 }
333 inline float gas() const
334 {
335 return get(BSEC_OUTPUT_RAW_GAS);
336 }
338 inline bool gas_stabilization() const
339 {
340 return get(BSEC_OUTPUT_STABILIZATION_STATUS) == 1.0f;
341 }
343 inline bool gas_run_in_status() const
344 {
345 return get(BSEC_OUTPUT_RUN_IN_STATUS) == 1.0f;
346 }
348 inline float heat_compensated_temperature() const
349 {
350 return get(BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE);
351 }
353 inline float heat_compensated_humidity() const
354 {
355 return get(BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY);
356 }
358 inline float gas_percentage() const
359 {
360 return get(BSEC_OUTPUT_GAS_PERCENTAGE);
361 }
363 inline float gas_estimate_1() const
364 {
365 return get(BSEC_OUTPUT_GAS_ESTIMATE_1);
366 }
368 inline float gas_estimate_2() const
369 {
370 return get(BSEC_OUTPUT_GAS_ESTIMATE_2);
371 }
373 inline float gas_estimate_3() const
374 {
375 return get(BSEC_OUTPUT_GAS_ESTIMATE_3);
376 }
378 inline float gas_estimate_4() const
379 {
380 return get(BSEC_OUTPUT_GAS_ESTIMATE_4);
381 }
383 inline uint32_t gas_index() const
384 {
385 return get(BSEC_OUTPUT_RAW_GAS_INDEX);
386 }
388 inline float regression_estimate_1() const
389 {
390 return get(BSEC_OUTPUT_REGRESSION_ESTIMATE_1);
391 }
393 inline float regression_estimate_2() const
394 {
395 return get(BSEC_OUTPUT_REGRESSION_ESTIMATE_2);
396 }
398 inline float regression_estimate_3() const
399 {
400 return get(BSEC_OUTPUT_REGRESSION_ESTIMATE_3);
401 }
403 inline float regression_estimate_4() const
404 {
405 return get(BSEC_OUTPUT_REGRESSION_ESTIMATE_4);
406 }
407#endif
409 inline float raw_temperature() const
410 {
411 return raw.temperature;
412 }
414 inline float raw_pressure() const
415 {
416 return raw.pressure;
417 }
419 inline float raw_humidity() const
420 {
421 return raw.humidity;
422 }
424 inline float raw_gas() const
425 {
426 return raw.gas_resistance;
427 }
428};
429
430} // namespace bme688
431
438class UnitBME688 : public Component, public PeriodicMeasurementAdapter<UnitBME688, bme688::Data> {
439 M5_UNIT_COMPONENT_HPP_BUILDER(UnitBME688, 0x77);
440
441public:
446 struct config_t {
448 bool start_periodic{true};
451#if defined(UNIT_BME688_USING_BSEC2) || defined(DOXYGEN_PROCESS)
454
455 uint32_t subscribe_bits{1U << BSEC_OUTPUT_IAQ | 1U << BSEC_OUTPUT_RAW_TEMPERATURE |
456 1U << BSEC_OUTPUT_RAW_PRESSURE | 1U << BSEC_OUTPUT_RAW_HUMIDITY |
457 1U << BSEC_OUTPUT_RAW_GAS | 1U << BSEC_OUTPUT_STABILIZATION_STATUS |
458 1U << BSEC_OUTPUT_RUN_IN_STATUS};
464 bme688::bsec2::SampleRate sample_rate{bme688::bsec2::SampleRate::LowPower};
465#endif
466#if !defined(UNIT_BME688_USING_BSEC2) || defined(DOXYGEN_PROCESS)
469
470 bme688::Mode mode{bme688::Mode::Forced};
476 bme688::Oversampling oversampling_humidity{bme688::Oversampling::x16};
478 bme688::Filter filter{bme688::Filter::None};
480 bme688::ODR odr{bme688::ODR::None};
482 bool heater_enable{true};
484 uint16_t heater_temperature{300};
486 uint16_t heater_duration{100};
488#endif
489 };
490
493
494 inline config_t config() const
495 {
496 return _cfg;
497 }
499 inline void config(const config_t& cfg)
500 {
501 _cfg = cfg;
502 }
504
505 explicit UnitBME688(const uint8_t addr = DEFAULT_ADDRESS);
506 virtual ~UnitBME688()
507 {
508 }
509
510 virtual bool begin() override;
511 virtual void update(const bool force = false) override;
512
516 inline bme688::Mode mode() const
517 {
518 return _mode;
519 }
522 {
523 return _dev.calib;
524 }
526 inline const bme688::bme68xConf& tphSetting() const
527 {
528 return _tphConf;
529 }
532 {
533 return _heaterConf;
534 }
536 inline int8_t ambientTemperature() const
537 {
538 return _dev.amb_temp;
539 }
541
544#if defined(UNIT_BME688_USING_BSEC2)
549 inline float iaq() const
550 {
551 return !empty() ? oldest().iaq() : std::numeric_limits<float>::quiet_NaN();
552 }
554 inline float temperature() const
555 {
556 return !empty() ? oldest().temperature() : std::numeric_limits<float>::quiet_NaN();
557 }
559 inline float pressure() const
560 {
561 return !empty() ? oldest().pressure() : std::numeric_limits<float>::quiet_NaN();
562 }
564 inline float humidity() const
565 {
566 return !empty() ? oldest().humidity() : std::numeric_limits<float>::quiet_NaN();
567 }
569 inline float gas() const
570 {
571 return !empty() ? oldest().gas() : std::numeric_limits<float>::quiet_NaN();
572 }
573#else
575 inline float temperature() const
576 {
577 return !empty() ? oldest().raw_temperature() : std::numeric_limits<float>::quiet_NaN();
578 }
580 inline float pressure() const
581 {
582 return !empty() ? oldest().raw_pressure() : std::numeric_limits<float>::quiet_NaN();
583 }
585 inline float humidity() const
586 {
587 return !empty() ? oldest().raw_humidity() : std::numeric_limits<float>::quiet_NaN();
588 }
590 inline float gas() const
591 {
592 return !empty() ? oldest().raw_gas() : std::numeric_limits<float>::quiet_NaN();
593 }
594#endif
596
597#if 0
603 inline uint8_t numberOfRawData() const
604 {
605 return _num_of_data;
606 }
614 inline const bme688::bme68xData* data(const uint8_t idx)
615 {
616 return (idx < _num_of_data) ? &_raw_data[idx] : nullptr;
617 }
618#endif
619
621 inline void setAmbientTemperature(const int8_t temp)
622 {
623 _dev.amb_temp = temp;
624 }
627 [[deprecated("Use setAmbientTemperature")]] inline void setAambientTemperature(const int8_t temp)
628 {
630 }
655 bool readUniqueID(uint32_t& id);
660 bool softReset();
665 bool selfTest();
671 bool writeMode(const bme688::Mode m);
677 bool readMode(bme688::Mode& m);
678
681
716 bool writeTPHSetting(const bme688::bme68xConf& s);
748 bool writeIIRFilter(const bme688::Filter f);
750
753
768
771
779 {
780 return PeriodicMeasurementAdapter<UnitBME688, bme688::Data>::startPeriodicMeasurement(m);
781 }
782#if defined(UNIT_BME688_USING_BSEC2) || defined(DOXYGEN_PROCESS)
790 inline bool startPeriodicMeasurement(const uint32_t subscribe_bits,
791 const bme688::bsec2::SampleRate sr = bme688::bsec2::SampleRate::LowPower)
792 {
793 return PeriodicMeasurementAdapter<UnitBME688, bme688::Data>::startPeriodicMeasurement(subscribe_bits, sr);
794 }
803 inline bool startPeriodicMeasurement(const bsec_virtual_sensor_t* ss, const size_t len,
804 const bme688::bsec2::SampleRate sr = bme688::bsec2::SampleRate::LowPower)
805 {
806 return ss ? startPeriodicMeasurement(bme688::bsec2::virtual_sensor_array_to_bits(ss, len), sr) : false;
807 }
808
809#endif
815 {
816 return PeriodicMeasurementAdapter<UnitBME688, bme688::Data>::stopPeriodicMeasurement();
817 }
819
822
833 [[deprecated("Use measureSingleshot")]] inline bool measureSingleShot(bme688::bme68xData& data)
834 {
835 return measureSingleshot(data);
836 }
838
839#if defined(UNIT_BME688_USING_BSEC2) || defined(DOXYGEN_PROCESS)
842
848 {
849 return _temperatureOffset;
850 }
855 void bsec2SetTemperatureOffset(const float offset)
856 {
857 _temperatureOffset = offset;
858 }
864 const bsec_version_t& bsec2Version() const
865 {
866 return _bsec2_version;
867 }
876 bool bsec2SetConfig(const uint8_t* cfg, const size_t sz = BSEC_MAX_PROPERTY_BLOB_SIZE);
884 bool bsec2GetConfig(uint8_t* cfg, uint32_t& actualSize);
890 bool bsec2SetState(const uint8_t* state);
898 bool bsec2GetState(uint8_t* state, uint32_t& actualSize);
907 bool bsec2UpdateSubscription(const uint32_t sensorBits, const bme688::bsec2::SampleRate sr);
917 inline bool bsec2UpdateSubscription(const bsec_virtual_sensor_t* ss, const size_t len,
918 const bme688::bsec2::SampleRate sr)
919 {
920 return bsec2UpdateSubscription(bme688::bsec2::virtual_sensor_array_to_bits(ss, len), sr);
921 }
927 inline bool bsec2IsSubscribed(const bsec_virtual_sensor_t id)
928 {
929 return _bsec2_subscription & (1U << id);
930 }
936 uint32_t bsec2Subscription() const
937 {
938 return _bsec2_subscription;
939 }
946 bool bsec2Subscribe(const bsec_virtual_sensor_t id);
952 bool bsec2Unsubscribe(const bsec_virtual_sensor_t id);
959#endif
960
961protected:
962 static int8_t read_function(uint8_t reg_addr, uint8_t* reg_data, uint32_t length, void* intf_ptr);
963 static int8_t write_function(uint8_t reg_addr, const uint8_t* reg_data, uint32_t length, void* intf_ptr);
964
965 bool start_periodic_measurement(const bme688::Mode m);
966 bool stop_periodic_measurement();
967#if defined(UNIT_BME688_USING_BSEC2)
968 bool start_periodic_measurement(const uint32_t subscribe_bits, const bme688::bsec2::SampleRate sr);
969#endif
970
971 bool write_mode_forced();
972 bool write_mode_parallel();
973 bool fetch_data();
974
975 void update_bme688(const bool force);
976 bool read_measurement();
977#if defined(UNIT_BME688_USING_BSEC2)
978 bool process_data(bsecOutputs& outputs, const int64_t ns, const bme688::bme68xData& data);
979 void update_bsec2(const bool force);
980#endif
981
982 inline virtual bool in_periodic() const override
983 {
984 return _periodic || (_bsec2_subscription != 0);
985 }
986
987 M5_UNIT_COMPONENT_PERIODIC_MEASUREMENT_ADAPTER_HPP_BUILDER(UnitBME688, bme688::Data);
988
989protected:
990 bme688::Mode _mode{bme688::Mode::Sleep};
991
992 // bme68x
993 bme688::bme68xData _raw_data[3]{}; // latest data
994 uint8_t _num_of_data{};
995 bme688::bme68xDev _dev{};
996 bme688::bme68xConf _tphConf{};
997 bme688::bme68xHeatrConf _heaterConf{};
998
999 // BSEC2
1000 uint32_t _bsec2_subscription{}; // Enabled virtual sensor bit
1001
1002#if defined(UNIT_BME688_USING_BSEC2)
1003 bsec_version_t _bsec2_version{};
1004 std::unique_ptr<uint8_t> _bsec2_work{};
1005 bsec_bme_settings_t _bsec2_settings{};
1006
1007 bme688::Mode _bsec2_mode{};
1008 bme688::bsec2::SampleRate _bsec2_sr{};
1009
1010 bsecOutputs _outputs{};
1011 float _temperatureOffset{};
1012#endif
1013
1014 std::unique_ptr<m5::container::CircularBuffer<bme688::Data>> _data{};
1015
1016 bool _waiting{};
1017 types::elapsed_time_t _can_measure_time{};
1018
1019 config_t _cfg{};
1020};
1021
1023namespace bme688 {
1024namespace command {
1025constexpr uint8_t CHIP_ID{0xD0};
1026constexpr uint8_t RESET{0xE0};
1027constexpr uint8_t VARIANT_ID{0xF0};
1028
1029constexpr uint8_t IDAC_HEATER_0{0x50}; // ...9
1030constexpr uint8_t RES_HEAT_0{0x5A}; // ...9
1031constexpr uint8_t GAS_WAIT_0{0x64}; // ...9
1032constexpr uint8_t GAS_WAIT_SHARED{0x6E};
1033
1034constexpr uint8_t CTRL_GAS_0{0x70};
1035constexpr uint8_t CTRL_GAS_1{0x71};
1036constexpr uint8_t CTRL_HUMIDITY{0x72};
1037constexpr uint8_t CTRL_MEASUREMENT{0x74};
1038constexpr uint8_t CONFIG{0x75};
1039
1040constexpr uint8_t MEASUREMENT_STATUS_0{0x1D};
1041constexpr uint8_t MEASUREMENT_STATUS_1{0x2E};
1042constexpr uint8_t MEASUREMENT_STATUS_2{0x3F};
1043
1044constexpr uint8_t MEASUREMENT_GROUP_INDEX_0{0x1F};
1045constexpr uint8_t MEASUREMENT_GROUP_INDEX_1{0x30};
1046constexpr uint8_t MEASUREMENT_GROUP_INDEX_2{0x41};
1047
1048constexpr uint8_t UNIQUE_ID{0x83};
1049
1050// calibration
1051constexpr uint8_t CALIBRATION_GROUP_0{0x8A};
1052constexpr uint8_t CALIBRATION_GROUP_1{0xE1};
1053constexpr uint8_t CALIBRATION_GROUP_2{0x00};
1054constexpr uint8_t CALIBRATION_TEMPERATURE_1_LOW{0xE9};
1055constexpr uint8_t CALIBRATION_TEMPERATURE_2_LOW{0x8A};
1056constexpr uint8_t CALIBRATION_TEMPERATURE_3{0x8C};
1057constexpr uint8_t CALIBRATION_PRESSURE_1_LOW{0x8E};
1058constexpr uint8_t CALIBRATION_PRESSURE_2_LOW{0x90};
1059constexpr uint8_t CALIBRATION_PRESSURE_3{0x92};
1060constexpr uint8_t CALIBRATION_PRESSURE_4_LOW{0x94};
1061constexpr uint8_t CALIBRATION_PRESSURE_5_LOW{0x96};
1062constexpr uint8_t CALIBRATION_PRESSURE_6{0x99};
1063constexpr uint8_t CALIBRATION_PRESSURE_7{0x98};
1064constexpr uint8_t CALIBRATION_PRESSURE_8_LOW{0x9C};
1065constexpr uint8_t CALIBRATION_PRESSURE_9_LOW{0x9E};
1066constexpr uint8_t CALIBRATION_PRESSURE_10{0xA0};
1067constexpr uint8_t CALIBRATION_HUMIDITY_12{0xE2};
1068constexpr uint8_t CALIBRATION_HUMIDITY_1_HIGH{0xE3};
1069constexpr uint8_t CALIBRATION_HUMIDITY_2_HIGH{0xE1};
1070constexpr uint8_t CALIBRATION_HUMIDITY_3{0xE4};
1071constexpr uint8_t CALIBRATION_HUMIDITY_4{0xE5};
1072constexpr uint8_t CALIBRATION_HUMIDITY_5{0xE6};
1073constexpr uint8_t CALIBRATION_HUMIDITY_6{0xE7};
1074constexpr uint8_t CALIBRATION_HUMIDITY_7{0xE8};
1075constexpr uint8_t CALIBRATION_GAS_1{0xED};
1076constexpr uint8_t CALIBRATION_GAS_2_LOW{0xEB};
1077constexpr uint8_t CALIBRATION_GAS_3{0xEE};
1078constexpr uint8_t CALIBRATION_RES_HEAT_RANGE{0x02}; // [5:4]
1079constexpr uint8_t CALIBRATION_RES_HEAT_VAL{0x00};
1080
1081} // namespace command
1082} // namespace bme688
1084
1085} // namespace unit
1086} // namespace m5
1087#endif
BME688 unit.
Definition unit_BME688.hpp:438
void config(const config_t &cfg)
Set the configuration.
Definition unit_BME688.hpp:499
bool bsec2Unsubscribe(const bsec_virtual_sensor_t id)
Unsubscribe virtual sensor.
bool writeIIRFilter(const bme688::Filter f)
Write IIRFilter.
Definition unit_BME688.cpp:669
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:917
bool readHeaterSetting(bme688::bme68xHeatrConf &hs)
Read heater setting.
Definition unit_BME688.cpp:682
bool bsec2SetState(const uint8_t *state)
Restore the internal state.
bool readOversamplingPressure(bme688::Oversampling &os)
Read pressure oversampling.
Definition unit_BME688.cpp:580
const bsec_version_t & bsec2Version() const
Gets the BSEC2 library version.
Definition unit_BME688.hpp:864
void setAambientTemperature(const int8_t temp)
Sets the ambient temperature.
Definition unit_BME688.hpp:627
bool readIIRFilter(bme688::Filter &f)
Read IIRFilter.
Definition unit_BME688.cpp:602
bool writeCalibration(const bme688::bme68xCalibration &c)
write calibration
Definition unit_BME688.cpp:503
bool readUniqueID(uint32_t &id)
Read unique ID.
Definition unit_BME688.cpp:430
float bsec2GetTemperatureOffset() const
Gets the temperature offset(Celsius)
Definition unit_BME688.hpp:847
bool measureSingleShot(bme688::bme68xData &data)
Take a single measurement.
Definition unit_BME688.hpp:833
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:621
float gas() const
Oldest measured gas (Ohm)
Definition unit_BME688.hpp:590
bool softReset()
Software reset.
Definition unit_BME688.cpp:444
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:803
bool bsec2IsSubscribed(const bsec_virtual_sensor_t id)
is virtual sensor Subscribed?
Definition unit_BME688.hpp:927
const bme688::bme68xConf & tphSetting() const
Gets the TPH setting.
Definition unit_BME688.hpp:526
bool readMode(bme688::Mode &m)
Read operation mode.
Definition unit_BME688.cpp:705
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:716
bool selfTest()
Self-test.
Definition unit_BME688.cpp:451
bme688::Mode mode() const
Current mode.
Definition unit_BME688.hpp:516
bool readOversamplingHumidity(bme688::Oversampling &os)
Read humidity oversampling.
Definition unit_BME688.cpp:591
bool readOversamplingTemperature(bme688::Oversampling &os)
Read temperature oversampling.
Definition unit_BME688.cpp:569
bool writeOversamplingTemperature(const bme688::Oversampling os)
Write temperature oversampling.
Definition unit_BME688.cpp:630
bool writeTPHSetting(const bme688::bme68xConf &s)
Write TPH setting.
Definition unit_BME688.cpp:559
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:696
void bsec2SetTemperatureOffset(const float offset)
Set the temperature offset(Celsius)
Definition unit_BME688.hpp:855
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:656
bool writeOversamplingPressure(const bme688::Oversampling os)
Write pressure oversampling.
Definition unit_BME688.cpp:643
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:778
bool writeHeaterSetting(const bme688::Mode mode, const bme688::bme68xHeatrConf &hs)
Write heater setting.
Definition unit_BME688.cpp:687
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:790
const bme688::bme68xCalibration & calibration() const
Gets the Calibration.
Definition unit_BME688.hpp:521
bool readCalibration(bme688::bme68xCalibration &c)
Read calibration.
Definition unit_BME688.cpp:456
bool bsec2UnsubscribeAll()
Unsubscribe current all sensors.
uint32_t bsec2Subscription() const
Gets the subscription bits.
Definition unit_BME688.hpp:936
float pressure() const
Oldest measured pressure (Pa)
Definition unit_BME688.hpp:580
const bme688::bme68xHeatrConf & heaterSetting() const
Gets the heater setting.
Definition unit_BME688.hpp:531
bool stopPeriodicMeasurement()
Stop periodic measurement.
Definition unit_BME688.hpp:814
int8_t ambientTemperature() const
Gets the ambient temperature.
Definition unit_BME688.hpp:536
uint32_t calculateMeasurementInterval(const bme688::Mode mode, const bme688::bme68xConf &s)
Calculation of measurement intervals without heater.
Definition unit_BME688.cpp:711
bool writeOversampling(const bme688::Oversampling t, const bme688::Oversampling p, const bme688::Oversampling h)
Write oversamplings.
Definition unit_BME688.cpp:613
config_t config() const
Gets the configuration.
Definition unit_BME688.hpp:494
float humidity() const
Oldest measured humidity (%)
Definition unit_BME688.hpp:585
float temperature() const
Oldest measured temperature (Celsius)
Definition unit_BME688.hpp:575
bool readTPHSetting(bme688::bme68xConf &s)
Read TPH setting.
Definition unit_BME688.cpp:554
For BME688.
Top level namespace of M5Stack.
Unit-related namespace.
Settings for begin.
Definition unit_BME688.hpp:446
uint32_t subscribe_bits
Subscribe BSEC2 sensors bits if start on begin.
Definition unit_BME688.hpp:455
bme688::ODR odr
Standby time between sequential mode measurement profiles if start on begin.
Definition unit_BME688.hpp:480
bme688::Oversampling oversampling_pressure
Pressure oversampling if start on begin.
Definition unit_BME688.hpp:474
bme688::Oversampling oversampling_temperature
Temperature oversampling if start on begin.
Definition unit_BME688.hpp:472
uint16_t heater_temperature
The heater temperature for forced mode degree Celsius if start on begin.
Definition unit_BME688.hpp:484
bme688::Mode mode
Measurement mode if start on begin.
Definition unit_BME688.hpp:470
bool start_periodic
Start periodic measurement on begin?
Definition unit_BME688.hpp:448
int8_t ambient_temperature
ambient temperature
Definition unit_BME688.hpp:450
bme688::Filter filter
Filter coefficient if start on begin.
Definition unit_BME688.hpp:478
bool heater_enable
Enable gas measurement if start on begin.
Definition unit_BME688.hpp:482
bme688::bsec2::SampleRate sample_rate
Sampling rate for BSEC2 if start on begin.
Definition unit_BME688.hpp:464
bme688::Oversampling oversampling_humidity
Humidity oversampling if start on begin.
Definition unit_BME688.hpp:476
uint16_t heater_duration
The heating duration for forced mode in milliseconds if start on begin.
Definition unit_BME688.hpp:486
Measurement data group.
Definition unit_BME688.hpp:290
float raw_temperature() const
Gets the raw temperature from bme68xData.
Definition unit_BME688.hpp:409
float raw_gas() const
Gets the raw gas resistance from bme68xData.
Definition unit_BME688.hpp:424
float raw_humidity() const
Gets the raw humidity from bme68xData.
Definition unit_BME688.hpp:419
float raw_pressure() const
Gets the raw pressure from bme68xData.
Definition unit_BME688.hpp:414
GasSensor heater-on time.
Definition unit_BME688.hpp:164
Factor factor() const
Gets the multiplication factor.
Definition unit_BME688.hpp:181
void factor(const Factor f)
Sets the multiplication factor.
Definition unit_BME688.hpp:195
uint8_t value
Use the value as it is in parallel mode.
Definition unit_BME688.hpp:221
static uint16_t to(const uint8_t v)
Conversion from register value to duration for Force/Sequential mode.
Definition unit_BME688.hpp:215
Factor
Multiplier in Forced mode.
Definition unit_BME688.hpp:172
uint8_t step() const
Gets the step value (0-63)
Definition unit_BME688.hpp:176
static uint8_t from(const uint16_t duration)
Conversion from duration to register value for Force/Sequential mode.
Definition unit_BME688.hpp:203
void step(const uint8_t s)
Sets the step value (0-63)
Definition unit_BME688.hpp:190
Setting for gas heater.
Definition unit_BME688.hpp:99
struct bme68x_data bme68xData
Raw data.
Definition unit_BME688.hpp:83
struct bme68x_conf bme68xConf
Setting for temperature, pressure, humidity...
Definition unit_BME688.hpp:93
Mode
Operation mode same as BME68X_xxx_MODE.
Definition unit_BME688.hpp:69
@ 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:112
Filter
IIR Filter setting.
Definition unit_BME688.hpp:132
@ 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:147
Oversampling
Sampling setting.
Definition unit_BME688.hpp:119
struct bme68x_dev bme68xDev
bme68x device
Definition unit_BME688.hpp:88