// Подключаем две библиотеки для работы с LCD и математических вычислений
#include <LiquidCrystal.h>
#include <math.h>
// Инициализируем объект-экран, передаём использованные
// для подключения контакты на Arduino в порядке:
// RS, E, D4, D5, D6, D7
LiquidCrystal lcd(12, 11, 10, 9, 8, 7);
const int windowSize = 10; //Количество чтений для усреднения
int arr_RawADC[3][windowSize]; //Массив для хранения последних значений
int RawADC[3] = {0, 0, 0}; //Мгновенные значения данных АЦП
int index = 0; //Индекс текущего значения
int AvrADC[3] = {0, 0, 0}; //Усредненные значения данных АЦП
int sum[3] = {0, 0, 0}; //Суммы
void setup(void)
{
lcd.begin(16, 2);
lcd.clear();
lcd.setCursor(0, 0);
// Заполняем буфер начальными значениями
for (int i = 0; i < windowSize; i++) {
arr_RawADC[0][i] = 0;
arr_RawADC[1][i] = 0;
arr_RawADC[2][i] = 0;
}
}
// Функция для перевода показаний датчика в градусы Цельсия
float Getterm(int RawADC)
{
float celsius = 1 / (log(1 / (1023. / RawADC - 1)) / 3950 + 1.0 / 298.15) - 273.15;
return celsius;
}
// Функция для вывода на экран показаний датчиков
void printTemp(int T1, int T2, int T3)
{
//Не очень изящно, но датчика всего 3 -- поменяться это число не может
float temp1 = Getterm(T1);
float temp2 = Getterm(T2);
float temp3 = Getterm(T3);
float avr = (temp1 + temp2 + temp3) / 3;
float minv = min(temp1, min(temp2, temp3));
float maxv = max(temp1, max(temp2, temp3));
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Min: Max: Avr: ");
lcd.setCursor(0, 1);
lcd.print(minv); lcd.print(" ");
lcd.print(maxv); lcd.print(" ");
lcd.print(avr);
//lcd.print(" C");
}
void loop(void)
{
//Читаем АЦП
RawADC[0] = analogRead(A0);
RawADC[1] = analogRead(A1);
RawADC[2] = analogRead(A2);
for (int i = 0; i < 3; ++i)
{
// Удаляем самый старый элемент из суммы
sum[i] = sum[i] - arr_RawADC[i][index];
// Добавляем новый элемент в буфер
arr_RawADC[i][index] = RawADC[i];
// Добавляем новый элемент к сумме
sum[i] = sum[i] + RawADC[i];
// Переходим к следующему индексу в круговом буфере
index = (index + 1) % windowSize;
// Вычисляем среднее значение
AvrADC[i] = sum[i] / windowSize;
}
printTemp(AvrADC[0], AvrADC[1], AvrADC[2]); // вывод температуры на экран
delay(100);
}