#include <LiquidCrystal_I2C.h>
#include <GyverEncoder.h>
#define t1 A1
#define t2 A2
#define t3 A3
#define fan 5
LiquidCrystal_I2C lcd(0x27, 16, 2);
Encoder enc(2, 3, 4, TYPE2);
int8_t flag_menu, number, i;
int8_t tempRoom = 21, gesteresys = 10;
int8_t temp1, temp2, temp3;
int32_t timer1, timer2;
//------------------------------------------------------
void setup() {
Serial.begin(9600);
pinMode(fan, OUTPUT);
pinMode(t1, INPUT);
pinMode(t2, INPUT);
pinMode(t3, INPUT);
lcd.init();
lcd.backlight();
}
//------------------------------------------------------
void loop() {
enc.tick();
if (!flag_menu) {
if (millis() - timer1 >= timer2) {
temp1 = Temperature(t1, 10000, 3435, 9900);
lcd_OUT(0, 0, " ", "INP:");
lcd_OUT(4, 0, " ", String(temp1, DEC));
lcd.write(223);
temp2 = Temperature(t2, 10000, 3435, 9900);
lcd_OUT(8, 0, " ", "OUT:");
lcd_OUT(12, 0, " ", String(temp2, DEC));
lcd.write(223);
temp3 = Temperature(t3, 10000, 3435, 9900);
lcd_OUT(0, 1, " ", "TEMP ROOM:");
lcd_OUT(10, 1, " ", String(temp3, DEC));
lcd.write(223);
timer1 = millis();
timer2 = 3000;
}
if (enc.isHolded()) { //если нажата и удержана кнопка то переходим в меню
flag_menu = 1, number = 1;
lcd.clear();
menu(number);
}
}
if (flag_menu == 1) menu1();
if (flag_menu == 2) menu2();
if (temp3 <= tempRoom && temp2 >= temp1) digitalWrite(fan, HIGH);
else if (temp3 > tempRoom || temp2 + gesteresys < temp1) digitalWrite(fan, LOW);
}
//--------------------Вывод данных на дисплей--------------------
void lcd_OUT(int8_t col, int8_t row, String str, String str1){
lcd.setCursor(col, row);
lcd.print(str);
lcd.setCursor(col, row);
lcd.print(str1);
}
//--------------------Измерение температуры--------------------
int8_t Temperature(int8_t pin, int16_t THERMISTORNOMINAL, int16_t BCOEFFICIENT, int16_t SERIESRESISTOR) {
int8_t NUMSAMPLES = 50; // сколько показаний берется для определения среднего значения
int8_t TEMPERATURENOMINAL = 25; // t. для номинального сопротивления (практически всегда равна 25 C)
int samples[NUMSAMPLES];
uint8_t i;
float average;
for (i = 0; i < NUMSAMPLES; i++) {
samples[i] = analogRead(pin);
delay(1);
}
// определяем среднее значение
average = 0;
for (i = 0; i < NUMSAMPLES; i++) {
average += samples[i];
}
average /= NUMSAMPLES;
average = 1023 / average - 1;
average = SERIESRESISTOR / average;
int8_t steinhart;
steinhart = ceil((BCOEFFICIENT * 298.15) / (BCOEFFICIENT + (298.15 * log(average / THERMISTORNOMINAL))) - 273.15);
return steinhart;
}
//--------------------МЕНЮ--------------------
void menu(int8_t mode) {
switch(mode) {
case 1:
lcd_OUT(3, 0, " ", "TEMP. ROOM");
lcd_OUT(7, 1, " ", String(tempRoom, DEC));
break;
case 2:
lcd_OUT(3, 0, " ", "GESTERESYS");
lcd_OUT(7, 1, " ", String(gesteresys, DEC));
break;
}
}
//--------------------ВЫБОР МЕНЮ 1--------------------
void menu1() {
if (enc.isRight()) {
if (number == 1) {
number = 2;
menu(number);
}
else if (number == 2) {
number = 1;
menu(number);
}
}
if (enc.isClick()) {
flag_menu = 2;
lcd_OUT(6, 1, " ", ">");
}
if (enc.isHolded()) {
flag_menu = 0;
lcd.clear();
}
}
//--------------------ВЫБОР МЕНЮ 2--------------------
void menu2() {
if (enc.isRight()) {
i++;
sum(number, i);
i = 0;
}
if (enc.isLeft()) {
i--;
sum(number, i);
i = 0;
}
if (enc.isClick()) {
flag_menu = 1;
lcd_OUT(6, 1, " ", " ");
}
}
//--------------------МЕНЯЕМ НАСТРУЙКИ--------------------
void sum(int8_t number, int8_t i) {
if (number == 1) {
tempRoom += i;
}
if (number == 2) {
gesteresys += i;
}
menu(number);
}