RangingSensor and bug fixed

Implemented RangingSensor driver and choice between barometer and RangingSensor. Reduced I/O load.
This commit is contained in:
2024-03-11 22:47:32 +07:00
parent 007a3fd16f
commit e27b3ca794
16 changed files with 208 additions and 73 deletions

View File

@@ -0,0 +1,43 @@
//
// Created by gogacoder on 10.03.24.
//
#include "RangingSensor.hpp"
#include "esp_log.h"
RangingSensor::RangingSensor(TwoWire &i2c, volatile bool loop_on_fail) {
_sensor = VL53L0X();
_sensor.setBus(&i2c);
if (_sensor.init()) {
_sensor.setMeasurementTimingBudget(20000);
_sensor.setTimeout(25);
ESP_LOGI(_tag, "Sensor initialized");
} else {
ESP_LOGE(_tag, "Failed to initialize RangingSensor!");
while (loop_on_fail) {}
}
_sensor.startContinuous(10);
}
void RangingSensor::startFlight() {
_start_distance = _distance;
}
void RangingSensor::tick() {
_distance = (uint32_t) round(runMiddleArifm((float) _sensor.readRangeContinuousMillimeters())) / 10;
}
uint32_t RangingSensor::getDistance() {
return _distance - _start_distance;
}
float RangingSensor::runMiddleArifm(float newVal) {
static int t = 0;
static float vals[_MID_ARITM_WINDOW];
static float average = 0;
if (++t >= _MID_ARITM_WINDOW) t = 0; // перемотка t
average -= vals[t]; // вычитаем старое
average += newVal; // прибавляем новое
vals[t] = newVal; // запоминаем в массив
return ((float) average / _MID_ARITM_WINDOW);
}