Банк проектов 8-11 Банк проектов 8-11 кл | Page 24
digitalWrite(dispVCC, 1);
digitalWrite(buttGND, 0);
}
void loop() {
if (millis() - sensTimer > 50) { // измерение и вывод каждые 50 мс
// счётчик от 0 до 2
// каждую итерацию таймера i последовательно принимает значения 0, 1, 2, и так по
кругу
if (i > 1) i = 0;
else i++;
dist_3[i] = (float)sonar.ping() / 57.5; // получить расстояние в текущую ячейку массива
if (!digitalRead(buttPIN)) dist_3[i] += case_offset; // если включен переключатель стороны
измерения, прибавить case_offset
dist = middle_of_3(dist_3[0], dist_3[1], dist_3[2]); // фильтровать медианным фильтром
из 3-х последних измерений
delta = abs(dist_filtered - dist); // расчёт изменения с предыдущим
if (delta > 1) k = 0.7; // если большое - резкий коэффициент
else k = 0.1; // если маленькое - плавный коэффициент
dist_filtered = dist * k + dist_filtered * (1 - k);
// фильтр "бегущее среднее"
disp.clear(); // очистить дисплей
disp.float_dot(dist_filtered, 1); // вывести
sensTimer = millis(); // сбросить таймер
}
if (micros() - dispIsrTimer > 300) { // таймер динамической индикации
disp.timerIsr(); // включить дисплей
dispIsrTimer = micros(); // сбросить таймер
}
}
// медианный фильтр из 3-х значений
float middle_of_3(float a, float b, float c) {
if ((a <= b) && (a <= c)) {
middle = (b <= c) ? b : c;
}
else {
if ((b <= a) && (b <= c)) {
middle = (a <= c) ? a : c;
}
else {
middle = (a <= b) ? a : b;
24