RangingSensor and bug fixed
Implemented RangingSensor driver and choice between barometer and RangingSensor. Reduced I/O load.
This commit is contained in:
43
src/Sensors/RangingSensor.cpp
Normal file
43
src/Sensors/RangingSensor.cpp
Normal 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);
|
||||
}
|
||||
Reference in New Issue
Block a user