Вентиляция цокольного этажа с сенсорным управлением.

Нет ответов
Yurik_krr
Offline
Зарегистрирован: 20.10.2017

Всем привет. В кратце с чего все это началось. Имеется цокольный этаж с тремя комнатами, пока нежилые.

При закрытых окнах постоянно повышается влажность. Принято решение поставить в каждой комнате по два вентилятора: вытяжной и приточный. В интернете начались поиски какого нибудь блока управления вентиляторами в зависимости от влажности на улице и в помещении. Ничего путевого не нашлось, но наткнулся на статьи о вениляции на ардуино. После изучения информации про ардуино я вспомнил что 15 лет назад изучал язык с. и с++. Пару недель ушло на то что бы вспомнить язык програмирования и снова научится читать код.  Написаный код не универсален и возможно не очень аккуратен но, так получилось.

После чего были куплены: ардуино мега, tft шилд, 4 DHT22 и два блока реле, та как каждый вентилятор включается отдельно, всего 6. Но как говорится легких путей не ищем, было решено делать все на сенсорном управлении. Кстати в какой то момент я пожалел что сделал 7 кнопок, когда пытался написать условие включения и выключения каждой кнопки, думал не получится.

Что получилось: 7 сенсорных кнопок, 3 кнопки включения принудительной вентиляции отдельно в каждой комнате, 3 кнопки включения вытяжки отдельно в каждой комнате и 1 кнопка вкючения автоматической вентиляции.  В автоматическом режиме есть толька одна настройка в окне информации, температура выключения вентиляторов в зависимости от температуры в помещении. 

Информация была подсмотрена  http://arduino.ru/forum/proekty/kontrol-vlazhnosti-podvala-arduino-pro-mini  и 

http://arduino.ru/forum/programmirovanie/tft-24-touch-shield-nuzhna-pomoshch-v-programmirovanie-knopok-na-ekrane

 

#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;
}