Официальный сайт компании Arduino по адресу arduino.cc
Вентиляция цокольного этажа с сенсорным управлением.
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Всем привет. В кратце с чего все это началось. Имеется цокольный этаж с тремя комнатами, пока нежилые.
При закрытых окнах постоянно повышается влажность. Принято решение поставить в каждой комнате по два вентилятора: вытяжной и приточный. В интернете начались поиски какого нибудь блока управления вентиляторами в зависимости от влажности на улице и в помещении. Ничего путевого не нашлось, но наткнулся на статьи о вениляции на ардуино. После изучения информации про ардуино я вспомнил что 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; }