Вентиляция цокольного этажа с сенсорным управлением.
- Войдите на сайт для отправки комментариев
Всем привет. В кратце с чего все это началось. Имеется цокольный этаж с тремя комнатами, пока нежилые.
При закрытых окнах постоянно повышается влажность. Принято решение поставить в каждой комнате по два вентилятора: вытяжной и приточный. В интернете начались поиски какого нибудь блока управления вентиляторами в зависимости от влажности на улице и в помещении. Ничего путевого не нашлось, но наткнулся на статьи о вениляции на ардуино. После изучения информации про ардуино я вспомнил что 15 лет назад изучал язык с. и с++. Пару недель ушло на то что бы вспомнить язык програмирования и снова научится читать код. Написаный код не универсален и возможно не очень аккуратен но, так получилось.
После чего были куплены: ардуино мега, tft шилд, 4 DHT22 и два блока реле, та как каждый вентилятор включается отдельно, всего 6. Но как говорится легких путей не ищем, было решено делать все на сенсорном управлении. Кстати в какой то момент я пожалел что сделал 7 кнопок, когда пытался написать условие включения и выключения каждой кнопки, думал не получится.
Что получилось: 7 сенсорных кнопок, 3 кнопки включения принудительной вентиляции отдельно в каждой комнате, 3 кнопки включения вытяжки отдельно в каждой комнате и 1 кнопка вкючения автоматической вентиляции. В автоматическом режиме есть толька одна настройка в окне информации, температура выключения вентиляторов в зависимости от температуры в помещении.
Информация была подсмотрена http://arduino.ru/forum/proekty/kontrol-vlazhnosti-podvala-arduino-pro-mini и
#include <Adafruit_GFX.h> // Основная библиотека графики
#include <MCUFRIEND_kbv.h>
MCUFRIEND_kbv tft; // hard-wired for UNO shields anyway.
#include <TouchScreen.h> //подключаем библиотеку сенсорного экрана "TouchScreen"
#include <iarduino_DHT.h> // Подключаем библиотеку для работы с датчиком DHT
iarduino_DHT DHT_Zal_1(22); // Объявляем объект, указывая номер вывода, к которому подключён модуль"ЗАЛ_1"
iarduino_DHT DHT_Zal_2(23); // Объявляем объект, указывая номер вывода, к которому подключён модуль"ЗАЛ_2"
iarduino_DHT DHT_Mastersk(24); // Объявляем объект, указывая номер вывода, к которому подключён модуль"МАСТЕРСКАЯ"
iarduino_DHT DHT_Ulica(25); // Объявляем объект, указывая номер вывода, к которому подключён модуль"УЛИЦА"
#define Rel_Zal_1_Prit 26 // нога управления релюшкой вентилятора №1 зал_1 приточный
#define Rel_Zal_1_Vyt 27 // нога управления релюшкой вентилятора №2 зал_1 вытяжной
#define Rel_Zal_2_Prit 28 // нога управления релюшкой вентилятора №3 зал_2 приточный
#define Rel_Zal_2_Vyt 29 // нога управления релюшкой вентилятора №4 зал_2 вытяжной
#define Rel_Mastersk_Prit 30 // нога управления релюшкой вентилятора №5 мастерская приточный
#define Rel_Mastersk_Vyt 31 // нога управления релюшкой вентилятора №6 мастерская вятяжной
#define Led 3 // подсветка
uint8_t YP = A1; // Должен быть Аналоговый пин
uint8_t XM = A2; // Должен быть Аналоговый пин
uint8_t YM = 7; // Должен быть Цифровой пин
uint8_t XP = 6; // Должен быть Цифровой пин
uint16_t x, y, z;
uint8_t Temp_indoor = 15;
bool Rel_Zal_1_Prit_StatusNow = 0;
bool Rel_Zal_1_Prit_StatusOld = 0;
bool Rel_Zal_1_Vyt_StatusNow = 0;
bool Rel_Zal_1_Vyt_StatusOld = 0;
bool Rel_Zal_2_Prit_StatusNow = 0;
bool Rel_Zal_2_Prit_StatusOld = 0;
bool Rel_Zal_2_Vyt_StatusNow = 0;
bool Rel_Zal_2_Vyt_StatusOld = 0;
bool Rel_Mastersk_Prit_StatusNow = 0;
bool Rel_Mastersk_Prit_StatusOld = 0;
bool Rel_Mastersk_Vyt_StatusNow = 0;
bool Rel_Mastersk_Vyt_StatusOld = 0;
bool Avto_Ventil_StatusNow = 0;
bool Avto_Ventil_statusOld = 0;
unsigned long last_dhts_run = 0;
unsigned long last_Led_run = 0;
float DHT_Ulica_hum_abs, DHT_Zal_1_hum_abs, DHT_Zal_2_hum_abs, DHT_Mastersk_hum_abs;
bool infoScreen = false;
bool statusLed = true;
TouchScreen ts = TouchScreen(XP, YP, XM, YM, 280); // инициализация тачскрин
TSPoint tp;
#define MINPRESSURE 20 //минимальноле время нажатия на экран
#define MAXPRESSURE 1000 //максимальное время нажатия на экран
#define BLACK 0x0000 // Присваиваем читаемые имена для некоторых общих 16-разрядных значений цвета:
#define BLUE 0x001F
#define RED 0xF800
#define GREEN 0x07E0
#define CYAN 0x07FF
#define MAGENTA 0xF81F
#define YELLOW 0xFFE0
#define WHITE 0xFFFF
void setup(void) //всё находящееся внутри {} будет выполнено 1 раз при загрузке Ардуино.
{
pinMode(Rel_Zal_1_Prit, OUTPUT); digitalWrite(Rel_Zal_1_Prit, HIGH);//устанавливает выводы как ВЫХОДЫ
pinMode(Rel_Zal_1_Vyt, OUTPUT); digitalWrite(Rel_Zal_1_Vyt, HIGH);// и подает на них +5v.высокий уровень.
pinMode(Rel_Zal_2_Prit, OUTPUT); digitalWrite(Rel_Zal_2_Prit, HIGH);
pinMode(Rel_Zal_2_Vyt, OUTPUT); digitalWrite(Rel_Zal_2_Vyt, HIGH);
pinMode(Rel_Mastersk_Prit, OUTPUT); digitalWrite(Rel_Mastersk_Prit, HIGH);
pinMode(Rel_Mastersk_Vyt, OUTPUT); digitalWrite(Rel_Mastersk_Vyt, HIGH);
pinMode(Led, OUTPUT); digitalWrite(Led, HIGH);
tft.cp437(true); //необходим для работы русского шрифта
tft.begin(9600); //открыть порт дисплея.
tft.reset(); //сбросить дисплей.
tft.begin(tft.readID()); //инициализация дисплея.
tft.setRotation(1); //ориентация дисплея ландшафт.
tft.fillScreen(BLACK); //заливает дисплей выбранным цветом стирая всё что есть на экране.
statik_obekt_tft(); //вызвать функцию рисует таблицу и надписи
But_Zal_1_Ventil_ON(); //кнопка вкл. вентиляцию зал_1
But_Zal_1_Vyt_ON(); //кнопка вкл. вытяжку зал_1
But_Zal_2_Ventil_ON(); //кнопка вкл. вентиляцию зал_2
But_Zal_2_Vyt_ON(); //кнопка вкл. вытяжку зал_2
But_Mastersk_Ventil_ON(); //кнопка вкл. вентиляцию мастер-ая
But_Mastersk_Vyt_ON(); //кнопка вкл. вытяжку мастер-ая
But_Ventil_Avto_ON(); //кнопка вкл. автоматич. режим
Serial.begin(9600); //открыть последовательный порт.
dhts();
}
void loop() { //всё находящееся внутри {} будет бесконечно повторяется сверху вниз.
touch(); //функция получения координат нажатия на экран
if ((z > MINPRESSURE && z < MAXPRESSURE) && (statusLed == false)) { //нажали на экран и подсветка выключена.
digitalWrite(Led, HIGH); //включили подсветку.
delay(100);
statusLed = true;
}
if ((statusLed == true) && (millis() - last_Led_run > 1800000)) { //прошло 30м.
digitalWrite(Led, LOW); //выключили подсветку.
statusLed = false;
last_Led_run = millis();
if (millis() < last_Led_run) last_Led_run = millis();
}
if ((z > MINPRESSURE && z < MAXPRESSURE) && (x > 10 && x < 60) && (y > 5 && y < 120) && (infoScreen == false) && (statusLed == true))
{ // нажали кн. "информация"
PrintInfo(); //нарисовали экран настроек
}
if ((z > MINPRESSURE && z < MAXPRESSURE) && (x > 20 && x < 60) && (y > 300 && y < 380) && (infoScreen == true))
{ //нажали кн."выход" и экран. с настройками выведен на экран
clearInfo(); //стереть экран настроек, рисуем все заново
dhts();
}
//--------------------------------------------------кнопка*+*------------------------------------------------------------
if ((z > MINPRESSURE && z < MAXPRESSURE) && (x > 110 && x < 155) && (y > 290 && y < 365) && //нажали кнопку *+*
(infoScreen == true) && (Temp_indoor >= 15))
{
Temp_indoor ++;
if (Temp_indoor > 30) {
Temp_indoor = 15;
}
tft.setTextSize(3), tft.setTextColor(BLACK, WHITE), tft.setCursor(311, 156), tft.print(String(Temp_indoor));
Serial.println(utf8rus(" + ") + String(Temp_indoor));
delay(100);
}
//--------------------------------------------------кнопка*-*--------------------------------------------------------------
if ((z > MINPRESSURE && z < MAXPRESSURE) && (x > 175 && x < 220) && (y > 290 && y < 365) && //нажали кнопку *+*
(infoScreen == true))
{
Temp_indoor --;
if (Temp_indoor < 15) {
Temp_indoor = 15;
}
tft.setTextSize(3), tft.setTextColor(BLACK, WHITE), tft.setCursor(311, 156), tft.print(String(Temp_indoor));
Serial.println(utf8rus(" - ") + String(Temp_indoor));
delay(100);
}
//-------------------------------------------------------------------------------------------------------------------------
if (infoScreen == true) return; //если горит экран настроек ничего не делаем
if (infoScreen == false) //если вышли из настроек продолжаем
{
if ((last_dhts_run == 0) || (millis() - last_dhts_run > 60000)) //если прошла 1минута
{
dhts(); //выводим на экран показания датчиков
last_dhts_run = millis();
if (millis() < last_dhts_run) last_dhts_run = millis();
}
//-------------------------------------------------нажатие кнопки вентиляция-зал_1----------------------------------------
if ((z > MINPRESSURE && z < MAXPRESSURE) && (x > 119 && x < 174) && (y > 5 && y < 105) &&
(Rel_Zal_1_Vyt_StatusNow == 0) && ( Rel_Zal_1_Prit_StatusNow == 0) && (statusLed == true)) //нажали кн.зал_1 вентил. и все реле выключены
{
Rel_Zal_1_Prit_StatusNow = !Rel_Zal_1_Prit_StatusNow;// меняем статус на противоположный 0 в 1 вкл.прит.вентил.
Rel_Zal_1_Vyt_StatusNow = !Rel_Zal_1_Vyt_StatusNow; //меняем статус на противоположный 0 в 1 вкл.вытяж.вентл.
}
else if ((z > MINPRESSURE && z < MAXPRESSURE) && (x > 119 && x < 174) && (y > 5 && y < 105) &&
(Rel_Zal_1_Vyt_StatusNow == 1) && (Rel_Zal_1_Prit_StatusNow == 0) && (statusLed == true)) //нажали кнопку и работает вытяжка
{
Rel_Zal_1_Prit_StatusNow = !Rel_Zal_1_Prit_StatusNow;// меняем статус 0 в 1, вкл.приточ-ый ветилятор
}
else if ((z > MINPRESSURE && z < MAXPRESSURE) && (x > 119 && x < 174) && (y > 5 && y < 105) &&
(Rel_Zal_1_Vyt_StatusNow == 1) && ( Rel_Zal_1_Prit_StatusNow == 1) && (statusLed == true))//нажали кн.зал_1 вентил. и все реле включены
{
Rel_Zal_1_Prit_StatusNow = !Rel_Zal_1_Prit_StatusNow;// меняем статус на противоположный 1 в 0 выкл.приточ.вентил
Rel_Zal_1_Vyt_StatusNow = !Rel_Zal_1_Vyt_StatusNow; //меняем статус на противоположный 1 в 0 выкл. вытяжн. вентил
}
//---------------------------------------------нажатие кнопки вытяжка-зал_1------------------------------------------------
if ((z > MINPRESSURE && z < MAXPRESSURE) && (x > 179 && x < 234) && (y > 5 && y < 105) &&
(Rel_Zal_1_Prit_StatusNow == 0) && (Rel_Zal_1_Vyt_StatusNow == 0) && (statusLed == true)) //нажали кн.вытяжка. и все реле выключены
{
Rel_Zal_1_Vyt_StatusNow = !Rel_Zal_1_Vyt_StatusNow; //меняем статус на противоположный 0 в 1 вкл.вытяжку
}
else if ((z > MINPRESSURE && z < MAXPRESSURE) && (x > 179 && x < 234) && (y > 5 && y < 105) &&
(Rel_Zal_1_Prit_StatusNow == 1) && (Rel_Zal_1_Vyt_StatusNow == 1) && (statusLed == true)) //нажали кн. вытяжка и все реле включены
{
Rel_Zal_1_Prit_StatusNow = !Rel_Zal_1_Prit_StatusNow; // меняем статус на противоположный 1 в 0 выкл.приточныое реле
}
else if ((z > MINPRESSURE && z < MAXPRESSURE) && (x > 179 && x < 234) && (y > 5 && y < 105) &&
(Rel_Zal_1_Prit_StatusNow == 0) && (Rel_Zal_1_Vyt_StatusNow == 1) && (statusLed == true)) //нажали.кн.вытяжка и включена вытяжка
{
Rel_Zal_1_Vyt_StatusNow = !Rel_Zal_1_Vyt_StatusNow; // меняем статус на противоположный 1 в 0 выкл.вытяжку
}
//-------------------------------------------------нажатие кнопки вентиляция-зал_2-----------------------------------------
if ((z > MINPRESSURE && z < MAXPRESSURE) && (x > 119 && x < 174) && (y > 110 && y < 210) &&
(Rel_Zal_2_Vyt_StatusNow == 0) && ( Rel_Zal_2_Prit_StatusNow == 0) && (statusLed == true)) //нажали кн.вентил. и все реле выключены
{
Rel_Zal_2_Prit_StatusNow = !Rel_Zal_2_Prit_StatusNow;// меняем статус на противоположный 0 в 1 вкл.прит.вентил.
Rel_Zal_2_Vyt_StatusNow = !Rel_Zal_2_Vyt_StatusNow; //меняем статус на противоположный 0 в 1 вкл.вытяж.вентл.
}
else if ((z > MINPRESSURE && z < MAXPRESSURE) && (x > 119 && x < 174) && (y > 110 && y < 210) &&
(Rel_Zal_2_Vyt_StatusNow == 1) && (Rel_Zal_2_Prit_StatusNow == 0) && (statusLed == true)) //нажали кнопку и работает вытяжка
{
Rel_Zal_2_Prit_StatusNow = !Rel_Zal_2_Prit_StatusNow;// меняем статус 0 в 1, вкл.приточ-ый ветилятор
}
else if ((z > MINPRESSURE && z < MAXPRESSURE) && (x > 119 && x < 174) && (y > 110 && y < 210) &&
(Rel_Zal_2_Vyt_StatusNow == 1) && ( Rel_Zal_2_Prit_StatusNow == 1) && (statusLed == true)) //нажали кн.вентил. и все реле включены
{
Rel_Zal_2_Prit_StatusNow = !Rel_Zal_2_Prit_StatusNow;// меняем статус на противоположный 1 в 0 выкл.приточ.вентил
Rel_Zal_2_Vyt_StatusNow = !Rel_Zal_2_Vyt_StatusNow; //меняем статус на противоположный 1 в 0 выкл. вытяжн. вентил
}
//---------------------------------------------нажатие кнопки вытяжка-зал_2------------------------------------------------
if ((z > MINPRESSURE && z < MAXPRESSURE) && (x > 179 && x < 234) && (y > 110 && y < 210) &&
(Rel_Zal_2_Prit_StatusNow == 0) && (Rel_Zal_2_Vyt_StatusNow == 0) && (statusLed == true)) //нажали кн.вытяжка. и все реле выключены
{
Rel_Zal_2_Vyt_StatusNow = !Rel_Zal_2_Vyt_StatusNow; //меняем статус на противоположный 0 в 1 вкл.вытяжку
}
else if ((z > MINPRESSURE && z < MAXPRESSURE) && (x > 179 && x < 234) && (y > 110 && y < 210) &&
(Rel_Zal_2_Prit_StatusNow == 1) && (Rel_Zal_2_Vyt_StatusNow == 1) && (statusLed == true)) //нажали кн.вытяжка и все реле включены
{
Rel_Zal_2_Prit_StatusNow = !Rel_Zal_2_Prit_StatusNow; // меняем статус на противоположный 1 в 0 выкл.приточныое реле
}
else if ((z > MINPRESSURE && z < MAXPRESSURE) && (x > 179 && x < 234) && (y > 110 && y < 210) &&
(Rel_Zal_2_Prit_StatusNow == 0) && (Rel_Zal_2_Vyt_StatusNow == 1) && (statusLed == true)) //нажали.кн.вытяжка и включена вытяжка
{
Rel_Zal_2_Vyt_StatusNow = !Rel_Zal_2_Vyt_StatusNow; // меняем статус на противоположный 1 в 0 выкл.вытяжку
}
//-------------------------------------------------нажатие кнопки вентиляция-мастерская-------------------------------------
if ((z > MINPRESSURE && z < MAXPRESSURE) && (x > 119 && x < 174) && (y > 215 && y < 315) &&
(Rel_Mastersk_Vyt_StatusNow == 0) && ( Rel_Mastersk_Prit_StatusNow == 0) && (statusLed == true)) //нажали кн.вентил. и все реле выключены
{
Rel_Mastersk_Prit_StatusNow = !Rel_Mastersk_Prit_StatusNow; // меняем статус на противоположный 0 в 1 вкл.прит.вентил.
Rel_Mastersk_Vyt_StatusNow = !Rel_Mastersk_Vyt_StatusNow; //меняем статус на противоположный 0 в 1 вкл.вытяж.вентл.
}
else if ((z > MINPRESSURE && z < MAXPRESSURE) && (x > 119 && x < 174) && (y > 215 && y < 315) &&
(Rel_Mastersk_Vyt_StatusNow == 1) && (Rel_Mastersk_Prit_StatusNow == 0) && (statusLed == true)) //нажали кнопку и работает вытяжка
{
Rel_Mastersk_Prit_StatusNow = !Rel_Mastersk_Prit_StatusNow;// меняем статус 0 в 1, вкл.приточ-ый ветилятор
}
else if ((z > MINPRESSURE && z < MAXPRESSURE) && (x > 119 && x < 174) && (y > 215 && y < 315) &&
(Rel_Mastersk_Vyt_StatusNow == 1) && ( Rel_Mastersk_Prit_StatusNow == 1) && (statusLed == true)) //нажали кн.вентил. и все реле включены
{
Rel_Mastersk_Prit_StatusNow = !Rel_Mastersk_Prit_StatusNow;// меняем статус на противоположный 1 в 0 выкл.приточ.вентил
Rel_Mastersk_Vyt_StatusNow = !Rel_Mastersk_Vyt_StatusNow; //меняем статус на противоположный 1 в 0 выкл. вытяжн. вентил
}
//---------------------------------------------нажатие кнопки вытяжка мастерская---------------------------------------------
if ((z > MINPRESSURE && z < MAXPRESSURE) && (x > 179 && x < 234) && (y > 215 && y < 315) &&
(Rel_Mastersk_Prit_StatusNow == 0) && (Rel_Mastersk_Vyt_StatusNow == 0) && (statusLed == true)) //нажали кн.вытяжка. и все реле выключены
{
Rel_Mastersk_Vyt_StatusNow = !Rel_Mastersk_Vyt_StatusNow; //меняем статус на противоположный 0 в 1 вкл.вытяжку
}
else if ((z > MINPRESSURE && z < MAXPRESSURE) && (x > 179 && x < 234) && (y > 215 && y < 315) &&
(Rel_Mastersk_Prit_StatusNow == 1) && (Rel_Mastersk_Vyt_StatusNow == 1) && (statusLed == true)) //нажали кн.вытяжка и все реле включены
{
Rel_Mastersk_Prit_StatusNow = !Rel_Mastersk_Prit_StatusNow; // меняем статус на противоположный 1 в 0 выкл.приточныое реле
}
else if ((z > MINPRESSURE && z < MAXPRESSURE) && (x > 179 && x < 234) && (y > 215 && y < 315) &&
(Rel_Mastersk_Prit_StatusNow == 0) && (Rel_Mastersk_Vyt_StatusNow == 1) && (statusLed == true)) //нажали.кн.вытяжка и включена вытяжка
{
Rel_Mastersk_Vyt_StatusNow = !Rel_Mastersk_Vyt_StatusNow; // меняем статус на противоположный 1 в 0 выкл.вытяжку
}
//---------------------------------------------нажатие кнопки автомиатеческая вентиляция--------------------------------------
if ((z > MINPRESSURE && z < MAXPRESSURE) && (x > 136 && x < 216) && (y > 315 && y < 393) && (statusLed == true)) //нажали кн. "авто"
{
Avto_Ventil_StatusNow = !Avto_Ventil_StatusNow; //меняем статус на противоположный
}
//====================================================================================================================
//--------------------------------------проверка состояния кнопки вентиляция зал_1-----------------------------------
if ((Rel_Zal_1_Prit_StatusNow != Rel_Zal_1_Prit_StatusOld) && (Rel_Zal_1_Vyt_StatusNow != Rel_Zal_1_Vyt_StatusOld) &&
(Rel_Zal_1_Prit_StatusNow == 1) && (Rel_Zal_1_Vyt_StatusNow == 1)) //если вентиляция включена
{
show_Serial();
But_Zal_1_Ventil_OFF(); //рисуем кн. выкл.вентил.
digitalWrite(Rel_Zal_1_Prit, !Rel_Zal_1_Prit_StatusNow); //вкл.прит.реле
digitalWrite(Rel_Zal_1_Vyt, !Rel_Zal_1_Vyt_StatusNow); //вкл.вытяж.реле
Rel_Zal_1_Prit_StatusOld = Rel_Zal_1_Prit_StatusNow; //Запоминаем новое состояние
Rel_Zal_1_Vyt_StatusOld = Rel_Zal_1_Vyt_StatusNow; //Запомним новое состояние
}
else if ((Rel_Zal_1_Prit_StatusNow != Rel_Zal_1_Prit_StatusOld) && (Rel_Zal_1_Vyt_StatusNow != Rel_Zal_1_Vyt_StatusOld) &&
(Rel_Zal_1_Prit_StatusNow == 0) && (Rel_Zal_1_Vyt_StatusNow == 0)) //если вентиляция выключена
{
show_Serial();
But_Zal_1_Ventil_ON(); //рисуем кнопку вкл.вентиляцию
digitalWrite(Rel_Zal_1_Prit, !Rel_Zal_1_Prit_StatusNow); //выкл.реле приточ.
digitalWrite(Rel_Zal_1_Vyt, !Rel_Zal_1_Vyt_StatusNow); //выкл.реле вытяжка.
Rel_Zal_1_Prit_StatusOld = Rel_Zal_1_Prit_StatusNow; //Запомним новое состояние
Rel_Zal_1_Vyt_StatusOld = Rel_Zal_1_Vyt_StatusNow; //Запомним новое состояние
}
else if ((Rel_Zal_1_Prit_StatusNow != Rel_Zal_1_Prit_StatusOld) && (Rel_Zal_1_Prit_StatusNow == 1)) //если вкл.вытяжка
{
show_Serial();
But_Zal_1_Ventil_OFF(); //рисуем кн. выкл.вентил.
But_Zal_1_Vyt_ON(); //рисуем кнопку включить вытяжкку
digitalWrite(Rel_Zal_1_Prit, !Rel_Zal_1_Prit_StatusNow); //вкл.реле приточ.
Rel_Zal_1_Prit_StatusOld = Rel_Zal_1_Prit_StatusNow; //Запомним новое состояние
}
//------------------------------------------проверка состояния кнопки вытяжка зал_1---------------------------------------------
if ((Rel_Zal_1_Vyt_StatusNow != Rel_Zal_1_Vyt_StatusOld) && (Rel_Zal_1_Vyt_StatusNow == 1)) //если вкл.вытяжка
{
show_Serial();
But_Zal_1_Vyt_OFF(); //рисуем кнопку выключить вентиляцию
digitalWrite(Rel_Zal_1_Vyt, !Rel_Zal_1_Vyt_StatusNow); //включаем реле вытяжки
Rel_Zal_1_Vyt_StatusOld = Rel_Zal_1_Vyt_StatusNow; //Запомним новое состояние
}
else if ((Rel_Zal_1_Vyt_StatusNow != Rel_Zal_1_Vyt_StatusOld) && (Rel_Zal_1_Vyt_StatusNow == 0)) //если выключена вытяжка
{
show_Serial();
But_Zal_1_Vyt_ON(); //рисуем кнопку включить вытяжкку
digitalWrite(Rel_Zal_1_Vyt, !Rel_Zal_1_Vyt_StatusNow); //выключаем реле вытяжки
Rel_Zal_1_Vyt_StatusOld = Rel_Zal_1_Vyt_StatusNow; //Запомним новое состояние
}
else if ((Rel_Zal_1_Prit_StatusNow != Rel_Zal_1_Prit_StatusOld) && (Rel_Zal_1_Prit_StatusNow == 0)) //если вкл.приточ.вентилятор
{
show_Serial();
But_Zal_1_Ventil_ON(); //рисуем кнопку вкл.вентиляцию
But_Zal_1_Vyt_OFF(); //рисуем кнопку выкл.вытяжку
digitalWrite(Rel_Zal_1_Prit, !Rel_Zal_1_Prit_StatusNow);//выключаем реле приточное
Rel_Zal_1_Prit_StatusOld = Rel_Zal_1_Prit_StatusNow; //Запомним новое состояние
}
//--------------------------------------проверка состояния кнопки вентиляция зал_2------------------------------------------------
if ((Rel_Zal_2_Prit_StatusNow != Rel_Zal_2_Prit_StatusOld) && (Rel_Zal_2_Vyt_StatusNow != Rel_Zal_2_Vyt_StatusOld) &&
(Rel_Zal_2_Prit_StatusNow == 1) && (Rel_Zal_2_Vyt_StatusNow == 1)) //если вентиляция включена
{
show_Serial();
But_Zal_2_Ventil_OFF(); //рисуем кн. выкл.вентил.
digitalWrite(Rel_Zal_2_Prit, !Rel_Zal_2_Prit_StatusNow); //вкл.прит.реле
digitalWrite(Rel_Zal_2_Vyt, !Rel_Zal_2_Vyt_StatusNow); //вкл.вытяж.реле
Rel_Zal_2_Prit_StatusOld = Rel_Zal_2_Prit_StatusNow; //Запоминаем новое состояние
Rel_Zal_2_Vyt_StatusOld = Rel_Zal_2_Vyt_StatusNow; //Запомним новое состояние
}
else if ((Rel_Zal_2_Prit_StatusNow != Rel_Zal_2_Prit_StatusOld) && (Rel_Zal_2_Vyt_StatusNow != Rel_Zal_2_Vyt_StatusOld) &&
(Rel_Zal_2_Prit_StatusNow == 0) && (Rel_Zal_2_Vyt_StatusNow == 0)) //если вентиляция выключена
{
show_Serial();
But_Zal_2_Ventil_ON(); //рисуем кнопку вкл.вентиляцию
digitalWrite(Rel_Zal_2_Prit, !Rel_Zal_2_Prit_StatusNow); //выкл.реле приточ.
digitalWrite(Rel_Zal_2_Vyt, !Rel_Zal_2_Vyt_StatusNow); //выкл.реле вытяжка.
Rel_Zal_2_Prit_StatusOld = Rel_Zal_2_Prit_StatusNow; //Запомним новое состояние
Rel_Zal_2_Vyt_StatusOld = Rel_Zal_2_Vyt_StatusNow; //Запомним новое состояние
}
else if ((Rel_Zal_2_Prit_StatusNow != Rel_Zal_2_Prit_StatusOld) && (Rel_Zal_2_Prit_StatusNow == 1)) //если вкл.вытяжка
{
show_Serial();
But_Zal_2_Ventil_OFF(); //рисуем кн. выкл.вентил.
But_Zal_2_Vyt_ON(); //рисуем кнопку включить вытяжкку
digitalWrite(Rel_Zal_2_Prit, !Rel_Zal_2_Prit_StatusNow); //вкл.реле приточ.
Rel_Zal_2_Prit_StatusOld = Rel_Zal_2_Prit_StatusNow; //Запомним новое состояние
}
//------------------------------------------проверка состояния кнопки вытяжка зал_2-----------------------------------------------
if ((Rel_Zal_2_Vyt_StatusNow != Rel_Zal_2_Vyt_StatusOld) && (Rel_Zal_2_Vyt_StatusNow == 1)) //если вкл.вытяжка
{
show_Serial();
But_Zal_2_Vyt_OFF(); //рисуем кнопку выключить вентиляцию
digitalWrite(Rel_Zal_2_Vyt, !Rel_Zal_2_Vyt_StatusNow); //включаем реле вытяжки
Rel_Zal_2_Vyt_StatusOld = Rel_Zal_2_Vyt_StatusNow; //Запомним новое состояние
}
else if ((Rel_Zal_2_Vyt_StatusNow != Rel_Zal_2_Vyt_StatusOld) && (Rel_Zal_2_Vyt_StatusNow == 0)) //если выкл.вытяжка
{
show_Serial();
But_Zal_2_Vyt_ON(); //рисуем кнопку включить вытяжкку
digitalWrite(Rel_Zal_2_Vyt, !Rel_Zal_2_Vyt_StatusNow); //выключаем реле вытяжки
Rel_Zal_2_Vyt_StatusOld = Rel_Zal_2_Vyt_StatusNow; //Запомним новое состояние
}
else if ((Rel_Zal_2_Prit_StatusNow != Rel_Zal_2_Prit_StatusOld) && (Rel_Zal_2_Prit_StatusNow == 0)) //если включен.
{ //приточ.вентилятор
show_Serial();
But_Zal_2_Ventil_ON(); //рисуем кнопку вкл.вентил.
But_Zal_2_Vyt_OFF(); //рисуем кнопку выкл.вытяжку
digitalWrite(Rel_Zal_2_Prit, !Rel_Zal_2_Prit_StatusNow);//выключаем реле приточное
Rel_Zal_2_Prit_StatusOld = Rel_Zal_2_Prit_StatusNow; //Запомним новое состояние
}
//--------------------------------------проверка состояния кнопки вентиляция мастерская---------------------------------------------
if ((Rel_Mastersk_Prit_StatusNow != Rel_Mastersk_Prit_StatusOld) && (Rel_Mastersk_Vyt_StatusNow != Rel_Mastersk_Vyt_StatusOld) &&
(Rel_Mastersk_Prit_StatusNow == 1) && (Rel_Mastersk_Vyt_StatusNow == 1)) //если вентиляция включена
{
show_Serial();
But_Mastersk_Ventil_OFF(); //рисуем кн. выкл.вентил.
digitalWrite(Rel_Mastersk_Prit, !Rel_Mastersk_Prit_StatusNow); //вкл.прит.реле
digitalWrite(Rel_Mastersk_Vyt, !Rel_Mastersk_Vyt_StatusNow); //вкл.вытяж.реле
Rel_Mastersk_Prit_StatusOld = Rel_Mastersk_Prit_StatusNow; //Запоминаем новое состояние
Rel_Mastersk_Vyt_StatusOld = Rel_Mastersk_Vyt_StatusNow; //Запомним новое состояние
}
else if ((Rel_Mastersk_Prit_StatusNow != Rel_Mastersk_Prit_StatusOld) && (Rel_Mastersk_Vyt_StatusNow != Rel_Mastersk_Vyt_StatusOld) &&
(Rel_Mastersk_Prit_StatusNow == 0) && (Rel_Mastersk_Vyt_StatusNow == 0)) //если вентиляция выключена
{
show_Serial();
But_Mastersk_Ventil_ON(); //рисуем кнопку вкл.вентиляцию
digitalWrite(Rel_Mastersk_Prit, !Rel_Mastersk_Prit_StatusNow); //выкл.реле приточ.
digitalWrite(Rel_Mastersk_Vyt, !Rel_Mastersk_Vyt_StatusNow); //выкл.реле вытяжка.
Rel_Mastersk_Prit_StatusOld = Rel_Mastersk_Prit_StatusNow; //Запомним новое состояние
Rel_Mastersk_Vyt_StatusOld = Rel_Mastersk_Vyt_StatusNow; //Запомним новое состояние
}
else if ((Rel_Mastersk_Prit_StatusNow != Rel_Mastersk_Prit_StatusOld) && (Rel_Mastersk_Prit_StatusNow == 1)) //если вкл.вытяжка
{
show_Serial();
But_Mastersk_Ventil_OFF(); //рисуем кн. выкл.вентил.
But_Mastersk_Vyt_ON(); //рисуем кнопку включить вытяжкку
digitalWrite(Rel_Mastersk_Prit, !Rel_Mastersk_Prit_StatusNow); //вкл.реле приточ.
Rel_Mastersk_Prit_StatusOld = Rel_Mastersk_Prit_StatusNow; //Запомним новое состояние
}
//------------------------------------------проверка состояния кнопки вытяжка мастерская--------------------------------------------
if ((Rel_Mastersk_Vyt_StatusNow != Rel_Mastersk_Vyt_StatusOld) && (Rel_Mastersk_Vyt_StatusNow == 1)) //если вкл.вытяжка
{
show_Serial();
But_Mastersk_Vyt_OFF(); //рисуем кнопку выключить вентиляцию
digitalWrite(Rel_Mastersk_Vyt, !Rel_Mastersk_Vyt_StatusNow); //включаем реле вытяжки
Rel_Mastersk_Vyt_StatusOld = Rel_Mastersk_Vyt_StatusNow; //Запомним новое состояние
}
else if ((Rel_Mastersk_Vyt_StatusNow != Rel_Mastersk_Vyt_StatusOld) && (Rel_Mastersk_Vyt_StatusNow == 0)) //если выкл.вытяжка
{
show_Serial();
But_Mastersk_Vyt_ON(); //рисуем кнопку включить вытяжкку
digitalWrite(Rel_Mastersk_Vyt, !Rel_Mastersk_Vyt_StatusNow); //выключаем реле вытяжки
Rel_Mastersk_Vyt_StatusOld = Rel_Mastersk_Vyt_StatusNow; //Запомним новое состояние
}
else if ((Rel_Mastersk_Prit_StatusNow != Rel_Mastersk_Prit_StatusOld) && (Rel_Mastersk_Prit_StatusNow == 0)) //если вкл.приточ.вен-тор
{
show_Serial();
But_Mastersk_Ventil_ON(); //рисуем кнопку вкл.вентил.
But_Mastersk_Vyt_OFF(); //рисуем кнопку выкл.вытяжку
digitalWrite(Rel_Mastersk_Prit, !Rel_Mastersk_Prit_StatusNow);//выключаем реле приточное
Rel_Mastersk_Prit_StatusOld = Rel_Mastersk_Prit_StatusNow; //Запомним новое состояние
}
//--------------------------------------проверка состояниякнопки автомиатеческая вентиляция ----------------------------------------
if ((Avto_Ventil_StatusNow != Avto_Ventil_statusOld) && (Avto_Ventil_StatusNow == 1)) //вкл.авто.вентиляцию
{
But_Ventil_Avto_OFF(); //рисуем кн.выкл.автом.вент.
Rel_Zal_1_Prit_StatusNow = 0, Rel_Zal_1_Vyt_StatusNow = 0, Rel_Zal_2_Prit_StatusNow = 0; //выключаем все реле
Rel_Zal_2_Vyt_StatusNow = 0, Rel_Mastersk_Prit_StatusNow = 0, Rel_Mastersk_Vyt_StatusNow = 0;
Avto_Ventil_statusOld = Avto_Ventil_StatusNow; //Запомним новое состояние
}
if (Avto_Ventil_StatusNow == 1)
{
if ((DHT_Ulica.tem > 5)/*тем-ра на улице больше 5гр.*/ && (DHT_Ulica.tem < 30)/*темп-ра на улице меньше 30гр.С*/ &&
(DHT_Zal_1.tem >= Temp_indoor)/*тем-ра в помещение больше или равно 15гр*/ && (DHT_Zal_1.tem < 30)/*тем-ра в помещение меньше 30гр.С*/ &&
(DHT_Ulica_hum_abs < 15)/*абс.вл.на улице меньше 15гр/м3*/ && (DHT_Ulica_hum_abs < DHT_Zal_1_hum_abs)/*абс.вл.на улице меньше чем в помещение*/ &&
(DHT_Zal_1_hum_abs > 7)/*абс.вл. в помещение больше 7гр/м3*/)
{
Rel_Zal_1_Prit_StatusNow = 1, Rel_Zal_1_Vyt_StatusNow = 1; // включаем приточ.вент. и вытяж.вентил.зал-1
}
else
{
Rel_Zal_1_Prit_StatusNow = 0, Rel_Zal_1_Vyt_StatusNow = 0; // выключаем приточ.вент. и вытяж.вентил.зал-1
}
if ((DHT_Ulica.tem > 5) && (DHT_Ulica.tem < 30) && (DHT_Zal_2.tem >= Temp_indoor) && (DHT_Zal_2.tem < 30) &&
(DHT_Ulica_hum_abs < 15) && (DHT_Ulica_hum_abs < DHT_Zal_2_hum_abs) && (DHT_Zal_2_hum_abs > 7))
{
Rel_Zal_2_Prit_StatusNow = 1, Rel_Zal_2_Vyt_StatusNow = 1; // включаем приточ.вент. и вытяж.вентил.зал2
}
else
{
Rel_Zal_2_Prit_StatusNow = 0, Rel_Zal_2_Vyt_StatusNow = 0; // выключаем приточ.вент. и вытяж.вентил.зал2
}
if ((DHT_Ulica.tem > 5) && (DHT_Ulica.tem < 30) && (DHT_Mastersk.tem >= Temp_indoor) && (DHT_Mastersk.tem < 30) &&
(DHT_Ulica_hum_abs < 15) && (DHT_Ulica_hum_abs < DHT_Mastersk_hum_abs) && (DHT_Mastersk_hum_abs > 7))
{
Rel_Mastersk_Prit_StatusNow = 1, Rel_Mastersk_Vyt_StatusNow = 1; // включаем приточ.вент. и вытяж.вентил.мастерская
}
else
{
Rel_Mastersk_Prit_StatusNow = 0, Rel_Mastersk_Vyt_StatusNow = 0; // выключаем приточ.вент. и вытяж.вентил.мастерская
}
}
else if ((Avto_Ventil_StatusNow != Avto_Ventil_statusOld) && (Avto_Ventil_StatusNow == 0)) //вык.авто.вентиляцию
{
But_Ventil_Avto_ON(); //рисуем кн.вкл.автом.вент.
Rel_Zal_1_Prit_StatusNow = 0, Rel_Zal_1_Vyt_StatusNow = 0, Rel_Zal_2_Prit_StatusNow = 0; //выключаем все реле
Rel_Zal_2_Vyt_StatusNow = 0, Rel_Mastersk_Prit_StatusNow = 0, Rel_Mastersk_Vyt_StatusNow = 0;
Avto_Ventil_statusOld = Avto_Ventil_StatusNow; //Запомним новое состояние
}
}
}
void dhts(void) //функция чтения датчиков dht22 и вычисление абсолютной влажности
{
float temp1, temp2, temp3, temp4;
DHT_Zal_1.read();
DHT_Zal_2.read();
DHT_Mastersk.read();
DHT_Ulica.read();
delay(1000);
tft.setTextSize(2);
tft.setTextColor(WHITE, BLACK);
tft.setCursor(141, 50), tft.print(String(DHT_Ulica.tem)); //улица тем.
tft.setCursor(189, 50), tft.print(" "); // стираем сотую часть показаний
tft.setCursor(141, 72), tft.print(String(DHT_Ulica.hum)); //улица отн.вл.
tft.setCursor(189, 72), tft.print(" ");
tft.setCursor(141, 94), tft.print(String(DHT_Ulica_hum_abs)); //улица абс.вл.
tft.setCursor(189, 94), tft.print(" ");
tft.setCursor(206, 50), tft.print(String(DHT_Zal_1.tem)); //зал1 тем.
tft.setCursor(254, 50), tft.print(" ");
tft.setCursor(206, 72), tft.print(String(DHT_Zal_1.hum - 0.5)); //зал1 отн.вл.
tft.setCursor(254, 72), tft.print(" ");
tft.setCursor(206, 94), tft.print(String(DHT_Zal_1_hum_abs)); //зал1 абс.вл.
tft.setCursor(254, 94), tft.print(" ");
tft.setCursor(271, 50), tft.print(String(DHT_Zal_2.tem)); //зал2.тем.
tft.setCursor(319, 50), tft.print(" ");
tft.setCursor(271, 72), tft.print(String(DHT_Zal_2.hum - 4)); //зал2 отн.вл.
tft.setCursor(319, 72), tft.print(" ");
tft.setCursor(271, 94), tft.print(String(DHT_Zal_2_hum_abs)); //зал2 абс.вл.
tft.setCursor(319, 94), tft.print(" ");
tft.setCursor(336, 50), tft.print(String(DHT_Mastersk.tem)); //маст.тем.
tft.setCursor(384, 50), tft.print(" ");
tft.setCursor(336, 72), tft.print(String(DHT_Mastersk.hum - 5)); //маст.от.вл.
tft.setCursor(384, 72), tft.print(" ");
tft.setCursor(336, 94), tft.print(String(DHT_Mastersk_hum_abs)); //маст.абс.вл.
tft.setCursor(384, 94), tft.print(" ");
temp1 = pow(2.718281828, (17.67 * DHT_Ulica.tem) / (DHT_Ulica.tem + 243.5));
DHT_Ulica_hum_abs = (6.112 * temp1 * (DHT_Ulica.hum) * 2.1674) / (273.15 + DHT_Ulica.tem);
temp2 = pow(2.718281828, (17.67 * DHT_Zal_1.tem) / (DHT_Zal_1.tem + 243.5));
DHT_Zal_1_hum_abs = (6.112 * temp1 * (DHT_Zal_1.hum - 0.5) * 2.1674) / (273.15 + DHT_Zal_1.tem);
temp3 = pow(2.718281828, (17.67 * DHT_Zal_2.tem) / (DHT_Zal_2.tem + 243.5));
DHT_Zal_2_hum_abs = (6.112 * temp3 * (DHT_Zal_2.hum - 4) * 2.1674) / (273.15 + DHT_Zal_2.tem);
temp4 = pow(2.718281828, (17.67 * DHT_Mastersk.tem) / (DHT_Mastersk.tem + 243.5));
DHT_Mastersk_hum_abs = (6.112 * temp3 * (DHT_Mastersk.hum - 5) * 2.1674) / (273.15 + DHT_Mastersk.tem);
}
void PrintInfo() // Показать Окно с информацией и настройками
{
infoScreen = true;
int a = 200, b = 120;
for (int c = 0; c <= 230; c++) {
tft.drawCircle(a, b, c, YELLOW);
}
tft.fillRect(10, 10, 380, 220, BLUE);
tft.drawRect(10, 10, 380, 220, WHITE);
tft.drawRect(11, 11, 378, 218, WHITE);
tft.drawRect(20, 21, 360, 200, WHITE);
tft.drawRect(19, 20, 362, 202, WHITE);
tft.fillRect(304, 26, 70, 25, RED);
tft.drawRect(304, 26, 70, 25, WHITE);
tft.drawRect(305, 27, 68, 23, WHITE);
tft.setTextSize(2);
tft.setTextColor(WHITE);
tft.setCursor(310, 31), tft.print(utf8rus("ВЫХОД"));
tft.setTextSize(1);
tft.setCursor(25, 25), tft.print(utf8rus("НАСТРОЙКА ВКЛЮЧЕНИЯ И ВЫКЛЮЧЕНИЯ ВЕНТИЛЯТОРОВ."));
tft.setTextColor(YELLOW);
tft.setCursor(25, 35), tft.print(utf8rus("В РЕЖИМЕ **АВТОМАТИЧЕСКАЯ ВЕНТИЛЯЦИЯ**"));
tft.setCursor(25, 45), tft.print(utf8rus("ВКЛЮЧЕНИЕ И ВЫКЛЮЧЕНИЕ ВЕНТИЛЯТОРОВ ПРОИСХОДИТ"));
tft.setCursor(25, 55), tft.print(utf8rus("В ЗАВИСИМОСТИ ОТ ТЕМПЕРАТУРЫ гр.С и "));
tft.setCursor(25, 65), tft.print(utf8rus("АБСОЛЮТНОЙ ВЛАЖНОСТИ г/м*3 НА УЛИЦЕ"));
tft.setCursor(25, 75), tft.print(utf8rus("И В ПОМЕЩЕНИЕ."));
tft.setTextColor(WHITE);
tft.setCursor(25, 85), tft.print(utf8rus("НАСТРОЙКИ ПО УМОЛЧАНИЮ:"));
tft.setTextColor(YELLOW);
tft.setCursor(25, 95), tft.print(utf8rus("ТЕМПЕРАТУРА НА УЛИЦ > 5 гр.С И < 30 гр.С"));
tft.setCursor(25, 105), tft.print(utf8rus("ТЕМПЕРАТУРА В ПОМЕЩЕНИЕ > 15 гр.С И < 30 гр.С"));
tft.setCursor(25, 115), tft.print(utf8rus("АБСОЛЮТНАЯ ВЛАЖНОСТЬ НА УЛИЦЕ < 15 гр/м3"));
tft.setCursor(25, 125), tft.print(utf8rus("АБСОЛЮТНАЯ ВЛАЖНОСТЬ В ПОМЕЩЕНИЕ > 7 гр/м3"));
//-------------------------------------------------кнопки настройки-------------------------------------------------------
tft.setTextSize(2);
tft.setTextColor(GREEN);
tft.setCursor(25, 160);
tft.print(utf8rus("ТЕМ-ТУРА В ПОМЕЩЕНИИ >>"));
tft.fillRect(300, 152, 55, 30, WHITE); //окошко
tft.drawRect(300, 152, 55, 30, BLACK);
tft.drawRect(301, 153, 53, 28, BLACK);
tft.fillRect(300, 118, 55, 30, GREEN); //кнопка *+*
tft.drawRect(300, 118, 55, 30, WHITE);
tft.drawRect(301, 119, 53, 28, WHITE);
tft.fillRect(300, 186, 55, 30, RED); //кнопка*-*
tft.drawRect(300, 186, 55, 30, WHITE);
tft.drawRect(301, 187, 53, 28, WHITE);
tft.setTextSize(3);
tft.setTextColor(BLACK);
tft.setCursor(320, 124), tft.print("+");
tft.setCursor(320, 191), tft.print("-");
tft.setCursor(311, 156), tft.print(String(Temp_indoor));
}
void clearInfo() // Стереть информационный экран
{
infoScreen = false;
int a = 200, b = 120;
for (int c = 230; c >= 0; c--) {
tft.drawCircle(a, b, c, YELLOW);
}
tft.fillScreen(BLACK); //заливает дисплей выбранным цветом стирая всё что есть на экране.
statik_obekt_tft(); //вызвать функцию рисует таблицу и надписи
Rel_Zal_1_Prit_StatusNow = 0, Rel_Zal_1_Vyt_StatusNow = 0, Rel_Zal_2_Prit_StatusNow = 0; //выключаем все реле
Rel_Zal_2_Vyt_StatusNow = 0, Rel_Mastersk_Prit_StatusNow = 0, Rel_Mastersk_Vyt_StatusNow = 0;
Avto_Ventil_StatusNow = 0;
But_Zal_1_Ventil_ON(); //кнопка вкл. вентиляцию зал_1
But_Zal_1_Vyt_ON(); //кнопка вкл. вытяжку зал_1
But_Zal_2_Ventil_ON(); //кнопка вкл. вентиляцию зал_2
But_Zal_2_Vyt_ON(); //кнопка вкл. вытяжку зал_2
But_Mastersk_Ventil_ON(); //кнопка вкл. вентиляцию мастер-ая
But_Mastersk_Vyt_ON(); //кнопка вкл. вытяжку мастер-ая
But_Ventil_Avto_ON(); //кнопка вкл. автоматич. режим
}
void show_Serial(void) //функция вывода в последовательный порт
{
Serial.println(utf8rus("РЕЛЕ ПРИТОЧНОЕ1= ") + String(!Rel_Zal_1_Prit_StatusNow) +
utf8rus(" РЕЛЕ ВЫТЯЖНОЕ1= ") + String(!Rel_Zal_1_Vyt_StatusNow) +
utf8rus(" РЕЛЕ ПРИТОЧНОЕ2= ") + String(!Rel_Zal_2_Prit_StatusNow) +
utf8rus(" РЕЛЕ ВЫТЯЖНОЕ2= ") + String(!Rel_Zal_2_Vyt_StatusNow) +
utf8rus(" РЕЛЕ ПРИТ.МАСТ.= ") + String(!Rel_Mastersk_Prit_StatusNow) +
utf8rus(" РЕЛЕ ВЫТ.МАСТ.= ") + String(!Rel_Mastersk_Vyt_StatusNow));
}
void statik_obekt_tft(void) //функция вывода на дисплей таблицы и надписей
{
tft.setTextSize(2); // размер шрифта "текста".
tft.setTextColor(BLUE, BLACK); // цвет текста , фон за текстом.
tft.setCursor(8, 4); // установить курсор по координатам-- setCursor(Y,X ).
tft.print(utf8rus("КОНТРОЛЬ ТЕМП-РЫ,ВЛАЖ-ТИ,ВЕН-РОВ"));// вывести текст на экран по предыдущим координатам.
tft.setTextColor(MAGENTA);
tft.setCursor(143, 27);
tft.print(utf8rus("УЛИЦА") + utf8rus(" 1КОМ ") + utf8rus("2КОМ ") + utf8rus("МАС-Я"));
tft.setTextColor(WHITE);
tft.setCursor(2, 27), tft.print(utf8rus(" ИНФО.ЭКРАН"));
tft.setTextColor(BLUE);
tft.setCursor(2, 50), tft.print(utf8rus("ТЕМ-РА.гр.С"));
tft.setCursor(2, 72), tft.print(utf8rus("ОТН-АЯ.ВЛ.%"));
tft.setCursor(2, 94), tft.print(utf8rus("АБС.ВЛг/м*3"));
tft.drawRect(0, 0, 400, 240, GREEN); //нарисовать прямоугольник по координатам
tft.drawRect(1, 1, 398, 238, GREEN);
tft.drawLine(0, 21, 400, 21, GREEN); // нарисовать линию по координатам
tft.drawLine(0, 46, 400, 46, GREEN);
tft.drawLine(0, 68, 400, 68, GREEN);
tft.drawLine(0, 90, 400, 90, GREEN);
tft.drawLine(0, 112, 400, 112, GREEN);
tft.drawLine(137, 22, 137, 112, GREEN);
tft.drawLine(203, 22, 203, 112, GREEN);
tft.drawLine(268, 22, 268, 112, GREEN);
tft.drawLine(331, 22, 331, 112, GREEN);
tft.drawRect(2, 23, 134, 22, WHITE);
tft.drawRect(3, 24, 132, 20, WHITE);
}
void But_Zal_1_Ventil_ON() {
tft.fillRoundRect(5, 119, 100, 55, 25, BLUE);
tft.drawRoundRect(5, 119, 100, 55, 25, RED);
tft.drawRoundRect(4, 118, 102, 57, 25, RED);
tft.setTextSize(2);
tft.setTextColor(BLACK);
tft.setCursor(27, 120), tft.print(utf8rus("1комн"));
tft.setTextSize(1);
tft.setCursor(25, 136), tft.print(utf8rus("ВЕНТИЛЯЦИЯ"));
tft.setCursor(31, 145), tft.print(utf8rus("ВКЛЮЧИТЬ"));
tft.setTextSize(2);
tft.setCursor(26, 155), tft.print(utf8rus("*ВКЛ*"));
}
void But_Zal_1_Ventil_OFF() {
tft.fillRoundRect(5, 119, 100, 55, 25, RED);
tft.setTextSize(2);
tft.setTextColor(BLACK);
tft.setCursor(27, 120), tft.print(utf8rus("1комн"));
tft.setTextSize(1);
tft.setCursor(25, 136), tft.print(utf8rus("ВЕНТИЛЯЦИЯ"));
tft.setCursor(28, 145), tft.print(utf8rus("ВЫКЛЮЧИТЬ"));
tft.setTextSize(2);
tft.setCursor(20, 155), tft.print(utf8rus("*ВЫКЛ*"));
}
void But_Zal_1_Vyt_ON() {
tft.fillRoundRect(5, 179, 100, 55, 25, BLUE);
tft.drawRoundRect(5, 179, 100, 55, 25, RED);
tft.drawRoundRect(4, 178, 102, 57, 25, RED);
tft.setTextSize(2);
tft.setTextColor(BLACK);
tft.setCursor(27, 180), tft.print(utf8rus("1комн"));
tft.setTextSize(1);
tft.setCursor(33, 196), tft.print(utf8rus("ВЫТЯЖКА"));
tft.setCursor(31, 205), tft.print(utf8rus("ВКЛЮЧИТЬ"));
tft.setTextSize(2);
tft.setCursor(26, 215), tft.print(utf8rus("*ВКЛ*"));
}
void But_Zal_1_Vyt_OFF() {
tft.fillRoundRect(5, 179, 100, 55, 25, RED);
tft.setTextSize(2);
tft.setTextColor(BLACK);
tft.setCursor(27, 180), tft.print(utf8rus("1комн"));
tft.setTextSize(1);
tft.setCursor(33, 196), tft.print(utf8rus("ВЫТЯЖКА"));
tft.setCursor(29, 205), tft.print(utf8rus("ВЫКЛЮЧИТЬ"));
tft.setTextSize(2);
tft.setCursor(20, 215), tft.print(utf8rus("*ВЫКЛ*"));
}
void But_Zal_2_Ventil_ON() {
tft.fillRoundRect(110, 119, 100, 55, 25, BLUE);
tft.drawRoundRect(110, 119, 100, 55, 25, RED);
tft.drawRoundRect(109, 118, 102, 57, 25, RED);
tft.setTextSize(2);
tft.setTextColor(BLACK);
tft.setCursor(132, 120), tft.print(utf8rus("2комн"));
tft.setTextSize(1);
tft.setCursor(130, 136), tft.print(utf8rus("ВЕНТИЛЯЦИЯ"));
tft.setCursor(136, 145), tft.print(utf8rus("ВКЛЮЧИТЬ"));
tft.setTextSize(2);
tft.setCursor(131, 155), tft.print(utf8rus("*ВКЛ*"));
}
void But_Zal_2_Ventil_OFF() {
tft.fillRoundRect(110, 119, 100, 55, 25, RED);
tft.setTextSize(2);
tft.setTextColor(BLACK);
tft.setCursor(132, 120), tft.print(utf8rus("2комн"));
tft.setTextSize(1);
tft.setCursor(130, 136), tft.print(utf8rus("ВЕНТИЛЯЦИЯ"));
tft.setCursor(134, 145), tft.print(utf8rus("ВЫКЛЮЧИТЬ"));
tft.setTextSize(2);
tft.setCursor(125, 155), tft.print(utf8rus("*ВЫКЛ*"));
}
void But_Zal_2_Vyt_ON() {
tft.fillRoundRect(110, 179, 100, 55, 25, BLUE);
tft.drawRoundRect(110, 179, 100, 55, 25, RED);
tft.drawRoundRect(109, 178, 102, 57, 25, RED);
tft.setTextSize(2);
tft.setTextColor(BLACK);
tft.setCursor(132, 180), tft.print(utf8rus("2комн"));
tft.setTextSize(1);
tft.setCursor(138, 196), tft.print(utf8rus("ВЫТЯЖКА"));
tft.setCursor(136, 205), tft.print(utf8rus("ВКЛЮЧИТЬ"));
tft.setTextSize(2);
tft.setCursor(131, 215), tft.print(utf8rus("*ВКЛ*"));
}
void But_Zal_2_Vyt_OFF() {
tft.fillRoundRect(110, 179, 100, 55, 25, RED);
tft.setTextSize(2);
tft.setTextColor(BLACK);
tft.setCursor(132, 180), tft.print(utf8rus("2комн"));
tft.setTextSize(1);
tft.setCursor(138, 196), tft.print(utf8rus("ВЫТЯЖКА"));
tft.setCursor(134, 205), tft.print(utf8rus("ВЫКЛЮЧИТЬ"));
tft.setTextSize(2);
tft.setCursor(125, 215), tft.print(utf8rus("*ВЫКЛ*"));
}
void But_Mastersk_Ventil_ON() {
tft.fillRoundRect(215, 119, 100, 55, 25, BLUE);
tft.drawRoundRect(215, 119, 100, 55, 25, RED);
tft.drawRoundRect(214, 118, 102, 57, 25, RED);
tft.setTextSize(2);
tft.setTextColor(BLACK);
tft.setCursor(230, 120), tft.print(utf8rus("маст-я"));
tft.setTextSize(1);
tft.setCursor(235, 136), tft.print(utf8rus("ВЕНТИЛЯЦИЯ"));
tft.setCursor(241, 145), tft.print(utf8rus("ВКЛЮЧИТЬ"));
tft.setTextSize(2);
tft.setCursor(237, 155), tft.print(utf8rus("*ВКЛ*"));
}
void But_Mastersk_Ventil_OFF() {
tft.fillRoundRect(215, 119, 100, 55, 25, RED);
tft.setTextSize(2);
tft.setTextColor(BLACK);
tft.setCursor(230, 120), tft.print(utf8rus("маст-я"));
tft.setTextSize(1);
tft.setCursor(235, 136), tft.print(utf8rus("ВЕНТИЛЯЦИЯ"));
tft.setCursor(239, 145), tft.print(utf8rus("ВЫКЛЮЧИТЬ"));
tft.setTextSize(2);
tft.setCursor(230, 155), tft.print(utf8rus("*ВЫКЛ*"));
}
void But_Mastersk_Vyt_ON() {
tft.fillRoundRect(215, 179, 100, 55, 25, BLUE);
tft.drawRoundRect(215, 179, 100, 55, 25, RED);
tft.drawRoundRect(214, 178, 102, 57, 25, RED);
tft.setTextSize(2);
tft.setTextColor(BLACK);
tft.setCursor(231, 180), tft.print(utf8rus("маст-я"));
tft.setTextSize(1);
tft.setCursor(245, 196), tft.print(utf8rus("ВЫТЯЖКА"));
tft.setCursor(243, 205), tft.print(utf8rus("ВКЛЮЧИТЬ"));
tft.setTextSize(2);
tft.setCursor(236, 215), tft.print(utf8rus("*ВКЛ*"));
}
void But_Mastersk_Vyt_OFF() {
tft.fillRoundRect(215, 179, 100, 55, 25, RED);
tft.setTextSize(2);
tft.setTextColor(BLACK);
tft.setCursor(231, 180), tft.print(utf8rus("маст-я"));
tft.setTextSize(1);
tft.setCursor(245, 196), tft.print(utf8rus("ВЫТЯЖКА"));
tft.setCursor(241, 205), tft.print(utf8rus("ВЫКЛЮЧИТЬ"));
tft.setTextSize(2);
tft.setCursor(232, 215), tft.print(utf8rus("*ВЫКЛ*"));
}
void But_Ventil_Avto_ON() {
tft.fillCircle(353, 176, 40, BLUE);
tft.drawCircle(353, 176, 40, RED);
tft.drawCircle(353, 176, 41, RED);
tft.setTextSize(1);
tft.setTextColor(BLACK);
tft.setCursor(327, 150), tft.print(utf8rus("АВТОМАТИЧ"));
tft.setCursor(339, 160), tft.print(utf8rus("ЕСКАЯ"));
tft.setCursor(324, 170), tft.print(utf8rus("ВЕНТИЛЯЦИЯ"));
tft.setCursor(331, 180), tft.print(utf8rus("ВКЛЮЧИТЬ"));
tft.setTextSize(2);
tft.setCursor(326, 190), tft.print(utf8rus("*ВКЛ*"));
}
void But_Ventil_Avto_OFF() {
tft.fillCircle(353, 176, 40, RED);
tft.setTextSize(1);
tft.setTextColor(BLACK);
tft.setCursor(326, 147), tft.print(utf8rus("АВТОМАТИЧ"));
tft.setCursor(338, 156), tft.print(utf8rus("ЕСКАЯ"));
tft.setCursor(324, 167), tft.print(utf8rus("ВЕНТИЛЯЦИЯ"));
tft.setCursor(328, 176), tft.print(utf8rus("ВЫКЛЮЧИТЬ"));
tft.setTextSize(2);
tft.setCursor(319, 186), tft.print(utf8rus("*ВЫКЛ*"));
}
void touch() {
tp = ts.getPoint(); //считываем их значения в tp.x, tp.y и tp.z----------tp.x, tp.y значение АЦП
pinMode(XM, OUTPUT); // при совместном использовании контактов необходимо исправить направление контактов с сенсорным экраном
pinMode(YP, OUTPUT); // общие пины возвращаем в нужное экрану состояние
pinMode(XP, OUTPUT);
pinMode(YM, OUTPUT);
x = map(tp.x, 900, 190, 0, 240); //преобразование значений АЦП из ts.getPoint () к значениям экрана, например 0-240
y = map(tp.y, 960, 190, 400, 0);
z = tp.z;
}
String utf8rus(String source) { // функция вывода русского шрифта/ файл glcdfont.c с русскими буквами нужно поместить в библитеку Adafruit-GFX,
int i, k;
String target;
unsigned char n;
char m[2] = { '0', '\0' };
k = source.length(); i = 0;
while (i < k) {
n = source[i]; i++;
if (n >= 0xC0) {
switch (n) {
case 0xD0: {
n = source[i]; i++;
if (n == 0x81) {
n = 0xA8;
break;
}
if (n >= 0x90 && n <= 0xBF) n = n + 0x30;
break;
}
case 0xD1: {
n = source[i]; i++;
if (n == 0x91) {
n = 0xB8;
break;
}
if (n >= 0x80 && n <= 0x8F) n = n + 0x70;
break;
}
}
}
m[0] = n; target = target + String(m);
}
return target;
}



