-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathSensorMonitor.cpp
More file actions
57 lines (53 loc) · 2.52 KB
/
SensorMonitor.cpp
File metadata and controls
57 lines (53 loc) · 2.52 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
/*
* WaterTankController project
* Copyright (c) 2026 Fedir Vilhota <fredy31415@gmail.com>
* This software is released under the MIT License.
* See the LICENSE file in the project root for full license information.
*/
// SensorMonitor.cpp
#include "SensorMonitor.h" // Включаємо свій же заголовок
#include "Constants.h"
#include <algorithm>
SensorMonitor::SensorMonitor()
// Ініціалізація констант-членів класу за допомогою списку ініціалізації
: _PIN_TRIG(PIN_TRIG),
_PIN_ECHO(PIN_ECHO),
_LEVEL_MIN(LEVEL_MIN),
_LEVEL_MAX(LEVEL_MAX)
{
pinMode(_PIN_TRIG, OUTPUT);
pinMode(_PIN_ECHO, INPUT);
digitalWrite(_PIN_TRIG, LOW);
for (int i = 0; i < _ROLLING_DISTANCE_WINDOW_SIZE; i++) {
_distanceReadingsForCurrent[i] = 0.0;
}
}
float SensorMonitor::getDistance() {
// Видаємо короткий LOW імпульс на TRIG, щоб переконатися, що він "чистий"
digitalWrite(_PIN_TRIG, LOW);
delayMicroseconds(2);
// Видаємо HIGH імпульс на TRIG протягом 10 мікросекунд, щоб запустити датчик
digitalWrite(_PIN_TRIG, HIGH);
delayMicroseconds(10);
digitalWrite(_PIN_TRIG, LOW);
// Вимірюємо тривалість HIGH імпульсу на ECHO-піні (час подорожі звуку)
unsigned long timeout = 30000; // 30ms timeout (~5m max distance)
long duration = pulseIn(_PIN_ECHO, HIGH, timeout);
// Розраховуємо відстань:
// Швидкість звуку в повітрі приблизно 343 метри/секунду, або 0.0343 см/мікросекунду.
// Імпульс проходить до об'єкта і повертається, тому ділимо на 2.
float rawDistance = duration * 0.0343 / 2;
if(rawDistance > _LEVEL_MIN)rawDistance=_LEVEL_MIN;
if(rawDistance < _LEVEL_MAX)rawDistance=_LEVEL_MAX;
_distanceReadingsForCurrent[_rollingDistanceIndex] = rawDistance;
_rollingDistanceIndex = (_rollingDistanceIndex + 1) % _ROLLING_DISTANCE_WINDOW_SIZE;
if(_rollingDistanceCount<_ROLLING_DISTANCE_WINDOW_SIZE) {
_rollingDistanceCount++;
return rawDistance;
} else {
float tempReadings[_ROLLING_DISTANCE_WINDOW_SIZE];
memcpy(tempReadings, _distanceReadingsForCurrent, sizeof(float) * _ROLLING_DISTANCE_WINDOW_SIZE);
std::sort(tempReadings, tempReadings + _ROLLING_DISTANCE_WINDOW_SIZE);
return tempReadings[_ROLLING_DISTANCE_WINDOW_CENTER];
}
}