M5Unit-ENV 1.4.0 git rev:c1b5980
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#if defined(CONFIG_IDF_TARGET_ESP32) || defined(CONFIG_IDF_TARGET_ESP32S3) || defined(CONFIG_IDF_TARGET_ESP32C3)
23#define UNIT_BME688_USING_BSEC2
24
25#if defined(ARDUINO)
26#include <bsec2.h>
27#else
28#include <inc/bsec_datatypes.h>
29#endif
30
31#endif
32
33#include <memory>
34#include <limits>
35#include <initializer_list>
36
37namespace m5 {
38namespace unit {
39
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,
130 MS_62_5,
131 MS_125,
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 };
157 inline uint8_t step() const
158 {
159 return value & 0x3F;
160 }
162 inline Factor factor() const
163 {
164 return static_cast<Factor>((value >> 6) & 0x03);
165 }
167
171 inline void step(const uint8_t s)
172 {
173 value = (value & ~0x3F) | (s & 0x3F);
174 }
176 inline void factor(const Factor f)
177 {
178 value = (value & ~(0x03 << 6)) | (m5::stl::to_underlying(f) << 6);
179 }
181
184 static uint8_t from(const uint16_t duration)
185 {
186 uint8_t f{};
187 uint16_t d{duration};
188 while (d > 0x3F) {
189 d >>= 2;
190 ++f;
191 }
192 return (f <= 0x03) ? ((uint8_t)d | (f << 6)) : 0xFF;
193 }
196 static uint16_t to(const uint8_t v)
197 {
198 constexpr uint16_t tbl[] = {1, 4, 16, 64};
199 return (v & 0x3F) * tbl[(v >> 6) & 0x03];
200 }
201
202 uint8_t value{};
203};
204
205#if defined(UNIT_BME688_USING_BSEC2)
206namespace bsec2 {
207
212enum class SampleRate : uint8_t {
213 Disabled,
214 LowPower,
215 UltraLowPower,
216 UltraLowPowerMeasurementOnDemand,
218 Scan,
219 Continuous,
220};
221
223template <typename T>
224void is_bsec_virtual_sensor_t()
225{
226 static_assert(std::is_same<T, bsec_virtual_sensor_t>::value, "Argument must be of type bsec_virtual_sensor_t");
227}
229
231inline uint32_t virtual_sensor_array_to_bits(const bsec_virtual_sensor_t* ss, const size_t len)
232{
233 uint32_t ret{};
234 for (size_t i = 0; i < len; ++i) {
235 ret |= ((uint32_t)1U) << ss[i];
236 }
237 return ret;
238}
239
243template <typename... Args>
244uint32_t subscribe_to_bits(Args... args)
245{
246 // In a C++17 or later environment, it can be written like this...
247 // static_assert(std::conjunction<std::is_same<Args, bsec_virtual_sensor_t>...>::value,
248 // "All arguments must be of type bsec_virtual_sensor_t");
249 int discard[] = {(is_bsec_virtual_sensor_t<Args>(), 0)...};
250 (void)discard;
251
252 bsec_virtual_sensor_t tmp[] = {args...};
253 constexpr size_t n = sizeof...(args);
254 return virtual_sensor_array_to_bits(tmp, n);
255}
256
257} // namespace bsec2
258#endif
259
264struct Data {
265 bme688::bme68xData raw{};
266#if defined(UNIT_BME688_USING_BSEC2)
267 bsecOutputs raw_outputs{};
268
270 float get(const bsec_virtual_sensor_t vs) const;
272 inline float iaq() const
273 {
274 return get(BSEC_OUTPUT_IAQ);
275 }
277 inline float static_iaq() const
278 {
279 return get(BSEC_OUTPUT_STATIC_IAQ);
280 }
282 inline float co2() const
283 {
284 return get(BSEC_OUTPUT_CO2_EQUIVALENT);
285 }
287 inline float voc() const
288 {
289 return get(BSEC_OUTPUT_BREATH_VOC_EQUIVALENT);
290 }
292 inline float temperature() const
293 {
294 return get(BSEC_OUTPUT_RAW_TEMPERATURE);
295 }
297 inline float pressure() const
298 {
299 return get(BSEC_OUTPUT_RAW_PRESSURE);
300 }
302 inline float humidity() const
303 {
304 return get(BSEC_OUTPUT_RAW_HUMIDITY);
305 }
307 inline float gas() const
308 {
309 return get(BSEC_OUTPUT_RAW_GAS);
310 }
312 inline bool gas_stabilization() const
313 {
314 return get(BSEC_OUTPUT_STABILIZATION_STATUS) == 1.0f;
315 }
317 inline bool gas_run_in_status() const
318 {
319 return get(BSEC_OUTPUT_RUN_IN_STATUS) == 1.0f;
320 }
322 inline float heat_compensated_temperature() const
323 {
324 return get(BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE);
325 }
327 inline float heat_compensated_humidity() const
328 {
329 return get(BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY);
330 }
332 inline float gas_percentage() const
333 {
334 return get(BSEC_OUTPUT_GAS_PERCENTAGE);
335 }
337 inline float gas_estimate_1() const
338 {
339 return get(BSEC_OUTPUT_GAS_ESTIMATE_1);
340 }
342 inline float gas_estimate_2() const
343 {
344 return get(BSEC_OUTPUT_GAS_ESTIMATE_2);
345 }
347 inline float gas_estimate_3() const
348 {
349 return get(BSEC_OUTPUT_GAS_ESTIMATE_3);
350 }
352 inline float gas_estimate_4() const
353 {
354 return get(BSEC_OUTPUT_GAS_ESTIMATE_4);
355 }
357 inline uint32_t gas_index() const
358 {
359 return get(BSEC_OUTPUT_RAW_GAS_INDEX);
360 }
362 inline float regression_estimate_1() const
363 {
364 return get(BSEC_OUTPUT_REGRESSION_ESTIMATE_1);
365 }
367 inline float regression_estimate_2() const
368 {
369 return get(BSEC_OUTPUT_REGRESSION_ESTIMATE_2);
370 }
372 inline float regression_estimate_3() const
373 {
374 return get(BSEC_OUTPUT_REGRESSION_ESTIMATE_3);
375 }
377 inline float regression_estimate_4() const
378 {
379 return get(BSEC_OUTPUT_REGRESSION_ESTIMATE_4);
380 }
381#endif
383 inline float raw_temperature() const
384 {
385 return raw.temperature;
386 }
388 inline float raw_pressure() const
389 {
390 return raw.pressure;
391 }
393 inline float raw_humidity() const
394 {
395 return raw.humidity;
396 }
398 inline float raw_gas() const
399 {
400 return raw.gas_resistance;
401 }
402};
403
404} // namespace bme688
405
412class UnitBME688 : public Component, public PeriodicMeasurementAdapter<UnitBME688, bme688::Data> {
413 M5_UNIT_COMPONENT_HPP_BUILDER(UnitBME688, 0x77);
414
415public:
420 struct config_t {
422 bool start_periodic{true};
425#if defined(UNIT_BME688_USING_BSEC2) || defined(DOXYGEN_PROCESS)
428
429 uint32_t subscribe_bits{1U << BSEC_OUTPUT_IAQ | 1U << BSEC_OUTPUT_RAW_TEMPERATURE |
430 1U << BSEC_OUTPUT_RAW_PRESSURE | 1U << BSEC_OUTPUT_RAW_HUMIDITY |
431 1U << BSEC_OUTPUT_RAW_GAS | 1U << BSEC_OUTPUT_STABILIZATION_STATUS |
432 1U << BSEC_OUTPUT_RUN_IN_STATUS};
438 bme688::bsec2::SampleRate sample_rate{bme688::bsec2::SampleRate::LowPower};
439#endif
440#if !defined(UNIT_BME688_USING_BSEC2) || defined(DOXYGEN_PROCESS)
443
444 bme688::Mode mode{bme688::Mode::Forced};
450 bme688::Oversampling oversampling_humidity{bme688::Oversampling::x16};
452 bme688::Filter filter{bme688::Filter::None};
454 bme688::ODR odr{bme688::ODR::None};
456 bool heater_enable{true};
458 uint16_t heater_temperature{300};
460 uint16_t heater_duration{100};
462#endif
463 };
464
467
468 inline config_t config() const
469 {
470 return _cfg;
471 }
473 inline void config(const config_t& cfg)
474 {
475 _cfg = cfg;
476 }
478
479 explicit UnitBME688(const uint8_t addr = DEFAULT_ADDRESS);
480 virtual ~UnitBME688()
481 {
482 }
483
484 virtual bool begin() override;
485 virtual void update(const bool force = false) override;
486
490 inline bme688::Mode mode() const
491 {
492 return _mode;
493 }
496 {
497 return _dev.calib;
498 }
500 inline const bme688::bme68xConf& tphSetting() const
501 {
502 return _tphConf;
503 }
506 {
507 return _heaterConf;
508 }
510 inline int8_t ambientTemperature() const
511 {
512 return _dev.amb_temp;
513 }
515
518#if defined(UNIT_BME688_USING_BSEC2)
523 inline float iaq() const
524 {
525 return !empty() ? oldest().iaq() : std::numeric_limits<float>::quiet_NaN();
526 }
528 inline float temperature() const
529 {
530 return !empty() ? oldest().temperature() : std::numeric_limits<float>::quiet_NaN();
531 }
533 inline float pressure() const
534 {
535 return !empty() ? oldest().pressure() : std::numeric_limits<float>::quiet_NaN();
536 }
538 inline float humidity() const
539 {
540 return !empty() ? oldest().humidity() : std::numeric_limits<float>::quiet_NaN();
541 }
543 inline float gas() const
544 {
545 return !empty() ? oldest().gas() : std::numeric_limits<float>::quiet_NaN();
546 }
547#else
549 inline float temperature() const
550 {
551 return !empty() ? oldest().raw_temperature() : std::numeric_limits<float>::quiet_NaN();
552 }
554 inline float pressure() const
555 {
556 return !empty() ? oldest().raw_pressure() : std::numeric_limits<float>::quiet_NaN();
557 }
559 inline float humidity() const
560 {
561 return !empty() ? oldest().raw_humidity() : std::numeric_limits<float>::quiet_NaN();
562 }
564 inline float gas() const
565 {
566 return !empty() ? oldest().raw_gas() : std::numeric_limits<float>::quiet_NaN();
567 }
568#endif
570
571#if 0
577 inline uint8_t numberOfRawData() const
578 {
579 return _num_of_data;
580 }
588 inline const bme688::bme68xData* data(const uint8_t idx)
589 {
590 return (idx < _num_of_data) ? &_raw_data[idx] : nullptr;
591 }
592#endif
593
595 inline void setAmbientTemperature(const int8_t temp)
596 {
597 _dev.amb_temp = temp;
598 }
601 [[deprecated("Use setAmbientTemperature")]] inline void setAambientTemperature(const int8_t temp)
602 {
604 }
627 bool readUniqueID(uint32_t& id);
632 bool softReset();
637 bool selfTest();
643 bool writeMode(const bme688::Mode m);
649 bool readMode(bme688::Mode& m);
650
653
688 bool writeTPHSetting(const bme688::bme68xConf& s);
720 bool writeIIRFilter(const bme688::Filter f);
722
725
740
743
751 {
752 return PeriodicMeasurementAdapter<UnitBME688, bme688::Data>::startPeriodicMeasurement(m);
753 }
754#if defined(UNIT_BME688_USING_BSEC2) || defined(DOXYGEN_PROCESS)
761 inline bool startPeriodicMeasurement(const uint32_t subscribe_bits,
762 const bme688::bsec2::SampleRate sr = bme688::bsec2::SampleRate::LowPower)
763 {
764 return PeriodicMeasurementAdapter<UnitBME688, bme688::Data>::startPeriodicMeasurement(subscribe_bits, sr);
765 }
773 inline bool startPeriodicMeasurement(const bsec_virtual_sensor_t* ss, const size_t len,
774 const bme688::bsec2::SampleRate sr = bme688::bsec2::SampleRate::LowPower)
775 {
776 return ss ? startPeriodicMeasurement(bme688::bsec2::virtual_sensor_array_to_bits(ss, len), sr) : false;
777 }
778
779#endif
785 {
786 return PeriodicMeasurementAdapter<UnitBME688, bme688::Data>::stopPeriodicMeasurement();
787 }
789
792
802
803#if defined(UNIT_BME688_USING_BSEC2) || defined(DOXYGEN_PROCESS)
807
811 {
812 return _temperatureOffset;
813 }
818 void bsec2SetTemperatureOffset(const float offset)
819 {
820 _temperatureOffset = offset;
821 }
827 const bsec_version_t& bsec2Version() const
828 {
829 return _bsec2_version;
830 }
839 bool bsec2SetConfig(const uint8_t* cfg, const size_t sz = BSEC_MAX_PROPERTY_BLOB_SIZE);
847 bool bsec2GetConfig(uint8_t* cfg, uint32_t& actualSize);
853 bool bsec2SetState(const uint8_t* state);
861 bool bsec2GetState(uint8_t* state, uint32_t& actualSize);
870 bool bsec2UpdateSubscription(const uint32_t sensorBits, const bme688::bsec2::SampleRate sr);
880 inline bool bsec2UpdateSubscription(const bsec_virtual_sensor_t* ss, const size_t len,
881 const bme688::bsec2::SampleRate sr)
882 {
883 return bsec2UpdateSubscription(bme688::bsec2::virtual_sensor_array_to_bits(ss, len), sr);
884 }
890 inline bool bsec2IsSubscribed(const bsec_virtual_sensor_t id)
891 {
892 return _bsec2_subscription & (1U << id);
893 }
899 uint32_t bsec2Subscription() const
900 {
901 return _bsec2_subscription;
902 }
909 bool bsec2Subscribe(const bsec_virtual_sensor_t id);
915 bool bsec2Unsubscribe(const bsec_virtual_sensor_t id);
922#endif
923
924protected:
925 static int8_t read_function(uint8_t reg_addr, uint8_t* reg_data, uint32_t length, void* intf_ptr);
926 static int8_t write_function(uint8_t reg_addr, const uint8_t* reg_data, uint32_t length, void* intf_ptr);
927
928 bool start_periodic_measurement(const bme688::Mode m);
929 bool stop_periodic_measurement();
930#if defined(UNIT_BME688_USING_BSEC2)
931 bool start_periodic_measurement(const uint32_t subscribe_bits, const bme688::bsec2::SampleRate sr);
932#endif
933
934 bool write_mode_forced();
935 bool write_mode_parallel();
936 bool fetch_data();
937
938 void update_bme688(const bool force);
939 bool read_measurement();
940#if defined(UNIT_BME688_USING_BSEC2)
941 bool process_data(bsecOutputs& outputs, const int64_t ns, const bme688::bme68xData& data);
942 void update_bsec2(const bool force);
943#endif
944
945 inline virtual bool in_periodic() const override
946 {
947 return _periodic || (_bsec2_subscription != 0);
948 }
949
950 M5_UNIT_COMPONENT_PERIODIC_MEASUREMENT_ADAPTER_HPP_BUILDER(UnitBME688, bme688::Data);
951
952protected:
953 bme688::Mode _mode{bme688::Mode::Sleep};
954
955 // bme68x
956 bme688::bme68xData _raw_data[3]{}; // latest data
957 uint8_t _num_of_data{};
958 bme688::bme68xDev _dev{};
959 bme688::bme68xConf _tphConf{};
960 bme688::bme68xHeatrConf _heaterConf{};
961
962 // BSEC2
963 uint32_t _bsec2_subscription{}; // Enabled virtual sensor bit
964
965#if defined(UNIT_BME688_USING_BSEC2)
966 bsec_version_t _bsec2_version{};
967 std::unique_ptr<uint8_t> _bsec2_work{};
968 bsec_bme_settings_t _bsec2_settings{};
969
970 bme688::Mode _bsec2_mode{};
971 bme688::bsec2::SampleRate _bsec2_sr{};
972
973 bsecOutputs _outputs{};
974 float _temperatureOffset{};
975#endif
976
977 std::unique_ptr<m5::container::CircularBuffer<bme688::Data>> _data{};
978
979 bool _waiting{};
980 types::elapsed_time_t _can_measure_time{};
981
982 config_t _cfg{};
983};
984
986namespace bme688 {
987namespace command {
988constexpr uint8_t CHIP_ID{0xD0};
989constexpr uint8_t RESET{0xE0};
990constexpr uint8_t VARIANT_ID{0xF0};
991
992constexpr uint8_t IDAC_HEATER_0{0x50}; // ...9
993constexpr uint8_t RES_HEAT_0{0x5A}; // ...9
994constexpr uint8_t GAS_WAIT_0{0x64}; // ...9
995constexpr uint8_t GAS_WAIT_SHARED{0x6E};
996
997constexpr uint8_t CTRL_GAS_0{0x70};
998constexpr uint8_t CTRL_GAS_1{0x71};
999constexpr uint8_t CTRL_HUMIDITY{0x72};
1000constexpr uint8_t CTRL_MEASUREMENT{0x74};
1001constexpr uint8_t CONFIG{0x75};
1002
1003constexpr uint8_t MEASUREMENT_STATUS_0{0x1D};
1004constexpr uint8_t MEASUREMENT_STATUS_1{0x2E};
1005constexpr uint8_t MEASUREMENT_STATUS_2{0x3F};
1006
1007constexpr uint8_t MEASUREMENT_GROUP_INDEX_0{0x1F};
1008constexpr uint8_t MEASUREMENT_GROUP_INDEX_1{0x30};
1009constexpr uint8_t MEASUREMENT_GROUP_INDEX_2{0x41};
1010
1011constexpr uint8_t UNIQUE_ID{0x83};
1012
1013// calibration
1014constexpr uint8_t CALIBRATION_GROUP_0{0x8A};
1015constexpr uint8_t CALIBRATION_GROUP_1{0xE1};
1016constexpr uint8_t CALIBRATION_GROUP_2{0x00};
1017constexpr uint8_t CALIBRATION_TEMPERATURE_1_LOW{0xE9};
1018constexpr uint8_t CALIBRATION_TEMPERATURE_2_LOW{0x8A};
1019constexpr uint8_t CALIBRATION_TEMPERATURE_3{0x8C};
1020constexpr uint8_t CALIBRATION_PRESSURE_1_LOW{0x8E};
1021constexpr uint8_t CALIBRATION_PRESSURE_2_LOW{0x90};
1022constexpr uint8_t CALIBRATION_PRESSURE_3{0x92};
1023constexpr uint8_t CALIBRATION_PRESSURE_4_LOW{0x94};
1024constexpr uint8_t CALIBRATION_PRESSURE_5_LOW{0x96};
1025constexpr uint8_t CALIBRATION_PRESSURE_6{0x99};
1026constexpr uint8_t CALIBRATION_PRESSURE_7{0x98};
1027constexpr uint8_t CALIBRATION_PRESSURE_8_LOW{0x9C};
1028constexpr uint8_t CALIBRATION_PRESSURE_9_LOW{0x9E};
1029constexpr uint8_t CALIBRATION_PRESSURE_10{0xA0};
1030constexpr uint8_t CALIBRATION_HUMIDITY_12{0xE2};
1031constexpr uint8_t CALIBRATION_HUMIDITY_1_HIGH{0xE3};
1032constexpr uint8_t CALIBRATION_HUMIDITY_2_HIGH{0xE1};
1033constexpr uint8_t CALIBRATION_HUMIDITY_3{0xE4};
1034constexpr uint8_t CALIBRATION_HUMIDITY_4{0xE5};
1035constexpr uint8_t CALIBRATION_HUMIDITY_5{0xE6};
1036constexpr uint8_t CALIBRATION_HUMIDITY_6{0xE7};
1037constexpr uint8_t CALIBRATION_HUMIDITY_7{0xE8};
1038constexpr uint8_t CALIBRATION_GAS_1{0xED};
1039constexpr uint8_t CALIBRATION_GAS_2_LOW{0xEB};
1040constexpr uint8_t CALIBRATION_GAS_3{0xEE};
1041constexpr uint8_t CALIBRATION_RES_HEAT_RANGE{0x02}; // [5:4]
1042constexpr uint8_t CALIBRATION_RES_HEAT_VAL{0x00};
1043
1044} // namespace command
1045} // namespace bme688
1047
1048} // namespace unit
1049} // namespace m5
1050#endif
BME688 unit.
Definition unit_BME688.hpp:412
void config(const config_t &cfg)
Set the configuration.
Definition unit_BME688.hpp:473
bool bsec2Unsubscribe(const bsec_virtual_sensor_t id)
Unsubscribe virtual sensor.
bool writeIIRFilter(const bme688::Filter f)
Write IIRFilter.
Definition unit_BME688.cpp:668
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:880
bool readHeaterSetting(bme688::bme68xHeatrConf &hs)
Read heater setting.
Definition unit_BME688.cpp:681
bool bsec2SetState(const uint8_t *state)
Restore the internal state.
bool readOversamplingPressure(bme688::Oversampling &os)
Read pressure oversampling.
Definition unit_BME688.cpp:579
const bsec_version_t & bsec2Version() const
Gets the BSEC2 library version.
Definition unit_BME688.hpp:827
void setAambientTemperature(const int8_t temp)
Sets the ambient temperature.
Definition unit_BME688.hpp:601
bool readIIRFilter(bme688::Filter &f)
Read IIRFilter.
Definition unit_BME688.cpp:601
bool writeCalibration(const bme688::bme68xCalibration &c)
write calibration
Definition unit_BME688.cpp:502
bool readUniqueID(uint32_t &id)
Read unique ID.
Definition unit_BME688.cpp:429
float bsec2GetTemperatureOffset() const
Gets the temperature offset(Celsius)
Definition unit_BME688.hpp:810
bool measureSingleShot(bme688::bme68xData &data)
Take a single measurement.
Definition unit_BME688.cpp:715
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:595
float gas() const
Oldest measured gas (Ohm)
Definition unit_BME688.hpp:564
bool softReset()
Software reset.
Definition unit_BME688.cpp:443
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:773
bool bsec2IsSubscribed(const bsec_virtual_sensor_t id)
is virtual sensor Subscribed?
Definition unit_BME688.hpp:890
const bme688::bme68xConf & tphSetting() const
Gets the TPH setting.
Definition unit_BME688.hpp:500
bool readMode(bme688::Mode &m)
Read operation mode.
Definition unit_BME688.cpp:704
bool bsec2UpdateSubscription(const uint32_t sensorBits, const bme688::bsec2::SampleRate sr)
Subscribe to library virtual sensors outputs.
bool selfTest()
Self-test.
Definition unit_BME688.cpp:450
bme688::Mode mode() const
Current mode.
Definition unit_BME688.hpp:490
bool readOversamplingHumidity(bme688::Oversampling &os)
Read humidity oversampling.
Definition unit_BME688.cpp:590
bool readOversamplingTemperature(bme688::Oversampling &os)
Read temperature oversampling.
Definition unit_BME688.cpp:568
bool writeOversamplingTemperature(const bme688::Oversampling os)
Write temperature oversampling.
Definition unit_BME688.cpp:629
bool writeTPHSetting(const bme688::bme68xConf &s)
Write TPH setting.
Definition unit_BME688.cpp:558
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:695
void bsec2SetTemperatureOffset(const float offset)
Set the temperature offset(Celsius)
Definition unit_BME688.hpp:818
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:655
bool writeOversamplingPressure(const bme688::Oversampling os)
Write pressure oversampling.
Definition unit_BME688.cpp:642
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:750
bool writeHeaterSetting(const bme688::Mode mode, const bme688::bme68xHeatrConf &hs)
Write heater setting.
Definition unit_BME688.cpp:686
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:761
const bme688::bme68xCalibration & calibration() const
Gets the Calibration.
Definition unit_BME688.hpp:495
bool readCalibration(bme688::bme68xCalibration &c)
Read calibration.
Definition unit_BME688.cpp:455
bool bsec2UnsubscribeAll()
Unsubscribe current all sensors.
uint32_t bsec2Subscription() const
Gets the subscription bits.
Definition unit_BME688.hpp:899
float pressure() const
Oldest measured pressure (Pa)
Definition unit_BME688.hpp:554
const bme688::bme68xHeatrConf & heaterSetting() const
Gets the heater setting.
Definition unit_BME688.hpp:505
bool stopPeriodicMeasurement()
Stop periodic measurement.
Definition unit_BME688.hpp:784
int8_t ambientTemperature() const
Gets the ambient temperature.
Definition unit_BME688.hpp:510
uint32_t calculateMeasurementInterval(const bme688::Mode mode, const bme688::bme68xConf &s)
Calculation of measurement intervals without heater.
Definition unit_BME688.cpp:710
bool writeOversampling(const bme688::Oversampling t, const bme688::Oversampling p, const bme688::Oversampling h)
Write oversamplings.
Definition unit_BME688.cpp:612
config_t config() const
Gets the configuration.
Definition unit_BME688.hpp:468
float humidity() const
Oldest measured humidity (%)
Definition unit_BME688.hpp:559
float temperature() const
Oldest measured temperature (Celsius)
Definition unit_BME688.hpp:549
bool readTPHSetting(bme688::bme68xConf &s)
Read TPH setting.
Definition unit_BME688.cpp:553
For BME688.
Top level namespace of M5Stack.
Unit-related namespace.
Settings for begin.
Definition unit_BME688.hpp:420
uint32_t subscribe_bits
Subscribe BSEC2 sensors bits if start on begin.
Definition unit_BME688.hpp:429
bme688::ODR odr
Standby time between sequential mode measurement profiles if start on begin.
Definition unit_BME688.hpp:454
bme688::Oversampling oversampling_pressure
Pressure oversampling if start on begin.
Definition unit_BME688.hpp:448
bme688::Oversampling oversampling_temperature
Temperature oversampling if start on begin.
Definition unit_BME688.hpp:446
uint16_t heater_temperature
The heater temperature for forced mode degree Celsius if start on begin.
Definition unit_BME688.hpp:458
bme688::Mode mode
Measurement mode if start on begin.
Definition unit_BME688.hpp:444
bool start_periodic
Start periodic measurement on begin?
Definition unit_BME688.hpp:422
int8_t ambient_temperature
ambient temperature
Definition unit_BME688.hpp:424
bme688::Filter filter
Filter coefficient if start on begin.
Definition unit_BME688.hpp:452
bool heater_enable
Enable gas measurement if start on begin.
Definition unit_BME688.hpp:456
bme688::bsec2::SampleRate sample_rate
Sampling rate for BSEC2 if start on begin.
Definition unit_BME688.hpp:438
bme688::Oversampling oversampling_humidity
Humidity oversampling if start on begin.
Definition unit_BME688.hpp:450
uint16_t heater_duration
The heating duration for forced mode in milliseconds if start on begin.
Definition unit_BME688.hpp:460
Measurement data group.
Definition unit_BME688.hpp:264
float raw_temperature() const
Gets the raw temperature from bme68xData.
Definition unit_BME688.hpp:383
float raw_gas() const
Gets the raw gas resistance from bme68xData.
Definition unit_BME688.hpp:398
float raw_humidity() const
Gets the raw humidity from bme68xData.
Definition unit_BME688.hpp:393
float raw_pressure() const
Gets the raw pressure from bme68xData.
Definition unit_BME688.hpp:388
GasSensor heater-on time.
Definition unit_BME688.hpp:145
Factor factor() const
Gets the multiplication factor.
Definition unit_BME688.hpp:162
void factor(const Factor f)
Sets the multiplication factor.
Definition unit_BME688.hpp:176
uint8_t value
Use the value as it is in parallel mode.
Definition unit_BME688.hpp:202
static uint16_t to(const uint8_t v)
Conversion from register value to duration for Force/Sequential mode.
Definition unit_BME688.hpp:196
Factor
Multiplier in Forced mode.
Definition unit_BME688.hpp:153
uint8_t step() const
Gets the step value (0-63)
Definition unit_BME688.hpp:157
static uint8_t from(const uint16_t duration)
Conversion from duration to register value for Force/Sequential mode.
Definition unit_BME688.hpp:184
void step(const uint8_t s)
Sets the step value (0-63)
Definition unit_BME688.hpp:171
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
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
Filter
IIR Filter setting.
Definition unit_BME688.hpp:113
@ 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:128
Oversampling
Sampling setting.
Definition unit_BME688.hpp:100
struct bme68x_dev bme68xDev
bme68x device
Definition unit_BME688.hpp:69