#include <GyverNTC.h>;
#include <LiquidCrystal_I2C.h>;
#include <EncButton.h>;
#include <microDS18B20.h>
#define RELE_PIN 2
#define LedRed_PIN 12
#define LedGreen_PIN 11
#define LedBlue_PIN 10
bool NeedSerial = true; // включаем для вывода информации в ком-порт
bool NeedDallas = true; // включаем, если задействуем второй датчик температуры, Даллас
bool BackLight = false; // для работы кнопки
int Pause = 0; // будем ставить паузу черной кнопкой
Button btnMinDown(5);
Button btnMinUp(6);
Button btnMaxDown(7);
Button btnMaxUp(8);
Button btnLight(9);
Button btnPause(3); //
GyverNTC therm1(A1, 10000, 3950); // аналоговый термометр
MicroDS18B20<13> sensor; // цифровой термометр - Даллас на ножке Д13
LiquidCrystal_I2C lcd(0x27, 16, 2);
float TempRoom = 0; // температура в комнате с аналогового датчика
float TempRoomD = 0; // температура в комнате с Цифрового датчика
float TempMin = 23.0; // темпретатура, НИЖЕ которой включается обогрев
float TempMax = 23.5; // темпретатура, ВЫШЕ которой вЫключается обогрев
void setup() {
if (NeedSerial) {
Serial.begin(9600);
}; // если нужен вывод в ком, то будем выводить
lcd.init(); // инициализация
lcd.noBacklight(); // выключить подсветку
pinMode(LedRed_PIN, OUTPUT); // индикация при нагреве
pinMode(LedGreen_PIN, OUTPUT); //индикация при ненагреве
pinMode(LedBlue_PIN, OUTPUT); //индикация
pinMode(RELE_PIN, OUTPUT); // даем команду реле на нагрев
// Начало. Приветствие на дисплее
lcd.backlight(); // выключить подсветку
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("esaTemp v.05.01");
lcd.setCursor(0, 1);
lcd.print("Hello for all :)");
delay(2500);
lcd.clear();
lcd.noBacklight(); // выключить подсветку
// Конец. Приветствие на дисплее
}
void loop() {
TempRoom = therm1.getTempAverage(); // получаем данные от термометра 1
if (NeedSerial) {
Serial.println();
Serial.print("TempRoom: ");
Serial.print(TempRoom);
Serial.print(", TempMin: ");
Serial.print(TempMin);
Serial.print(", TempMax: ");
Serial.print(TempMax);
Serial.println();
Serial.print("Pause: ");
Serial.print(Pause);
}
// заполняем первую строку LCD 1602
lcd.setCursor(0, 0);
lcd.print("At");
lcd.write(223); // символ градуса
//lcd.print(" ");
lcd.print(TempRoom, 1);
// начало работы с Даллосом
// запрос температуры
sensor.requestTemp();
// вместо delay используй таймер на millis(), пример async_read
delay(1000);
// проверяем успешность чтения и выводим
if (sensor.readTemp())
{
TempRoomD = sensor.getTemp();
Serial.println(TempRoomD);
lcd.print(" Dt");
lcd.write(223); // символ градуса
//lcd.print(" ");
lcd.print(TempRoomD, 1);
}
else {
Serial.println("error");
TempRoomD = 0;
lcd.print(" Dt");
lcd.write(223); // символ градуса
//lcd.print(" ");
lcd.print("Err");
}
// конец работы с Даллосом
// заполняем вторую строку LCD 1602
lcd.setCursor(0, 1);
lcd.print(TempMin, 1); // чтобы был один знак после запятой
// lcd.write(223); // символ градуса
lcd.print(" ");
lcd.setCursor(5, 1);
lcd.write(127); //символ стрелка влево
lcd.write(45);
lcd.write(45);
lcd.write(45);
lcd.write(45);
lcd.write(126); // символ стрелка вправо
lcd.print(" ");
lcd.setCursor(12, 1);
lcd.print(TempMax, 1); // чтобы был один знак после запятой
lcd.print(" ");
// Управление нагревателем
if (TempRoom > TempMax) {
digitalWrite(RELE_PIN, LOW);
digitalWrite(LedRed_PIN, LOW);
digitalWrite(LedGreen_PIN, HIGH);
lcd.setCursor(0, 0);
// lcd.print(" ");
lcd.setCursor(12, 0);
// lcd.print(" ");
}
if (TempRoom < TempMin) {
digitalWrite(RELE_PIN, HIGH);
digitalWrite(LedRed_PIN, HIGH);
digitalWrite(LedGreen_PIN, LOW);
lcd.setCursor(0, 0);
// lcd.print("****");
lcd.setCursor(12, 0);
// lcd.print("****");
}
// отработка нажатия кнопки Пауза
if (Pause > 0) {
digitalWrite(LedBlue_PIN, LOW);
digitalWrite(LedRed_PIN, LOW);
digitalWrite(LedGreen_PIN, LOW);
lcd.clear();
lcd.setCursor(5, 0);
lcd.print("PAUSE");
while (Pause > 0) {
lcd.setCursor(4, 1);
lcd.print(SecondToTime(Pause));
lcd.print(" ");
digitalWrite(LedGreen_PIN, HIGH);
delay(400);
digitalWrite(LedGreen_PIN, LOW);
delay(200);
digitalWrite(LedBlue_PIN, HIGH);
delay(400);
digitalWrite(LedBlue_PIN, LOW);
Pause = Pause - 1;
}
digitalWrite(LedBlue_PIN, LOW);
digitalWrite(LedRed_PIN, LOW);
digitalWrite(LedGreen_PIN, LOW);
lcd.clear();
}
}
void yield() {
// это всё мимо delay!
// кнопка 1 - включение/выключение подсветки LCD1602
btnLight.tick(); // опрос кнопки происходит здесь
if (btnLight.click()) {
if (BackLight) lcd.noBacklight();
else lcd.backlight();
BackLight = !BackLight;
}
//
btnMinDown.tick(); // опрос кнопки происходит здесь
if (btnMinDown.click()) {
TempMin = TempMin - 0.5;
if ((TempMin + 0.5) > TempMax) {
TempMax = TempMin + 0.5;
}
}
btnMinUp.tick(); // опрос кнопки происходит здесь
if (btnMinUp.click()) {
TempMin = TempMin + 0.5;
if ((TempMin + 0.5) > TempMax) {
TempMax = TempMin + 0.5;
}
}
btnMaxDown.tick(); // опрос кнопки происходит здесь
if (btnMaxDown.click()) {
TempMax = TempMax - 0.5;
if ((TempMax - 0.5) < TempMin) {
TempMin = TempMax - 0.5;
};
}
btnMaxUp.tick(); // опрос кнопки происходит здесь
if (btnMaxUp.click()) {
TempMax = TempMax + 0.5;
if ((TempMax - 0.5) < TempMin) {
TempMin = TempMax - 0.5;
};
}
btnPause.tick(); // опрос кнопки происходит здесь
if (btnPause.click()) {
/*if (Pause < 1) {
Pause = 10;
} else {
Pause = 0;
}; */
switch (Pause) {
case 0 ... 10: Pause = 15; break;
case 11 ... 150: Pause = 160; break;
case 151 ... 300: Pause = 310; break;
case 301 ... 600: Pause = 610; break;
case 601 ... 900: Pause = 910; break;
case 901 ... 1200: Pause = 1210; break;
case 1201 ... 1500: Pause = 1510; break;
default:
Pause = 0;
break;
}
lcd.clear();
lcd.setCursor(5, 0);
lcd.print("PAUSE");
lcd.setCursor(4, 1);
lcd.print(SecondToTime(Pause));
lcd.print(" ");
};
}
// Моя функция - переводим значение в секундах в часы-минуты-секунды
String SecondToTime(int Second) {
// расчитаем часы, минуты, секунды
int hours = Second / 60 / 60;
int minutes = Second / 60 - (hours * 60);
int seconds = (Second - (hours * 60) - minutes * 60);
String h = "";
String m = "";
String s = "";
h = hours;
m = minutes;
s = seconds;
if (h.length() == 1) {
h = "0" + h;
};
if (m.length() == 1) {
m = "0" + m;
};
if (s.length() == 1) {
s = "0" + s;
};
return (h + ":" + m + ":" + s);
}