#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
Button btnMinDown(5);
Button btnMinUp(6);
Button btnMaxDown(7);
Button btnMaxUp(8);
Button btnLight(9);
Button btnSet(3); // пока не задействована
GyverNTC therm1(A1, 10000, 3950); // аналоговый термометр
MicroDS18B20<13> sensor; // цифровой термометр - Даллас на ножке Д13
LiquidCrystal_I2C lcd(0x27, 16, 2);
float TempRoom = 0; // температура в комнате с аналогового датчика
float TempRoomD = 0; // температура в комнате с Цифрового датчика
float TempMin = 22.5; // темпретатура, НИЖЕ которой включается обогрев
float TempMax = 23.0; // темпретатура, ВЫШЕ которой вЫключается обогрев
bool NeedSerial = true; // включаем для вывода информации в ком-порт
bool BackLight = false; // для работы кнопки
void setup() {
if (NeedSerial) { Serial.begin(9600); }; // если нужен вывод в ком, то будем выводить
lcd.init(); // инициализация
lcd.noBacklight(); // выключить подсветку
pinMode(LedRed_PIN, OUTPUT); // индикация при нагреве
pinMode(LedGreen_PIN, OUTPUT); //индикация при ненагреве
pinMode(RELE_PIN, OUTPUT); // даем команду реле на нагрев
// Начало. Приветствие на дисплее
lcd.backlight(); // выключить подсветку
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("esaTemp v.2.0");
lcd.setCursor(0, 1);
lcd.print("Hello for all :)");
delay(1500);
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);
}
// заполняем первую строку 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.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("****");
}
// delay(500);
}
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; };
}
}