#include <LiquidCrystal_I2C.h>
#include <GyverEncoder.h>
#define t1 A1
#define fan 5
LiquidCrystal_I2C lcd(0x27, 16, 2);
Encoder enc(2, 3, 4, TYPE2);
int8_t flag_menu, number, i, flag_tv;
int8_t tempRoom = 26, gesteresys = 3;
int8_t temp1, timer_pause = 3, timer_fan = 1;
int32_t timer1, timer2 = 3000, timer3 = 0, timer4 = 0;
//------------------------------------------------------
void setup() {
Serial.begin(9600);
pinMode(fan, OUTPUT);
pinMode(t1, INPUT);
lcd.init();
lcd.backlight();
}
//------------------------------------------------------
void loop() {
enc.tick();
if (!flag_menu) {
if (millis() - timer1 >= timer2) {
temp1 = Temperature(t1, 10000, 3435, 9900);
lcd_OUT(5, 0, " ", "t:");
lcd_OUT(8, 0, " ", String(temp1, DEC));
lcd.write(223);
timer1 = millis();
}
if (enc.isHolded()) { //если нажата и удержана кнопка то переходим в меню
flag_menu = 1, number = 1;
lcd.clear();
menu(number);
}
}
if (flag_menu == 1) menu1();
if (flag_menu == 2) menu2();
if (millis() - timer4 < timer_fan * 6000) {
digitalWrite(fan, HIGH);
timer3 = millis();
if (!flag_tv) lcd_OUT(6, 1, " ", "RUN");
flag_tv = 1;
}
else if (millis() - timer3 < timer_pause * 6000) {
digitalWrite(fan, LOW);
if (flag_tv) lcd_OUT(6, 1, " ", "STOP");
flag_tv = 0;
}
else timer4 = millis();
if (!digitalRead(fan)) if (temp1 > tempRoom) digitalWrite(fan, HIGH);
else if (temp1 <= tempRoom - gesteresys) 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;
case 3:
lcd_OUT(3, 0, " ", "TIME FAN");
lcd_OUT(7, 1, " ", String(timer_fan, DEC));
break;
case 4:
lcd_OUT(3, 0, " ", "TIME PAUSE");
lcd_OUT(7, 1, " ", String(timer_pause, DEC));
break;
}
}
//--------------------ВЫБОР МЕНЮ 1--------------------
void menu1() {
if (enc.isRight()) {
number += 1;
if (number >= 5) number = 1;
menu(number);
}
if (enc.isLeft()) {
number -= 1;
if (number <= 0) number = 4;
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;
}
if (number == 3) {
timer_fan += i;
}
if (number == 4) {
timer_pause += i;
}
menu(number);
}