#include <LiquidCrystal_I2C.h> //подключаем библиотеку экрана
#include <microDS18B20.h>
MicroDS18B20<12> sensor;
LiquidCrystal_I2C lcd(0x27, 16, 2); // задаём параметры экрана
// пины
#define HC_TRIG 3
#define HC_ECHO 2
uint32_t myTimer1;
#define ALPHA 0.2 // Коэффициент сглаживания (0 < ALPHA < 1)
float filteredDistance = 0; // Переменная для хранения отфильтрованного значения
int temper;
void setup() {
Serial.begin(9600);
lcd.init();//инициализируем дисплей
lcd.backlight();//включаем подсветку дисплея
pinMode(HC_TRIG, OUTPUT); // trig выход
pinMode(HC_ECHO, INPUT); // echo вход
temper = sensor.getTemp();
}
void loop() {
float dist = getDist(temper); // получаем расстояние
float filteredDistance = getFilteredDistance(dist); // Обновляем отфильтрованное значение
Serial.print(dist);
Serial.print(" ");
Serial.print(filteredDistance);// выводим
Serial.print(" ");
Serial.println(temper);
delay(50);
if (millis()-myTimer1>=1000)
{
myTimer1=millis();
lcd.setCursor(0,0);
lcd.print(" ");
lcd.setCursor(0, 0);
lcd.print(filteredDistance);
}
}
// сделаем функцию для удобства
float getDist(int t) {
// импульс 10 мкс
digitalWrite(HC_TRIG, HIGH);
delayMicroseconds(10);
digitalWrite(HC_TRIG, LOW);
// измеряем время ответного импульса
uint32_t us = pulseIn(HC_ECHO, HIGH);
// Корректируем дистанцию с учетом температуры
// считаем расстояние и возвращаем
return (us * (t * 6 / 10 + 330) / 2000ul/10);
}
//Фильтр экспоненциальный
float getFilteredDistance(float newDistance) {
filteredDistance = (ALPHA * newDistance) + ((1 - ALPHA) * filteredDistance);
return filteredDistance;
}