#include "GyverBME280.h" typedef std::function OnMeasuringFinishedCb; class Barometer { public: Barometer(GyverBME280 *bme) { _bme = bme; }; ~Barometer() { delete this->_bme; } bool initialize(void) { _bme->setMode(NORMAL_MODE); _bme->setFilter(FILTER_COEF_16); _bme->setTempOversampling(OVERSAMPLING_2); _bme->setPressOversampling(OVERSAMPLING_16); _bme->setStandbyTime(STANDBY_500US); return _bme->begin(); } void measureBaseAltitudeSync(void) { for (int i = 0; i < _calibrationIterationsCount; ++i) { _startedAltitude += altitude(); delay(_calibrationIterationDelay); } _startedAltitude /= _calibrationIterationsCount; } void measureBaseAltitudeAsync(void) { _isCalibration = true; } float altitude() /* [cm] */ { return pressureToAltitude(_bme->readPressure()) * 100; } float flightHeight() /* [cm] */ { return altitude() - _startedAltitude; } void onMeasuaringHeightFinished(OnMeasuringFinishedCb callback) { _measuaringHeightFinishedCb = callback; } void tick() { if (_isCalibration) { if (millis() - _calibrationTimer >= _calibrationIterationDelay) { _startedAltitude += altitude(); } if (++_calibrationIterationsCounter >= _calibrationIterationsCount) { _startedAltitude /= _calibrationIterationsCount; _isCalibration = false; if (_measuaringHeightFinishedCb) { _measuaringHeightFinishedCb(); } } } } private: GyverBME280 *_bme; float _startedAltitude = 0; bool _isCalibration = false; uint32_t _calibrationTimer = 0; int _calibrationIterationsCounter = 0; OnMeasuringFinishedCb _measuaringHeightFinishedCb = nullptr; static constexpr int _calibrationIterationsCount = 1500; static constexpr int _calibrationIterationDelay = 1; // [ms] };