72 lines
2.0 KiB
C++
72 lines
2.0 KiB
C++
#include "GyverBME280.h"
|
|
|
|
typedef std::function<void()> 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]
|
|
}; |