#include <LiquidCrystal.h>
#include <math.h>
#include "button.h"
#define GREEN_NTC A0
#define BLUE_NTC A1
#define YELLOW_NTC A2
timer_ period(100);
button_ button(2, INPUT_PULLUP);
enum { MAX, MID, MIN } tempType = MID;
LiquidCrystal lcd(12, 11, 10, 9, 8, 7);
byte celsius[8] =
{
B00111,
B00101,
B00111,
B00000,
B00000,
B00000,
B00000
};
// Функция для перевода показаний датчика в градусы Цельсия
float getTemp(float RawADC)
{
float celsius = 1 / (log(1 / (1023. / RawADC - 1)) / 3950 + 1.0 / 298.15) - 273.15;
return celsius;
}
const byte qty = 10;
float greenPoll[qty] = {};
float bluePoll[qty] = {};
float yellowPoll[qty] = {};
float max = 0;
float mid = 0;
float min = 0;
byte count = 0;
inline void NTCWorker()
{
if (count < qty)
{
greenPoll[count] = analogRead(GREEN_NTC);
bluePoll[count] = analogRead(BLUE_NTC);
yellowPoll[count] = analogRead(YELLOW_NTC);
count++;
}
else
{
float averageGR = 0.0;
float averageBL = 0.0;
float averageYL = 0.0;
for (byte i = 0; i < qty; ++i) {
averageGR += greenPoll[i];
averageBL += bluePoll[i];
averageYL += yellowPoll[i];
}
averageGR /= qty;
averageBL /= qty;
averageYL /= qty;
max = averageGR < averageBL ? (averageGR < averageYL ? averageGR : averageYL) : (averageBL < averageYL ? averageBL : averageYL);
mid = averageGR > averageBL ? (averageGR > averageYL ? (averageYL > averageBL ? averageYL : averageBL) : averageGR) : (averageBL > averageYL ? (averageYL > averageGR ? averageYL : averageGR) : averageBL);
min = averageGR > averageBL ? (averageGR > averageYL ? averageGR : averageYL) : (averageBL > averageYL ? averageBL : averageYL);
max = getTemp(max);
mid = getTemp(mid);
min = getTemp(min);
count = 0;
}
}
inline void printTemp()
{
lcd.clear();
lcd.setCursor(0, 0);
if (tempType == MAX)
{
lcd.print("Max temperature:");
lcd.setCursor(0, 1);
lcd.print(max);
lcd.write(byte(0));
lcd.print('C');
}
else if (tempType == MID)
{
lcd.print("Mid temperature:");
lcd.setCursor(0, 1);
lcd.print(mid);
lcd.write(byte(0));
lcd.print('C');
}
else
{
lcd.print("Min temperature:");
lcd.setCursor(0, 1);
lcd.print(min);
lcd.write(byte(0));
lcd.print('C');
}
}
void setup(void)
{
lcd.begin(16, 2);
lcd.setCursor(0, 0);
lcd.createChar(0, celsius);
period.restart();
}
void loop(void)
{
if (button.onPressed())
{
if (tempType == MAX) tempType = MID;
else if (tempType == MID) tempType = MIN;
else tempType = MAX;
}
if (period.isExpired())
{
NTCWorker();
period.restart();
}
printTemp();
}