Климат контроль.

Nord_Air
Offline
Зарегистрирован: 15.06.2020

Всем доброго времени суток.  Сам начал разбираться, с ардуинкой, написал программку. Польовался в основном материалами амперки. И посчиталправильным разместить свою первую  прогу на их форуме..
Честно.справедливо, более чем на мой взгляд... 

 

Это с их форума...

Форум и раньше был еле живой, а после "модератерства" "царя" 'ИгорьК' он вообще почти издох. Если есть желание оживить этот форум, то не стоит набрасываться на каждого нового пользователя.
Хотя

Nord_Air сказал(а): 
Зарегался я тут уже давно

с датой регистрации 15.06.2020 как-то не вяжется...
Но всё же любого "зазнайку" можно попытаться поставить на место баз всяких банов и удаления его сообщений -- пользы больше будет.

 




 ребят, может вы мне поясните...  Я что-то не понимаю в современных реалиях. Я просто написал программу, выложил её на форуме...   Меня Банят как какого-то злоумышлиника

 

Nord_Air
Offline
Зарегистрирован: 15.06.2020
// 
//Программа: Система Жизнеобеспечивания "Сорока" 
//Система, на данный момент состоит из 2-х климатических датчиков, для измерения температуры и влажности снаружи и внутри помещения. И двух кнопок,
//для переключения режима "Дома","Вне дома" и ручного включения проветривания с помощью вытяжных вентиляторов. 
//
//1. Режим "Дома" включает в себя:  
//    а) 5ти минутное проветривание примерно каждые пол часа (с появлением датчика уровня CO2 режим будет опираться на его показания).
//    б) Контроль температуры +21 градус Цельсия, путем включения обогревателя или проветривания.
//    в) Проветривание помещения, если влажность поднялась значительно (более 20%) выше уличной. Данный пункт возможно будет актуален после пользованием душем и/или парной.
//    г) Ручное включение проветривания кнопкой.
//
//2. Режим "Вне Дома" включает в себя:
//    а) Система выдерживает как можно более низкую влажность в помещении, насколько это позволяет погода (пока отсутствует осушитель воздуха). 
//       В диапазоне уличных температуры от +5 до +27 градусов. Чтобы не вымораживать и не перегревать помещение.
//    
//3. Прочие функции:
//    а) В случае обрыва одного из датчиков, система не выполняет никаких функций кроме 5-ти минутного проветривания каждые пол часа и ручного включения вентиляторов.
//
//
// Программа включат в себя свободно распространяемые библиотеки: (UTFT для работы с дисплеем) и  (iarduino_DHT.h для работы с климатическими датчиками) 
// 
// Программа распространяется бесплатно. Автор: Nord_Air

//библиотека для работы с дисплеем
#include <UTFT.h>

#include <iarduino_DHT.h>
//#include <TroykaDHT.h>

// создаём объект класса UTFT
// и передаём идентификатор модели дисплея и номера пинов
// к которым подключаются линии SCK, SDI (MOSI), D/C, RESET, CS

//  UTFT myGLCD(TFT01_22SP, SDI (MOSI),SCK, CS, RESET, D/C);
    UTFT myGLCD(TFT01_22SP, 8,         9,   10, 11,    12 );

// объявления встроенных шрифтов
extern uint8_t SmallFont[];
extern uint8_t BigFont[];


iarduino_DHT sensor1(6);   //Улица
iarduino_DHT sensor(3);    //Дом
iarduino_DHT sensor2(2);   //Пол

//----Пины кнопок------------------
const int COOLER_BUTTON_INSIDE = 30;  
const int COOLER_BUTTON_OUTSIDE = 28;
const int MODE_BUTTON_INSIDE = 24;
const int MODE_BUTTON_OUTSIDE = 26;
const int SENSOR_OUTSIDE_POWER = 7; //Питание внешнего датчика +5V идет с 7ого пина, для возможности его быстрой перезагрузки.
//----------------------------------

//----Пины реле------------
const int Rele_Cooler = 5;           //Управляющи пин на включение вентилятора
const int Rele_Heater = 4;           //Управляющи пин на включение розетки (отопителя)
//-------------------------

byte tact;
int  act=0;
int  Global_act=1;

boolean Home;               // переменная режима (дома/вне дома)
boolean Home_z;

boolean cooler_button;      //Кнопка принудительного включения вентилятора
boolean cooler_button_z;    //Переменная для хранения состояния кнопки
                            //принудительного включения вентилятора.
//byte humidity_gisterezis=0;
                          

boolean cooler=0;             //Переменная текущего состояния вентилятора
boolean cooler_z;           //Переменная сохранения статуса вентилятора

boolean heater=0;             //Переменная текущего состояния отопителя
boolean heater_z;           //Переменная сохранения статуса отопителя


int8_t T;             //Забортная температура воздуха
int8_t W;             //Забортная влажность
int8_t t;             //Температура воздуха внутри помещения
int8_t w;             //Влажность внутри помещения
int8_t t_floor;       //Температура пола
int8_t w_floor;       //Влажность пола


int8_t T2;               //Единицы счетчика забортной температуры.
int8_t T1;               //Десятки счетчика забортной температуры.
int8_t T2_z;             //Временная переменная для сохранения значения счетчика.
int8_t T1_z;

int8_t t2;               //Единицы счетчика внутренней температуры.
int8_t t1;               //Десятки счетчика внутренней температуры.
int8_t t1_z;
int8_t t2_z;

int8_t W2;               //Единицы счетчика забортной влажности.
int8_t W1;               //Десятки счетчика забортной влажности.
int8_t W1_z;
int8_t W2_z;
                              
int8_t w2;               //Единицы счетчика забортной влажности.
int8_t w1;               //Единицы счетчика забортной влажности. 
int8_t w1_z;
int8_t w2_z;

int8_t t_floor2; 
int8_t t_floor1;
int8_t t_floor2_z; 
int8_t t_floor1_z;

int8_t w_floor1;
int8_t w_floor2;  
int8_t w_floor1_z;
int8_t w_floor2_z;

boolean sensor_inside_fail=0;   //Переменная для фиксации оторванного внутреннего датчика.
boolean sensor_outside_fail=0;   //Переменная для фиксации оторванного внешнего датчика.

int error_1_sensor_inside;




//----Объявление функций опущенных ниже тела программы-----
int Write_15px (char, int, int);
int counter (int x, int y, byte count_number);
int draw_cooler_on_icon (byte a, byte b, byte c, int x, int y, byte id);
int draw_cooler_off_icon ( int x, int y);
int draw_home_icon(); 
int draw_environment(); 
int light_counter ();
int symbol_temperature();
//----Описание в самих функциях---------------------------

void(* resetFunc) (void) = 0;  //Функция софтварного рестарта
                            


void save_sensor()  // Функция сохраняет текущие значения датчиков в переменные _z.
  {   
   T1_z=T1;
   T2_z=T2;
   W1_z=W1;
   W2_z=W2;
   
   t1_z=t1; 
   t2_z=t2;
   w1_z=w1;
   w2_z=w2;    
   
   t_floor1_z=t_floor1;
   t_floor2_z=t_floor2;
   w_floor1_z=w_floor1;
   w_floor2_z=w_floor2;   
  }
 

 void state_sensor() // Функция сравнивает текущие значения датчиков, со значениями из
                     // прошлого цикла, сохраненные функцией save_sensor.
                     // Если значения изменилиcь, запускает соответствующий счетчик.
                     // Перерисовываются только те разряды счетков, которые изменились
                     // в сравнении с сохраненным значением. 
  {              
   if (T1!=T1_z) {counter (175,176,T1);} //Температура забортом (десятки)
   if (T2!=T2_z) {counter (188,176,T2);} //Температура забортом (единицы)
  
   if (W1_z!=W1) {counter (175,201,W1);} //Влажность забортом (десятки) 
   if (W2_z!=W2) {counter (188,201,W2);} //Влажность забортом (единицы) 
   
   if (t1_z!=t1) {counter (175,21,t1); } //Температура в кабине (десятки)
   if (t2_z!=t2) {counter (188,21,t2); } //Температура в кабине (еденицы)
   
   if (w1_z!=w1) {counter (175,45,w1); } //Влажность в кабине (десятки)
   if (w2_z!=w2) {counter (188,45,w2); } //Влажность в кабине (еденицы)
   
   if (w_floor1_z!=w_floor1)  {counter (175,118,w_floor1);}  // Влажность пола (десятки)
   if (w_floor2_z!=w_floor2)  {counter (188,118,w_floor2);}  // Влажность пола (еденицы) 
 
   if (t_floor1_z!=t_floor1)  {counter (175,94,t_floor1);}  // Температура пола (десятки)
   if (t_floor2_z!=t_floor2)  {counter (188,94,t_floor2);}  // Температура пола (еденицы) 
  }
  
 

void check_sensor()  //Процедура считывет показания сенсоров и раскидывает значения по переменным для счетчика. 
{
   switch(sensor1.read()){    // читаем показания забортного датчика 
    case DHT_OK:            W=sensor1.hum; 
                            T=sensor1.tem;  
                            break;}
  
  switch(sensor.read()){    // читаем показания датчика внутри помещения
    case DHT_OK:            w=(sensor.hum)+4; 
                            t=(sensor.tem)-2;  
                            break;} 
                            
   switch(sensor2.read()){    // читаем показания датчика внутри пола
   case DHT_OK:            w_floor=(sensor2.hum)-5; 
                           t_floor=(sensor2.tem)-5;  
                           break;}            
         //delay(100);
  
  
         // Расчитываем значения разрядов текущей темпереатуры забортом и заносим в переменные.
  T2 = T % 10 ;               //Единицы счетчика.
  T1 = (T /10) % 10 ;         //Десятки счетчика.

  	// Расчитываем значения разрядов текущей темпереатуры в кабине и заносим в переменные.
  t2 = t % 10;                 //Единицы счетчика.
  t1 = (t /10) % 10;           //Десятки счетчика.

        // Расчитываем значения разрядов текущей влажности забортом и заносим в переменные.
  W2 = W % 10;                 //Единицы счетчика.
  W1 = (W /10) % 10 ;          //Десятки счетчика.

  	// Расчитываем значения разрядов текущей влажности в кабине и заносим в переменные.
  w2 = w % 10;                 //Единицы счетчика.
  w1 = (w /10) % 10;           //Десятки счетчика.  
  
        // Расчитываем значения разрядов текущей влажности и температуры пола и заносим в переменные.
  w_floor2 = w_floor % 10;      //Единицы счетчика.
  w_floor1 = (w_floor /10) % 10;//Десятки счетчика.
  
  t_floor2 = t_floor % 10;      //Единицы счетчика.
  t_floor1 = (t_floor /10) % 10;//Десятки счетчика.
  


//-------Авариный режим---------------------------------
  if (W==0 && T==0 && act>10) {sensor_outside_fail=1;}
     else   {sensor_outside_fail=0;};                                                 // Если оборвется один из датчиков, переменные примут нулевые значения.
  if (w==0 && t==0 && act>10) {sensor_inside_fail=1;}
     else   {sensor_inside_fail=0;};
//------------------------------------------------------  

if ( w==0 && t==0 && act>30 ) {resetFunc();};                            //Софтварный рестарт системы, если пропадут значения от внитреннего датчика.
if ( W==0 && T==0 && act>30 ) {
                               digitalWrite(SENSOR_OUTSIDE_POWER, LOW); //"Аппаратный" рестарт датчкика, если пропадут значения от внешнего датчика.
                               delay (300);
                               digitalWrite(SENSOR_OUTSIDE_POWER, HIGH);
                              };
}

void draw_act_counter (int i) //Функция рисует счетчик актов.
 {
    int a,b,c,d;
    
    a = i % 10;                 //Единицы счетчика.
    b = (i /10) % 10;
    c = (i /100) % 10;
    d = (i /1000) % 10;
    
                        light_counter (300,3,a,1);
 if (((act)%10)==0)    {light_counter (295,3,b,1);};  
 if (((act)%100)==0)   {light_counter (290,3,c,1);};   
 if (((act)%1000)==0)  {light_counter (285,3,d,1);};
 }

  //Функция проверки остатков ОЗУ, найдена на просторах инета.
    int freeRam () {
      extern int __heap_start, *__brkval; 
      int v; 
      return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval); 
                     }
                     
 

void setup()
{ 
  //----Кнопочные пины----------------------
  pinMode(MODE_BUTTON_INSIDE, INPUT_PULLUP);
  pinMode(MODE_BUTTON_OUTSIDE, OUTPUT);
  digitalWrite(MODE_BUTTON_OUTSIDE, LOW);
  
  pinMode(COOLER_BUTTON_INSIDE, INPUT_PULLUP);
  pinMode(COOLER_BUTTON_OUTSIDE, OUTPUT);
  digitalWrite(COOLER_BUTTON_OUTSIDE, LOW);
  //----------------------------------------
  
  //-----Пины реле----------------
  pinMode(Rele_Cooler, OUTPUT);
  digitalWrite(Rele_Cooler, HIGH);

  pinMode(Rele_Heater, OUTPUT);
  digitalWrite(Rele_Heater, HIGH);
  //------------------------------
  
  //-------Питание внешнего датчика---------
  pinMode(SENSOR_OUTSIDE_POWER, OUTPUT);
  digitalWrite(SENSOR_OUTSIDE_POWER, HIGH);
  //----------------------------------------
  
  
  // инициализируем дисплей с горизонтальной ориентацией
  myGLCD.InitLCD(1);
  Serial.begin(9600); 
}

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////----Начало программы------//////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

void loop()
{   
   
   if (tact==9) {tact=5;};                      //Сброс счетчика// Такты 6,7,8 для анимации, 5 для функций, (1,2,3,4 зарезервировано, загрузочные такты)
   if (act==2400) {act=0;                       //Сброс счетчика//
                   Global_act++;};  
   if (Global_act==65) {Global_act=1;};         //Сброс счетчика//    
 
//---------Присваиваем состояние кнопок переменным---------                
 Home = digitalRead(MODE_BUTTON_INSIDE); 
 cooler_button = digitalRead(COOLER_BUTTON_INSIDE); 
 
//---------------------------------------------------------   

//----------Режим работы реле--------------------------
                                                     
if (cooler==1) {digitalWrite(Rele_Cooler, LOW);};    
if (cooler==0) {digitalWrite(Rele_Cooler, HIGH);};

if (heater==1) {digitalWrite(Rele_Heater, LOW);};
if (heater==0) {digitalWrite(Rele_Heater, HIGH);};                
//-----------------------------------------------------     
  
 if (tact==5)          //На пятом такте отправляем дежурные или проверочные данные в серийный порт.
  {                      
    Serial.println("\n[memCheck]");  
    Serial.println((freeRam()) );
    
    Serial.println("\n[act] - ");
    Serial.print(act);
    
    
    Serial.println("\n[heater] - ");
    Serial.print(heater);          
  };  
  
  if ( act==32 || act==64 ) {
                             digitalWrite(SENSOR_OUTSIDE_POWER, LOW); //"Аппаратный" рестарт датчкика.
                             delay (300);
                             digitalWrite(SENSOR_OUTSIDE_POWER, HIGH);
                              };
  
  
 if (act==1)
  { 
     myGLCD.InitLCD(1); // инициализируем дисплей с горизонтальной ориентацией     
     myGLCD.clrScr(); // очищаем экран     
     draw_environment(); //Рисуем всё статичное изоражение 
     //humidity_gisterezis=0;  //Сброс гистерезиса влажности в нулевое значение.
    
  }; 
  
//////-----Основные функции программы--------------------------------------------------------------------------------------------------------------------------------------                                   
//---------1.Климатические Режимы------------------------------------------------------------------------------------------------------------------------------------------
   
                                                                                        //Включается при +20 выключается при 22
   if (Home==0 && t<21 )  {heater=1;} ;                                                //Подогрев воздуха если температура в помещении ниже +21 градуса.
    if (Home==0 && t>21) {heater=0;};                                                  //А на улице еще холоднее. Выключение обогрева при t>21 градусов
     if (Home==0 && sensor_inside_fail==1 || Home==1) {heater=0;};                     //Запрет на запуск, при потере внутреннего датчика или выключенной кнопки "Дома".
           //else {heater=0;};                                                                 
           

   if (Home==0 && cooler_button==0 && act>2200) 
                    {cooler=1;}                                                             //5-ти минутное проветривание каждые пол часа, вне зависимости 
                                                                                            //от забортной температуры. (пока нет датчика уровня CO2)
     
     else if (Home==0 && cooler_button==0 && (w-W)>20 && sensor_outside_fail==0 && sensor_inside_fail==0)
                    {cooler=1;}                                                            //Проветривание, если влажность в помещении значительно ниже уличной.
      
      else if (Home==0 && cooler_button==0 && t<21 && T>t && sensor_outside_fail==0 && sensor_inside_fail==0) 
                    {cooler=1;}                                                             //Если уличная температура выше домашней (теплое утро после холодно ночи),
                                                                                            //то прогреваем помещение забортным воздухом.
      
       else if (Home==0 && cooler_button==0 && t>23 && T<20 && sensor_outside_fail==0 && sensor_inside_fail==0)
                    {cooler=1;}
                                                                                            //Если в помещении стало слишком жарко ( < +23), от дровянной печи, а на улице 
                                                                                            // более прохладно ( > 20),то включаем проветривание.
        else if (Home==0 && cooler_button==1) 
                    {cooler=1;}                                                             // Включаем вентеляцию, если включена кнопа принудительной вентиляции.
                                                                                            //Запрет на запуск, в случае оборванного датчика, кроме ручного включения
                                                                                            //вентеляции и 5ти минутного проветривания каждые пол часа.
 
                         
 //--------------------------- Режим "Вне дома"----------------------------------------------------       
        
         else if (Home==1 && T>5 && T<27 && W<(w-2) && sensor_outside_fail==0  && sensor_inside_fail==0) 
                    { cooler=1;}
                                                                     // Летнее проветривание, при температурах от +5 до 27,
                                                                                            // и влажности на улице меньше чем дома.
                                                                                            // Вентилятор работает пока влажность дома не будет ниже уличной.
                                                                                            // При первом включении гистерезис влажности 0%, при попытке следующего в течении
                                                                                            // текущего акта,  -5% влажности,
                                                                                            // для внутреннего датчика.
             else   {cooler=0;};                                                            
//----------------------------------------------------------------------------------------------------------------------------------------------------------------
 
 //--------------Отрисовка вентеляторов-----------------------   
  if (cooler==1)                        {draw_cooler_on_icon (0,85,255, 270,25,1);}; //Вынесенно отдельно от режимов работы реле  
  if (cooler==0)                        {draw_cooler_off_icon (270, 25);};
  if (cooler_button_z != cooler_button) {myGLCD.setColor(0,0,0); int x=270, y=25; 
                                         myGLCD.fillRect (x-10,y-10,x+40,y-5);  
                                         myGLCD.fillRect (x+40,y-5,x+35,y+40);
                                         myGLCD.fillRect (x-10,y+40,x+35,y+35);
                                         myGLCD.fillRect (x-10,y-10,x-5,y+35);}; //Добавлено, для случая, когда вентилятор включен системой, а необходимо убрать бегующую рамку
                                                                                 //от ручного включения вентилятора.
  
  if (heater==1) { draw_cooler_on_icon (200,22,22, 270,75,2);};
  if (heater==0) { draw_cooler_off_icon (270, 75);};   
//-----------------------------------------------------------

///----------Бегающая рамка при включенном вручную вентиляторе и кнопка "Дома"-----------------------
  if ( Home==0 && cooler_button==1 && tact==6) { 
                                     myGLCD.setColor(0,0,0);
                                     myGLCD.drawRoundRect(270-8,25-8,270+38,25+38);
                                     myGLCD.setColor(VGA_BLUE);                    
                                     myGLCD.drawRoundRect(270-6,25-6,270+36,25+36);}
  if (Home==0 && cooler_button==1 && tact==7) { 
                                     myGLCD.setColor(0,0,0);                                                                   
                                     myGLCD.drawRoundRect(270-6,25-6,270+36,25+36);
                                     myGLCD.setColor(VGA_BLUE);             
                                     myGLCD.drawRoundRect(270-7,25-7,270+37,25+37);};
  
  if (Home==0 && cooler_button==1 && tact==8) { 
                                     myGLCD.setColor(0,0,0);
                                     myGLCD.drawRoundRect(270-7,25-7,270+37,25+37);
                                     myGLCD.setColor(VGA_BLUE);
                                     myGLCD.drawRoundRect(270-8,25-8,270+38,25+38);}; 
                                   
  if (Home != Home_z) {draw_home_icon (270, 200, Home);};       //Рисуем иконку дома, если состояние кнопки изменилось,
                                                                //серую или светлую - решит сама функция.    
                                                               
///---------------------------------------------------------------------------------------------------- 
 
   
 if (tact != 5){delay(600);} // Задержка, влияюющая на скорость анимации, для всех тактов кроме пятого. 
                             
   //delay(100); 
   
   //-------------Сохранение некоторых значений,--   
   Home_z=Home;  //отдельно от функции save, для сохранения каждый такт.
   cooler_z=cooler;
   heater_z=heater;
   cooler_button_z = cooler_button;
   //---------------------------------------------
  
 //------Счетчик актов и тактов в углу экрана------------
   if (act==1) {light_counter (277,3,Global_act,0);};
   draw_act_counter (act);
   light_counter (310,3,tact,1);   
 //------------------------------------------------------
 
 if (tact==5)  //На пятом такте
  {   
    check_sensor(); //Считываем показания климатических датчиков.  
    state_sensor(); //Если значения изменились по сравнению с предыдущим сохранением,
                    //то перерисовываем разряд счетчика с новым значением. 
    save_sensor();  //Сохраняем текущее значение разрядов всех датчиков. 
  } 
 
   tact++;
   act++;
  
}


////-----Расход ОЗУ----////

// 1. check_sensor();   |
//    state_sensor();   |      - 30 byte
//    save_sensor();    |
//    counter();        |
//    iarduino_DHT sensor1(6); - 16 byte
//    iarduino_DHT sensor(3);  - 16 byte
//    iarduino_DHT sensor2(2); - 16 byte
//--------------------------------------
//    78 byte (78 byte)
//
// 2. draw_environment();      - 0 byte
//-------------------------------------
//
// 3. coller();                - 2  byte
//    draw_home_icon();        - 1  byte
//    light_counter();         - 2  byte
//   (Write_15px();            - 36 byte - 1 вызов)    (9100 byte)
//    Write_15px();            - 46 byte - 7 вызовов
//-------------------------------------
//    51 byte  (129 byte)
//
//


///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
 
            //Функции
 
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
 void draw_home_icon( int x, int y, boolean Home)  //Функция отрисовки иконки "Дома"
  {
    if (Home==0){   myGLCD.setColor(255,100,0);
                    myGLCD.drawLine(x+6,y+13,x+15,y+4);
                    myGLCD.drawLine(x+16,y+5,x+24,y+13);  
                    myGLCD.setColor(224,252,151);
                    myGLCD.drawRoundRect(x-4,y-4,x+34,y+34);
                    myGLCD.setColor(80,80,80);
                    myGLCD.drawRoundRect(x-2,y-2,x+32,y+32);
                    myGLCD.setColor(VGA_WHITE);
                  }
    else          {
                    myGLCD.setColor(50,50,50);
                    myGLCD.drawRoundRect(x-4,y-4,x+34,y+34);
                    myGLCD.drawLine(x+6,y+13,x+15,y+4);
                    myGLCD.drawLine(x+16,y+5,x+24,y+13);}   
     
     myGLCD.drawLine(x+3,y+14,x+15,y+2); 
     myGLCD.drawLine(x+4,y+14,x+14,y+4);
     myGLCD.drawLine(x+16,y+3,x+27,y+14);
     myGLCD.drawLine(x+15,y+3,x+26,y+14);
     
     myGLCD.drawVLine(x+6,y+14,13);
     myGLCD.drawVLine(x+24,y+14,13);
     myGLCD.drawVLine(x+12,y+17,4);
     myGLCD.drawVLine(x+18,y+17,4);
     myGLCD.drawVLine(x+7,y+27,1);
     myGLCD.drawVLine(x+23,y+27,1);
     
     myGLCD.drawHLine(x+13,y+16,4);
     myGLCD.drawHLine(x+13,y+22,4);
     myGLCD.drawHLine(x+8,y+29,14);
         
     myGLCD.drawPixel(x+5, y+14);
     myGLCD.drawPixel(x+25, y+14);
     myGLCD.drawPixel(x+8, y+28);
     myGLCD.drawPixel(x+22, y+28);         
  }  
 
 int draw_environment ()   // Функция стандартными средствами библиотеки UTFT рисует рамки и
                           // всё статичное изображение.  
  {
    // выбираем большой шрифт
  myGLCD.setFont(BigFont);
  myGLCD.setColor(VGA_WHITE); 
  
  myGLCD.print("%", 199, 43, 0);
  myGLCD.print("%", 199, 200, 0);
  myGLCD.print("%", 199, 117, 0);
  myGLCD.print("C", 207, 20, 0);
  myGLCD.print("C", 207, 177, 0);
  myGLCD.print("C", 207, 93, 0);
  myGLCD.print(".", 86, 120, 0);
 
  myGLCD.setFont(SmallFont);
  myGLCD.print("o", 202, 16, 0);
  myGLCD.print("o", 202, 172, 0);
  myGLCD.print("o", 202, 90, 0);
  myGLCD.print("2", 150, 78, 0);   
  
  symbol_temperature (25, 22);  
  Write_15px ("VOZDUHA0", 50, 22);
  
  symbol_temperature (25, 177);
  Write_15px ("VOZDUHA0", 50, 177);  
  
  Write_15px ("VLAJNOSTb0", 25, 46);  
  
  Write_15px ("VLAJNOSTb0", 25, 202);  
  
  Write_15px("UROVENb0",25, 71);
  Write_15px("SO0",125, 71);  
  
  symbol_temperature (25, 95);
  Write_15px ("POLA0", 50, 95);
  
  Write_15px ("VLAJN0", 25, 119);
  Write_15px ("POLA0", 105, 119);
  
  draw_home_icon (270, 200, Home);      //Иконка "Дома"
    
    myGLCD.setColor(100,100,100);      //Рамка для тактов и актов в углу экрана.
    myGLCD.drawRoundRect(270,1,316,12);
  
  
  
  //------Счетчики датчиков----------------------------------------
       //-------Внутренний датчик--------------------------//
       counter (175,21,t1);//Температура в кабине (десятки)
       counter (188,21,t2); //Температура в кабине (еденицы)
  
       counter (175,45,w1); //Влажность в кабине (десятки)
       counter (188,45,w2); //Влажность в кабине (еденицы)
  
       //---------Забортные счетчики -----------------------//
       counter (175,176,T1); //Температура забортом (десятки)
       counter (188,176,T2); //Температура забортом (единицы)
  
       counter (175,201,W1); //Влажность забортом (десятки)
       counter (188,201,W2); //Влажность забортом (единицы)   
  
      //------Влажность и температура пола ---------------//
      counter (175,118,w_floor1); //Влажность пола (десятки)
      counter (188,118,w_floor2); //Влажность пола (еденицы)
 
      counter (175,94,t_floor1); //Температура пола (десятки) 
      counter (188,94,t_floor2); //Температура пола (единицы)
 //---------------------------------------------------------------     
      
  
 /////////----Верхняя рамка---------------
 
  myGLCD.setColor(255,100,0);
  //myGLCD.drawPixel(10, 10);
  
  myGLCD.drawLine(9,6,232,6);
  myGLCD.drawLine(11,5,230,5);//Верхняя горизонтальная
  myGLCD.drawLine(7,8,10,7);
    
  myGLCD.drawLine(5,11,5,145);
  myGLCD.drawLine(6,9,6,147);//Верхняя вертикальная (левая)
  myGLCD.drawLine(7,8,7,10);
  myGLCD.drawPixel(8, 8);
    
  myGLCD.drawLine(7,146,7,148);
  myGLCD.drawLine(8,149,10,149);
  myGLCD.drawLine(9,150,232,150);
  myGLCD.drawLine(11,151,230,151);
  myGLCD.drawPixel(8, 148);  

  myGLCD.drawLine(231,7,233,7);
  myGLCD.drawLine(231,7,233,7);
  myGLCD.drawLine(234,8,234,10);
  myGLCD.drawLine(235,9,235,147);  
  myGLCD.drawLine(236,11,236,145); 
  myGLCD.drawPixel(233, 8);
    
  myGLCD.drawLine(234,146,234,148); 
  myGLCD.drawLine(233,149,231,149); 
  myGLCD.drawPixel(233, 148); 
  
  //////////////////////////////////////////////////////////  
  
  myGLCD.setColor(255,100,0);
  myGLCD.drawLine(16,12,50,12); //горизон. верх.
  
  myGLCD.setColor(VGA_YELLOW);
  
  myGLCD.drawLine(15,13,48,13);
  myGLCD.setColor(255,100,0);
  myGLCD.drawLine(13,15,13,50);
  myGLCD.setColor(VGA_YELLOW);
  myGLCD.drawLine(14,14,14,48);
  myGLCD.drawPixel(15, 14); 
  ////////////////////////////////////////////////////////////
   
 //------Внутрений уголок (левый нижний) 
  myGLCD.setColor(VGA_YELLOW);
  myGLCD.drawLine(14,141,14,112);
  myGLCD.drawLine(15,142,48,142);
  myGLCD.drawPixel(15, 141);  
  
  myGLCD.setColor(255,100,0);
  myGLCD.drawLine(13,140,13,111);
  myGLCD.drawLine(16,143,50,143);
  //////////////////////////////////////////////////////
  
   //--------- Внутренний уголок (правый нижний)
  myGLCD.setColor(255,100,0);
  myGLCD.drawHLine (224,143,-30);
  myGLCD.drawVLine (227,140,-30);
  
  
  myGLCD.setColor(VGA_YELLOW);
  
  myGLCD.drawHLine (225,142,-30);
  myGLCD.drawVLine (226,141,-30);
  myGLCD.drawPixel(225, 141);
  
  /////////////////////////////////////////////////////
  
  
  
  //------Внутренний уголок (правый верхний)
    
  myGLCD.setColor(VGA_YELLOW);
  myGLCD.drawHLine (225,13,-30);
  myGLCD.drawVLine (226,14,28);
  myGLCD.drawPixel(225, 14);
  
  myGLCD.setColor(255,100,0);
  
  myGLCD.drawVLine (227,15,30);
  myGLCD.drawHLine (224,12,-30);
  
  //////////////////////////////////////////////////////// 
  
  //myGLCD.setColor(VGA_TEAL); //бирюзовый
  
  //myGLCD.setColor(VGA_OLIVE); //светло-коричневый, ближе к зеленому
  
  //myGLCD.setColor(VGA_MAROON);  //бордовый 
  
  //myGLCD.setColor(VGA_FUCHSIA);   //pink  !!!
  
  //myGLCD.setColor(VGA_PURPLE);      // тусклый pink
 
  //myGLCD.setColor(VGA_LIME);       // Светло-зеленый!!!
  
  // myGLCD.setColor(VGA_AQUA);       // голубой !!!
  
  //myGLCD.setColor(255,100,0);      //оранжевый
  
  //myGLCD.setColor(VGA_BLUE);  // яркий синий !!! 
 
 /////----Нижняя внутреняя рамка-------/////////// 
   
   myGLCD.setColor(70,10,163);
   myGLCD.drawLine(14,166,224,166);
   
   myGLCD.drawLine(13,167,225,167);
   myGLCD.drawPixel(225, 168);
   
   myGLCD.drawLine(226,168,226,224);
   myGLCD.drawLine(227,169,227,223);
   myGLCD.drawPixel(225, 224);
   
   myGLCD.drawLine(224,226,14,226);
   myGLCD.drawLine(225,225,13,225);
   
   myGLCD.drawLine(11,223,11,169);
   myGLCD.drawLine(12,224,12,168);
   myGLCD.drawPixel(13, 224);
   myGLCD.drawPixel(13, 168);
 
 ////////////////////////////////////////////////////////
 //----Внутрении рамки, темные пропуски---
  myGLCD.setColor(0,0,0);
  //---Верхний-------
  myGLCD.drawHLine (80,166,70);
  myGLCD.drawHLine (77,167,74);
  
  myGLCD.drawHLine (80,225,74);
  myGLCD.drawHLine (77,226,70);
  
  myGLCD.drawVLine (11,190,10);
  myGLCD.drawVLine (12,189,12);
  
  myGLCD.drawVLine (227,190,10);
  myGLCD.drawVLine (226,189,12);
  
  //////---- Нижняя рамка,уголки (левый верхний)
  
  myGLCD.setColor(VGA_GRAY);
  
  myGLCD.drawHLine (11,160,25);
  myGLCD.drawHLine (9,161,25); 
  myGLCD.drawHLine (8,162,2);
  
  myGLCD.drawVLine (5,166,15);
  myGLCD.drawVLine (6,164,15);
  myGLCD.drawVLine (7,163,2);
  myGLCD.drawPixel(8, 163);  
  
 /////////---- Нижняя рамка,уголки (левый нижний)  
    
  myGLCD.drawHLine (11,234,25);
  myGLCD.drawHLine (9,233,25); 
  myGLCD.drawHLine (8,232,2);
  
  myGLCD.drawVLine (5,228,-15);
  myGLCD.drawVLine (6,230,-15);
  myGLCD.drawVLine (7,231,-2);
  myGLCD.drawPixel(8, 231);
  
 //////////////---- Нижняя рамка,уголки (правый верхний) 
 
  myGLCD.drawHLine (227,160,-25); 
  myGLCD.drawHLine (229,161,-25);
  myGLCD.drawHLine (230,162,-2);  
  
  myGLCD.drawVLine (233,166,15);
  myGLCD.drawVLine (232,164,15);
  myGLCD.drawVLine (231,163,2);
  myGLCD.drawPixel(230, 163);
  
 ////////////////////////////////
 
  myGLCD.drawHLine (226,233,-25); 
  myGLCD.drawHLine (228,232,-25);
  myGLCD.drawHLine (229,231,-2);  
  
  myGLCD.drawVLine (232,227,-15);
  myGLCD.drawVLine (231,229,-15);
  myGLCD.drawVLine (230,230,-2);
  myGLCD.drawPixel(229, 230);
   
  }  
  
int draw_cooler_off_icon (int x, int y)
{
   if (cooler_z != cooler || heater_z != heater || act==3 ){
  myGLCD.setColor(0,0,0);  
  myGLCD.fillRect (x-10,y-10,x+40,y-5);  
  myGLCD.fillRect (x+40,y-5,x+35,y+40);
  myGLCD.fillRect (x-10,y+40,x+35,y+35);
  myGLCD.fillRect (x-10,y-10,x-5,y+35);
  
  
  
  myGLCD.drawRoundRect(x-4,y-4,x+34,y+34);
  myGLCD.fillCircle(x+15,y+15,16);
  
  myGLCD.setColor(50,50,50);
  myGLCD.drawRoundRect(x-4,y-4,x+34,y+34);
  myGLCD.drawCircle(x+15,y+15,16);   
  myGLCD.drawCircle(x+15,y+15,4); 
  
  myGLCD.fillRect (x+1,y+17,x+8,y+13);
  myGLCD.fillRect (x+13,y+8,x+17,y+1);
  myGLCD.fillRect (x+22,y+17,x+29,y+13);  
  myGLCD.fillRect (x+13,y+29,x+17,y+22);  
 
  myGLCD.drawHLine (x+1,y+12,5);
  myGLCD.drawHLine (x+2,y+11,2);
  myGLCD.drawHLine (x+1,y+18,5);
  myGLCD.drawHLine (x+2,y+19,2);
  myGLCD.drawVLine (x+9,y+14,2);
  
  myGLCD.drawVLine (x+12,y+6,-5);
  myGLCD.drawVLine (x+18,y+6,-5);
  myGLCD.drawVLine (x+11,y+4,-2);
  myGLCD.drawVLine (x+19,y+4,-2);
  myGLCD.drawHLine (x+14,y+9, 2);
  
  myGLCD.drawHLine (x+24,y+12,5);
  myGLCD.drawHLine (x+26,y+11,2);
  myGLCD.drawHLine (x+24,y+18,5);
  myGLCD.drawHLine (x+26,y+19,2);
  myGLCD.drawVLine (x+21,y+14,2);
  
  myGLCD.drawVLine (x+12,y+29,-5);
  myGLCD.drawVLine (x+18,y+29,-5);
  myGLCD.drawVLine (x+11,y+28,-2);
  myGLCD.drawVLine (x+19,y+28,-2);
  myGLCD.drawHLine (x+14,y+21, 2);}
}

int draw_cooler_on_icon (byte a, byte b, byte c, int x, int y, byte id) //Функция, по линиям рисует вентилятор.
                                                            //a,b,c - RGB цвет; x,y - координаты левого верхнего угла (-4px) id - уникальный номер иконки.
{  
    //if (cooler_button != cooler_button_z){myGLCD.setColor(0,0,0);
  //                                      myGLCD.fillRect (x-8,y-8,x+38,y-5);
  //                                      myGLCD.fillRect (x+38,y-5,x+35,y+38);
  //                                      myGLCD.fillRect (x+35,y+38,x-8,y+35);
  //                                      myGLCD.fillRect (x+-8,y+35,x-5,y-5);}
  
  if (heater==1 && id==2) {myGLCD.setColor(VGA_RED);
  myGLCD.drawRoundRect(x-4,y-4,x+34,y+34);};
  
  if (cooler==1 && id==1) {myGLCD.setColor(VGA_BLUE);
  myGLCD.drawRoundRect(x-4,y-4,x+34,y+34);};
  
                                        
  switch ( tact ) {
    case 6:   
  
  {     
  myGLCD.setColor(a,b,c);
  //myGLCD.drawRoundRect(x-4,y-4,x+34,y+34);
  myGLCD.drawCircle(x+15,y+15,16); 
    
  myGLCD.setColor(0,0,0);
  myGLCD.fillCircle(x+15,y+15,15);
  
  myGLCD.setColor(a,b,c);
  myGLCD.drawCircle(x+15,y+15,4);  
  
  
  myGLCD.fillRect (x+1,y+17,x+8,y+13);
  myGLCD.fillRect (x+13,y+8,x+17,y+1);
  myGLCD.fillRect (x+22,y+17,x+29,y+13);  
  myGLCD.fillRect (x+13,y+29,x+17,y+22);  
 
  myGLCD.drawHLine (x+1,y+12,5);
  myGLCD.drawHLine (x+2,y+11,2);
  myGLCD.drawHLine (x+1,y+18,5);
  myGLCD.drawHLine (x+2,y+19,2);
  myGLCD.drawVLine (x+9,y+14,2);
  
  myGLCD.drawVLine (x+12,y+6,-5);
  myGLCD.drawVLine (x+18,y+6,-5);
  myGLCD.drawVLine (x+11,y+4,-2);
  myGLCD.drawVLine (x+19,y+4,-2);
  myGLCD.drawHLine (x+14,y+9, 2);
  
  myGLCD.drawHLine (x+24,y+12,5);
  myGLCD.drawHLine (x+26,y+11,2);
  myGLCD.drawHLine (x+24,y+18,5);
  myGLCD.drawHLine (x+26,y+19,2);
  myGLCD.drawVLine (x+21,y+14,2);
  
  myGLCD.drawVLine (x+12,y+29,-5);
  myGLCD.drawVLine (x+18,y+29,-5);
  myGLCD.drawVLine (x+11,y+28,-2);
  myGLCD.drawVLine (x+19,y+28,-2);
  myGLCD.drawHLine (x+14,y+21, 2);
}
  
  break;

  case 7: 
  {myGLCD.setColor(a,b,c);
  //myGLCD.drawRoundRect(x-4,y-4,x+34,y+34);
  myGLCD.drawCircle(x+15,y+15,16); 
    
  myGLCD.setColor(0,0,0);
  myGLCD.fillCircle(x+15,y+15,15);
  
  myGLCD.setColor(a,b,c);     
  myGLCD.fillRect (x+4,y+11,x+8,y+6);
  myGLCD.fillRect (x+20,y+5,x+25,y+9);
  myGLCD.fillRect (x+22,y+24,x+26,y+19);
  myGLCD.fillRect (x+6,y+22,x+11,y+26);
  
  myGLCD.drawCircle(x+15,y+15,4);  
  
  myGLCD.drawHLine (x+6,y+12,4);
  myGLCD.drawHLine (x+5,y+5,2);
  myGLCD.drawVLine (x+3,y+11,-4);
  myGLCD.drawVLine (x+2,y+10,-1);
  myGLCD.drawVLine (x+9,y+13,-4);
  myGLCD.drawPixel (x+8, y+13); 
  myGLCD.drawPixel (x+10, y+11);  
  
  myGLCD.drawVLine (x+19,y+11,-4);
  myGLCD.drawVLine (x+26,y+8,-2);
  myGLCD.drawHLine (x+18,y+10,4);
  myGLCD.drawHLine (x+20,y+4,4);
  myGLCD.drawHLine (x+21,y+3,1);  
  myGLCD.drawPixel (x+18, y+9); 
  myGLCD.drawPixel (x+20, y+11);  
  
  myGLCD.drawHLine (x+20,y+18,4);
  myGLCD.drawHLine (x+23,y+25,2);
  myGLCD.drawVLine (x+21,y+21,-4);
  myGLCD.drawVLine (x+27,y+23,-4);
  myGLCD.drawVLine (x+28,y+21,-1); 
  myGLCD.drawPixel (x+20, y+19); 
  myGLCD.drawPixel (x+22, y+17);
  
  myGLCD.drawHLine (x+9,y+28,1);
  myGLCD.drawHLine (x+9,y+21,4);
  myGLCD.drawHLine (x+7,y+27,4);
  myGLCD.drawVLine (x+12,y+24,-4);
  myGLCD.drawVLine (x+5,y+25,-2);
  myGLCD.drawPixel (x+11, y+20);
  myGLCD.drawPixel (x+13, y+22);
  } 
  break;
  
  
  case 8:
  {myGLCD.setColor(a,b,c);
  //myGLCD.drawRoundRect(x-4,y-4,x+34,y+34);
  myGLCD.drawCircle(x+15,y+15,16);  
   
  myGLCD.setColor(0,0,0);
  myGLCD.fillCircle(x+15,y+15,15);
  
  myGLCD.setColor(a,b,c);   
  
  myGLCD.fillRect (x+7,y+8,x+12,y+4);
  myGLCD.fillRect (x+23,y+8,x+27,y+13);
  myGLCD.fillRect (x+19,y+26,x+24,y+22);
  myGLCD.fillRect (x+4,y+19,x+8,y+24);  
  
  myGLCD.drawCircle(x+15,y+15,4);  
  
  myGLCD.drawVLine (x+6,y+7,-2);
  myGLCD.drawVLine (x+13,y+10,-4);
  myGLCD.drawHLine (x+9,y+2,2);
  myGLCD.drawHLine (x+8,y+3,4);
  myGLCD.drawHLine (x+10,y+9,4);
  myGLCD.drawPixel (x+12, y+10); 
  myGLCD.drawPixel (x+14, y+8);
  
  myGLCD.drawVLine (x+22,y+15,-4);
  myGLCD.drawVLine (x+28,y+13,-4);
  myGLCD.drawHLine (x+21,y+14,4);
  myGLCD.drawHLine (x+24,y+7,2);
  myGLCD.drawPixel (x+21, y+13); 
  myGLCD.drawPixel (x+23, y+15);
  
  myGLCD.drawVLine (x+18,y+24,-4);
  myGLCD.drawVLine (x+25,y+25,-2);
  myGLCD.drawHLine (x+17,y+21,4);
  myGLCD.drawHLine (x+19,y+27,4);
  myGLCD.drawHLine (x+20,y+28,2); 
  myGLCD.drawPixel (x+17, y+22); 
  myGLCD.drawPixel (x+19, y+20);
  
  myGLCD.drawVLine (x+2,y+21,-1);
  myGLCD.drawVLine (x+3,y+23,-4);
  myGLCD.drawVLine (x+9,y+21,-4);
  myGLCD.drawHLine (x+6,y+18,4);
  myGLCD.drawHLine (x+5,y+25,2);
  myGLCD.drawPixel (x+8, y+17); 
  myGLCD.drawPixel (x+10, y+19);
  }
  break;
  }
    
  
}  
void Write_15px (char latters[40], int x1, int y1) //Функция для рисования заглавных русских букв.
//   Функция принимает заглавные латинские буквы, без пробелов и прочих знаков,
//   Оканчивается слово добавлением символа "ноль". 
// A - A;   J - Ж;   N - Н;   F - Ф;  y - Ы;    
// B - Б;   Z - З;   О - О;   H - Х;  b - Ь; 
// V - В;   I - И;   P - П;   Q - Ц;  e - Э; 
// G - Г;   i - Й;   R - Р;   с - Ч;  u - Ю;
// D - Д;   K - K;   S - С;   w - Ш;  Y - Я.        
// E - E;   L - Л;   Т - Т;   W - Щ;        
// ~ - Ё;   M - M;   U - У;   j - Ъ;     

{ 
  byte p=-13;  // Межбуквенный интервал (Начинаем с -13,так как первый же цикл прибавит 13px)
  byte a;      // Переменная для подсчета количества переданных в функцию символов. 
  byte z=0;    
  
{for (a=0;latters[a]!='0';a++);} //Подсчитываем символы в массиве, перебирая значения, пока не доходим до стоп-символа '0'
     
    for (z=0; z<a; z++) //Основной блок и счетик. Переберает буквы в массиве аргументе функции. 
  {
       if (latters[z] == 'A')         
    {p=p+13;                                     // Переменная для сдвига следующего символа вправо по оси Х. 
                                                 // В некоторых буквах подстроена вручную.
     myGLCD.fillRect (x1+4+p,y1+10,x1+7+p,y1+11);
     myGLCD.fillRect (x1+5+p,y1+1,x1+6+p,y1+5);      
     myGLCD.drawVLine (x1+p,y1+13,1); 
     myGLCD.drawVLine (x1+1+p,y1+11,3);  
     myGLCD.drawVLine (x1+2+p,y1+8,6);
     myGLCD.drawVLine (x1+3+p,y1+5,6);
     myGLCD.drawVLine (x1+4+p,y1+3,4);      
     myGLCD.drawVLine (x1+7+p,y1+3,4);
     myGLCD.drawVLine (x1+8+p,y1+5,6);
     myGLCD.drawVLine (x1+9+p,y1+8,6);
     myGLCD.drawVLine (x1+10+p,y1+11,3);
     myGLCD.drawVLine (x1+11+p,y1+13,1);        
     }
       
    if (latters[z] == 'B')         
     { 
      p=p+13;
      myGLCD.fillRect (x1+2+p,y1+2,x1+3+p,y1+14);
      myGLCD.fillRect (x1+10+p,y1+11,x1+11+p,y1+10);
      myGLCD.drawHLine(x1+3+p,y1+1,6);
      myGLCD.drawHLine(x1+4+p,y1+2,6);
      myGLCD.drawHLine(x1+4+p,y1+7,5);
      myGLCD.drawHLine(x1+4+p,y1+8,6);
      myGLCD.drawHLine(x1+9+p,y1+9,2);
      myGLCD.drawHLine(x1+9+p,y1+12,2);
      myGLCD.drawHLine(x1+4+p,y1+13,6);
      myGLCD.drawHLine(x1+4+p,y1+14,4);      
      }
    
     if (latters[z] == 'V')         
      { 
      p=p+13;
      myGLCD.fillRect (x1+1+p,y1+2,x1+2+p,y1+14);
      myGLCD.fillRect (x1+9+p,y1+3,x1+10+p,y1+5);
      myGLCD.fillRect (x1+8+p,y1+9,x1+9+p,y1+8);
      myGLCD.fillRect (x1+9+p,y1+12,x1+8+p,y1+13);
      myGLCD.fillRect (x1+3+p,y1+14,x1+7+p,y1+13);
      myGLCD.fillRect (x1+3+p,y1+8,x1+7+p,y1+7);
      myGLCD.drawHLine(x1+2+p,y1+1,5);
      myGLCD.drawHLine(x1+3+p,y1+2,6);
      myGLCD.drawHLine(x1+8+p,y1+6,1);
      myGLCD.drawVLine(x1+9+p,y1+10,1);
      myGLCD.drawVLine(x1+10+p,y1+9,3);
      myGLCD.drawPixel (x1+8+p, y1+3);
      }
    
     if (latters[z] == 'G')         
      { 
      p=p+12;
      myGLCD.fillRect  (x1+2+p,y1+2,x1+3+p,y1+14);
      myGLCD.drawHLine (x1+3+p,y1+1,6);
      myGLCD.drawHLine (x1+4+p,y1+2,6);
      }
    
     if (latters[z] == 'D')         
      { 
      p=p+13;
      myGLCD.fillRect (x1+2+p,y1+13,x1+8+p,y1+12);
      myGLCD.fillRect (x1+3+p,y1+10,x1+2+p,y1+11);
      myGLCD.fillRect (x1+3+p,y1+9,x1+4+p,y1+7);
      myGLCD.fillRect (x1+4+p,y1+6,x1+5+p,y1+4);
      myGLCD.fillRect (x1+5+p,y1+3,x1+6+p,y1+1);
      myGLCD.fillRect (x1+7+p,y1+2,x1+10+p,y1+1);
      myGLCD.fillRect (x1+9+p,y1+3,x1+10+p,y1+13); 
      myGLCD.drawVLine (x1+p,y1+12,3);
      myGLCD.drawVLine (x1+1+p,y1+12,2);
      myGLCD.drawVLine (x1+11+p,y1+12,3);        
      }
    
     if (latters[z] == 'E')         
      { 
      p=p+12;
      myGLCD.fillRect (x1+2+p,y1+2,x1+3+p,y1+13);
      myGLCD.drawHLine(x1+3+p,y1+1,5);
      myGLCD.drawHLine(x1+4+p,y1+2,5);
      myGLCD.drawHLine(x1+4+p,y1+7,4);
      myGLCD.drawHLine(x1+4+p,y1+8,3);
      myGLCD.drawHLine(x1+4+p,y1+13,7);
      myGLCD.drawHLine(x1+3+p,y1+14,7);
      }
    
     if (latters[z] == '~')         
      { 
      p=p+12;
      myGLCD.fillRect (x1+2+p,y1+2,x1+3+p,y1+13);
      myGLCD.drawHLine(x1+3+p,y1+1,5);
      myGLCD.drawHLine(x1+4+p,y1+2,5);
      myGLCD.drawHLine(x1+4+p,y1+7,4);
      myGLCD.drawHLine(x1+4+p,y1+8,3);
      myGLCD.drawHLine(x1+4+p,y1+13,7);
      myGLCD.drawHLine(x1+3+p,y1+14,7);
      myGLCD.drawPixel (x1+4+p, y1-1);
      myGLCD.drawPixel (x1+7+p, y1-1);  
      }    
    
     if (latters[z] == 'J')         
      { 
      p=p+13;     
      myGLCD.fillRect (x1+6+p,y1+1,x1+7+p,y1+14);    
      myGLCD.drawLine (x1+2+p,y1+1,x1+5+p,y1+4); 
      myGLCD.drawLine (x1+2+p,y1+2,x1+5+p,y1+5);
      myGLCD.drawLine (x1+8+p,y1+4,x1+11+p,y1+1); 
      myGLCD.drawLine (x1+8+p,y1+5,x1+11+p,y1+2);      
      myGLCD.drawVLine (x1+1+p,y1+12,2);
      myGLCD.drawVLine (x1+2+p,y1+11,2);
      myGLCD.drawVLine (x1+3+p,y1+10,2);
      myGLCD.drawVLine (x1+4+p,y1+9,2);
      myGLCD.drawVLine (x1+5+p,y1+8,1);
      myGLCD.drawVLine (x1+8+p,y1+8,1);
      myGLCD.drawVLine (x1+9+p,y1+9,2);
      myGLCD.drawVLine (x1+10+p,y1+10,2);
      myGLCD.drawVLine (x1+11+p,y1+11,2);
      myGLCD.drawVLine (x1+12+p,y1+12,2);        
      }
    
     if (latters[z] == 'Z')         
      { 
      p=p+14;
      myGLCD.fillRect (x1+6+p,y1+7,x1+7+p,y1+8);
      myGLCD.drawHLine (x1+1+p,y1+4,1);
      myGLCD.drawHLine (x1+1+p,y1+3,2);
      myGLCD.drawHLine (x1+2+p,y1+2,7);
      myGLCD.drawHLine (x1+4+p,y1+1,4);
      myGLCD.drawHLine (x1+7+p,y1+3,1);
      myGLCD.drawHLine (x1+7+p,y1+12,1);
      myGLCD.drawHLine (x1+4+p,y1+14,4);
      myGLCD.drawHLine (x1+2+p,y1+13,6);
      myGLCD.drawHLine (x1+1+p,y1+12,2);
      myGLCD.drawHLine (x1+1+p,y1+11,1);
      myGLCD.drawVLine (x1+9+p,y1+3,10);
      myGLCD.drawVLine (x1+10+p,y1+3,2);
      myGLCD.drawVLine (x1+8+p,y1+6,3);
      myGLCD.drawVLine (x1+10+p,y1+10,2);
      }
    
     if (latters[z] == 'I')         
      { 
      p=p+13;
      myGLCD.fillRect (x1+1+p,y1+1,x1+2+p,y1+14);
      myGLCD.fillRect (x1+9+p,y1+1,x1+10+p,y1+14);
      myGLCD.drawLine (x1+3+p,y1+9,x1+8+p,y1+4);
      myGLCD.drawLine (x1+3+p,y1+10,x1+8+p,y1+5); 
      }
    
     if (latters[z] == 'i')         
      { 
      p=p+13;
      myGLCD.fillRect (x1+1+p,y1+1,x1+2+p,y1+14);
      myGLCD.fillRect (x1+9+p,y1+1,x1+10+p,y1+14);
      myGLCD.drawLine (x1+3+p,y1+9,x1+8+p,y1+4);
      myGLCD.drawLine (x1+3+p,y1+10,x1+8+p,y1+5);
      myGLCD.drawHLine (x1+5+p,y1+1,1);
      myGLCD.drawPixel (x1+4+p,y1);
      myGLCD.drawPixel (x1+7+p,y1); 
      }
    
     if (latters[z] == 'K')         
      { 
      p=p+13;        
      myGLCD.fillRect (x1+1+p,y1+2,x1+2+p,y1+14);
      myGLCD.drawVLine(x1+7+p,y1+6,3);
      myGLCD.drawVLine(x1+8+p,y1+8,3);
      myGLCD.drawVLine(x1+9+p,y1+10,4);
      myGLCD.drawVLine(x1+10+p,y1+13,1);
      myGLCD.drawLine(x1+3+p,y1+8,x1+10+p,y1+1);
      myGLCD.drawLine(x1+3+p,y1+9,x1+10+p,y1+2);
      myGLCD.drawPixel (x1+6+p, y1+7);            
      }
    
     if (latters[z] == 'L')         
      { 
      p=p+14;
      myGLCD.fillRect (x1+2+p,y1+5,x1+3+p,y1+13);
      myGLCD.fillRect (x1+9+p,y1+2,x1+10+p,y1+14);
      myGLCD.drawHLine(x1+0+p,y1+14,2);
      myGLCD.drawHLine(x1+3+p,y1+4,1);
      myGLCD.drawHLine(x1+4+p,y1+3,1);
      myGLCD.drawHLine(x1+4+p,y1+2,4);
      myGLCD.drawHLine(x1+6+p,y1+1,3);
      myGLCD.drawPixel (x1+1+p, y1+13);     
      }
    
     if (latters[z] == 'M')         
      { 
      p=p+14;     
      myGLCD.fillRect (x1+5+p,y1+5,x1+6+p,y1+6);
      myGLCD.drawVLine(x1+0+p,y1+2,12);
      myGLCD.drawVLine(x1+1+p,y1+1,13);
      myGLCD.drawVLine(x1+2+p,y1+2,2);
      myGLCD.drawVLine(x1+3+p,y1+3,1);
      myGLCD.drawVLine(x1+4+p,y1+4,1);
      myGLCD.drawVLine(x1+7+p,y1+4,1);
      myGLCD.drawVLine(x1+8+p,y1+3,1);
      myGLCD.drawVLine(x1+9+p,y1+2,2);
      myGLCD.drawVLine(x1+10+p,y1+1,13);
      myGLCD.drawVLine(x1+11+p,y1+2,12);      
      }
    
     if (latters[z] == 'N')         
      { 
      p=p+13;      
      myGLCD.fillRect (x1+2+p,y1+1,x1+3+p,y1+14);
      myGLCD.fillRect (x1+4+p,y1+7,x1+8+p,y1+8);
      myGLCD.fillRect (x1+9+p,y1+1,x1+10+p,y1+14);
      }
    
     if (latters[z] == 'O')         
      { 
      p=p+10;
      myGLCD.fillRect (x1+3+p,y1+3,x1+4+p,y1+12);
      myGLCD.fillRect (x1+10+p,y1+3,x1+11+p,y1+12);
      myGLCD.drawHLine(x1+5+p,y1+1,4);
      myGLCD.drawHLine(x1+4+p,y1+2,6);
      myGLCD.drawHLine(x1+4+p,y1+13,6);
      myGLCD.drawHLine(x1+5+p,y1+14,4);
      myGLCD.drawPixel(x1+5+p, y1+3);
      myGLCD.drawPixel(x1+9+p, y1+3);
      myGLCD.drawPixel(x1+5+p, y1+12);
      myGLCD.drawPixel(x1+9+p, y1+12);
      }
    
    if (latters[z] == 'P')         
     { 
      p=p+15;
      myGLCD.fillRect (x1+p,y1+1,x1+1+p,y1+14);
      myGLCD.fillRect (x1+2+p,y1+1,x1+7+p,y1+2);
      myGLCD.fillRect (x1+8+p,y1+1,x1+9+p,y1+14);
     }
    
    if (latters[z] == 'R')         
     { 
     p=p+13;
     myGLCD.fillRect (x1+9+p,y1+4,x1+10+p,y1+5);
     myGLCD.drawVLine(x1+1+p,y1+2,12);
     myGLCD.drawVLine(x1+2+p,y1+1,13);
     myGLCD.drawHLine(x1+3+p,y1+1,5);
     myGLCD.drawHLine(x1+3+p,y1+2,6);
     myGLCD.drawHLine(x1+8+p,y1+3,2);
     myGLCD.drawHLine(x1+8+p,y1+6,2);
     myGLCD.drawHLine(x1+3+p,y1+7,7);
     myGLCD.drawHLine(x1+3+p,y1+8,6);      
     }
    
    if (latters[z] == 'S')         
     { 
     p=p+13;     
     myGLCD.fillRect (x1+5+p,y1+1,x1+8+p,y1+2);
     myGLCD.fillRect (x1+5+p,y1+13,x1+8+p,y1+14);
     myGLCD.fillRect (x1+9+p,y1+2,x1+10+p,y1+3);
     myGLCD.fillRect (x1+9+p,y1+12,x1+10+p,y1+13);
     myGLCD.drawVLine(x1+2+p,y1+3,9);
     myGLCD.drawVLine(x1+3+p,y1+2,11);
     myGLCD.drawVLine(x1+4+p,y1+1,2);
     myGLCD.drawVLine(x1+4+p,y1+12,2);
     myGLCD.drawPixel(x1+10+p,y1+4);
     myGLCD.drawPixel(x1+10+p,y1+11);      
     }
    
    if (latters[z] == 'T')         
     {  
     p=p+13;     
     myGLCD.fillRect (x1+5+p,y1+3,x1+6+p,y1+14);
     myGLCD.drawHLine(x1+p,y1+1,11);
     myGLCD.drawHLine(x1+1+p,y1+2,9);       
     }
    
    if (latters[z] == 'U')         
     { 
     p=p+13;     
     myGLCD.fillRect (x1+3+p,y1+13,x1+5+p,y1+14);
     myGLCD.drawVLine(x1+2+p,y1+1,3);
     myGLCD.drawVLine(x1+3+p,y1+1,4);
     myGLCD.drawVLine(x1+4+p,y1+4,2);
     myGLCD.drawVLine(x1+5+p,y1+5,2);
     myGLCD.drawVLine(x1+6+p,y1+7,1);
     myGLCD.drawVLine(x1+7+p,y1+7,6);
     myGLCD.drawVLine(x1+6+p,y1+11,3);
     myGLCD.drawVLine(x1+8+p,y1+5,6);
     myGLCD.drawVLine(x1+9+p,y1+3,5);
     myGLCD.drawVLine(x1+10+p,y1+1,4);
     myGLCD.drawVLine(x1+11+p,y1+1,1);  
     }
    
    if (latters[z] == 'F')         
     { 
     p=p+13;     
     myGLCD.drawVLine(x1+1+p,y1+6,3);
     myGLCD.drawVLine(x1+2+p,y1+4,7);
     myGLCD.drawVLine(x1+6+p,y1+1,13);
     myGLCD.drawVLine(x1+7+p,y1+1,13);
     myGLCD.drawVLine(x1+11+p,y1+5,6);
     myGLCD.drawVLine(x1+12+p,y1+6,3);
     myGLCD.drawHLine(x1+3+p,y1+4,8);
     myGLCD.drawHLine(x1+4+p,y1+3,5);  
     }
    
    if (latters[z] == 'H')         
     { 
     p=p+13;     
     myGLCD.drawVLine(x1+2+p,y1+1,1);
     myGLCD.drawVLine(x1+3+p,y1+1,3);
     myGLCD.drawVLine(x1+4+p,y1+3,3);
     myGLCD.drawVLine(x1+5+p,y1+5,5);
     myGLCD.drawVLine(x1+4+p,y1+9,3);
     myGLCD.drawVLine(x1+3+p,y1+11,3);
     myGLCD.drawVLine(x1+2+p,y1+13,1);
     myGLCD.drawVLine(x1+6+p,y1+6,3);
     myGLCD.drawVLine(x1+7+p,y1+5,5);
     myGLCD.drawVLine(x1+8+p,y1+3,3);
     myGLCD.drawVLine(x1+9+p,y1+1,3);
     myGLCD.drawVLine(x1+10+p,y1+1,1);
     myGLCD.drawVLine(x1+8+p,y1+9,3);
     myGLCD.drawVLine(x1+9+p,y1+11,3);
     myGLCD.drawVLine(x1+10+p,y1+13,1);  
     }
    
    if (latters[z] == 'Q')         
     { 
     p=p+13;
     myGLCD.fillRect (x1+3+p,y1+1,x1+2+p,y1+11);
     myGLCD.fillRect (x1+9+p,y1+11,x1+10+p,y1+1);
     myGLCD.fillRect (x1+11+p,y1+15,x1+12+p,y1+14);
     myGLCD.drawHLine (x1+2+p,y1+12,9);
     myGLCD.drawHLine (x1+3+p,y1+13,9);
     }
    
    if (latters[z] == 'c')         
    { 
     p=p+13;     
     myGLCD.fillRect (x1+3+p,y1+6,x1+7+p,y1+7);
     myGLCD.fillRect (x1+8+p,y1+1,x1+9+p,y1+14);
     myGLCD.drawVLine (x1+1+p,y1+1,4);
     myGLCD.drawVLine (x1+2+p,y1+1,5);
    }
    
    if (latters[z] == 'w')         
     { 
     p=p+14;     
     myGLCD.fillRect (x1+p,y1+1,x1+1+p,y1+13); 
     myGLCD.fillRect (x1+5+p,y1+1,x1+6+p,y1+12);
     myGLCD.fillRect (x1+10+p,y1+1,x1+11+p,y1+13);
     myGLCD.fillRect (x1+1+p,y1+13,x1+10+p,y1+14);
     }
    
    if (latters[z] == 'W')         
     { 
     p=p+15;
     myGLCD.fillRect (x1+p,y1+1,x1+1+p,y1+12);
     myGLCD.fillRect (x1+5+p,y1+1,x1+6+p,y1+11);
     myGLCD.fillRect (x1+10+p,y1+1,x1+11+p,y1+11);
     myGLCD.fillRect (x1+1+p,y1+12,x1+12+p,y1+13);
     myGLCD.fillRect (x1+11+p,y1+14,x1+12+p,y1+15); 
     }
    
    if (latters[z] == 'j')         
     { 
     p=p+14;
     myGLCD.fillRect (x1+3+p,y1+1,x1+4+p,y1+13);
     myGLCD.fillRect (x1+5+p,y1+6,x1+9+p,y1+7);
     myGLCD.fillRect (x1+4+p,y1+13,x1+9+p,y1+14);
     myGLCD.fillRect (x1+1+p,y1+1,x1+2+p,y1+2);
     myGLCD.drawVLine (x1+10+p,y1+7,6);
     myGLCD.drawVLine (x1+11+p,y1+8,4);
     myGLCD.drawPixel(x1+9+p, y1+8);
     myGLCD.drawPixel(x1+9+p, y1+12);
     }
    
    if (latters[z] == 'y')         
     { 
     p=p+17;
     myGLCD.fillRect (x1-1+p,y1+1,x1+p,y1+13);
     myGLCD.fillRect (x1+10+p,y1+1,x1+11+p,y1+14);
     myGLCD.fillRect (x1+p,y1+13,x1+4+p,y1+14);
     myGLCD.fillRect (x1+1+p,y1+6,x1+4+p,y1+7);
     myGLCD.drawVLine (x1+5+p,y1+7,6);
     myGLCD.drawVLine (x1+6+p,y1+8,4);
     myGLCD.drawPixel(x1+4+p, y1+8);
     myGLCD.drawPixel(x1+4+p, y1+12);
     }
    
    if (latters[z] == 'b')         
     {
     p=p+13; 
     myGLCD.fillRect (x1+2+p,y1+1,x1+3+p,y1+13);
     myGLCD.fillRect (x1+4+p,y1+6,x1+8+p,y1+7);
     myGLCD.fillRect (x1+3+p,y1+13,x1+8+p,y1+14);
     myGLCD.drawVLine (x1+9+p,y1+7,6);
     myGLCD.drawVLine (x1+10+p,y1+8,4);
     myGLCD.drawPixel(x1+8+p, y1+8);
     myGLCD.drawPixel(x1+8+p, y1+12);  
     }
    
    if (latters[z] == 'e')         
     { 
     p=p+13;
     myGLCD.fillRect (x1+2+p,y1+4,x1+3+p,y1+3);
     myGLCD.fillRect (x1+3+p,y1+2,x1+5+p,y1+3);
     myGLCD.fillRect (x1+5+p,y1+1,x1+8+p,y1+2);
     myGLCD.fillRect (x1+8+p,y1+2,x1+10+p,y1+3);
     myGLCD.fillRect (x1+6+p,y1+7,x1+9+p,y1+8);
     myGLCD.fillRect (x1+9+p,y1+11,x1+10+p,y1+13);
     myGLCD.fillRect (x1+5+p,y1+13,x1+8+p,y1+14);
     myGLCD.fillRect (x1+3+p,y1+12,x1+5+p,y1+13);
     myGLCD.fillRect (x1+2+p,y1+11,x1+3+p,y1+12);
     myGLCD.drawVLine (x1+10+p,y1+5,5);
     myGLCD.drawVLine (x1+11+p,y1+4,7);
     myGLCD.drawHLine (x1+9+p,y1+4,1);
     myGLCD.drawPixel (x1+8+p, y1+12);      
     }
    
    if (latters[z] == 'u')         
     { 
     p=p+15;
     myGLCD.fillRect (x1+1+p,y1+1,x1+2+p,y1+14);
     myGLCD.fillRect (x1+3+p,y1+7,x1+4+p,y1+8);
     myGLCD.fillRect (x1+8+p,y1+1,x1+10+p,y1+2);
     myGLCD.fillRect (x1+8+p,y1+13,x1+10+p,y1+14);
     myGLCD.drawVLine (x1+5+p,y1+5,5);
     myGLCD.drawVLine (x1+6+p,y1+3,9);
     myGLCD.drawVLine (x1+7+p,y1+2,2);
     myGLCD.drawVLine (x1+11+p,y1+2,2);
     myGLCD.drawVLine (x1+12+p,y1+3,9);
     myGLCD.drawVLine (x1+13+p,y1+5,5);
     myGLCD.drawVLine (x1+7+p,y1+11,2);
     myGLCD.drawVLine (x1+11+p,y1+11,2);     
     }
    
    if (latters[z] == 'Y')         
     { 
     p=p+13;
     myGLCD.fillRect (x1+6+p,y1+1,x1+9+p,y1+2);      
     myGLCD.drawVLine (x1+10+p,y1+1,13);
     myGLCD.drawVLine (x1+11+p,y1+2,12);
     myGLCD.drawVLine (x1+5+p,y1+2,6);
     myGLCD.drawVLine (x1+4+p,y1+3,4);
     myGLCD.drawHLine (x1+6+p,y1+8,3);
     myGLCD.drawHLine (x1+7+p,y1+9,2);
     myGLCD.drawLine  (x1+3+p,y1+14,x1+7+p,y1+10);
     myGLCD.drawLine  (x1+4+p,y1+14,x1+8+p,y1+10); 
     myGLCD.drawPixel (x1+6+p, y1+3);
     myGLCD.drawPixel (x1+6+p, y1+7); 
    }    
  }    
} 

int counter (int x, int y, byte count_number) //Функция счетчик. Один разряд.
{
  myGLCD.setColor(VGA_BLACK);              // Выбираем черный (цвет фона)
  myGLCD.fillRect(x,y,x+10,y+15);          // Закрашиваем место будующей цифры 
  myGLCD.setColor(VGA_WHITE);              // Выбираем цвет цифры.

 if (count_number == 1)
 {
  myGLCD.fillRect (x+2,y+14,x+10,y+15);
  myGLCD.fillRect (x+6,y+13,x+8,y+1);
  myGLCD.fillRect (x+2,y+4,x+5,y+3);
  myGLCD.drawHLine (x+4,y+2,1);
  myGLCD.drawPixel (x+1, y+4);     
 } 
 if (count_number == 2)
 {
  myGLCD.fillRect (x+1,y+5,x+3,y+2);
  myGLCD.fillRect (x+8,y+6,x+10,y+3); 
  myGLCD.fillRect (x+1,y+15,x+10,y+14); 
  myGLCD.drawHLine (x+3,y+1,5);
  myGLCD.drawHLine (x+4,y+2,6);
  myGLCD.drawHLine (x+8,y+13,2);
  myGLCD.drawLine(x+1,y+12,x+7,y+6);
  myGLCD.drawLine(x+1,y+13,x+7,y+7);
  myGLCD.drawLine(x+2,y+13,x+8,y+7);
  myGLCD.drawLine(x+3,y+13,x+9,y+7);
 } 
 if (count_number == 3)
 {
  myGLCD.fillRect (x+7,y+5,x+10,y+3);
  myGLCD.fillRect (x+4,y+8,x+7,y+7);
  myGLCD.fillRect (x+7,y+13,x+10,y+10); 
  myGLCD.drawHLine (x+3,y+1,5);
  myGLCD.drawHLine (x+2,y+2,7);
  myGLCD.drawHLine (x+1,y+3,2);
  myGLCD.drawHLine (x+6,y+6,3);
  myGLCD.drawHLine (x+6,y+9,3);
  myGLCD.drawHLine (x+1,y+13,2);
  myGLCD.drawHLine (x+2,y+14,7);
  myGLCD.drawHLine (x+3,y+15,5);  
 } 
 if (count_number == 4)
 {
  myGLCD.fillRect (x+7,y+1,x+9,y+7);
  myGLCD.fillRect (x+1,y+9,x+10,y+8);
  myGLCD.fillRect (x+6,y+13,x+9,y+10);
  myGLCD.fillRect (x+3,y+15,x+10,y+14);
  myGLCD.drawLine (x+1,y+6,x+6,y+1);
  myGLCD.drawLine (x+1,y+7,x+6,y+2);
  myGLCD.drawLine (x+2,y+7,x+6,y+3);
 } 
 if (count_number == 5)
 {
  myGLCD.fillRect (x+1,y+2,x+10,y+1); 
  myGLCD.fillRect (x+1,y+6,x+4,y+3);
  myGLCD.fillRect (x+8,y+14,x+10,y+8);
  myGLCD.fillRect (x+1,y+13,x+3,y+12);
  myGLCD.drawHLine(x+2,y+7,8);
  myGLCD.drawHLine(x+5,y+6,4);  
  myGLCD.drawHLine(x+2,y+14,5);
  myGLCD.drawHLine(x+4,y+15,4);   
 } 
 if (count_number == 6)
 {
  myGLCD.fillRect (x+1,y+13,x+3,y+3);
  myGLCD.fillRect (x+8,y+4,x+10,y+2);
  myGLCD.fillRect (x+8,y+14,x+10,y+10);
  myGLCD.drawHLine(x+3,y+1,5);
  myGLCD.drawHLine(x+2,y+2,5);
  myGLCD.drawHLine(x+4,y+8,5);
  myGLCD.drawHLine(x+4,y+9,6);
  myGLCD.drawHLine(x+2,y+14,5);
  myGLCD.drawHLine(x+3,y+15,5);   
 } 
 if (count_number == 7)
 {
  myGLCD.fillRect (x+1,y+4,x+3,y+1);
  myGLCD.fillRect (x+4,y+2,x+10,y+1);
  myGLCD.fillRect (x+8,y+5,x+10,y+3);
  myGLCD.fillRect (x+7,y+7,x+9,y+6);
  myGLCD.fillRect (x+6,y+10,x+8,y+8);
  myGLCD.fillRect (x+4,y+15,x+7,y+11);
  myGLCD.drawPixel (x+5, y+10);  
 } 
 if (count_number == 8)
 {
  myGLCD.fillRect (x+3,y+1,x+8,y+2);
  myGLCD.fillRect (x+2,y+6,x+3,y+2);
  myGLCD.fillRect (x+8,y+2,x+9,y+6);
  myGLCD.fillRect (x+4,y+7,x+7,y+6);
  myGLCD.fillRect (x+1,y+14,x+3,y+9);
  myGLCD.fillRect (x+8,y+14,x+10,y+9);
  myGLCD.fillRect (x+3,y+15,x+8,y+14);
  myGLCD.drawHLine(x+2,y+8,7);
  myGLCD.drawVLine(x+1,y+3,2);
  myGLCD.drawVLine(x+10,y+3,2);
 }
if (count_number == 9)
 {
  myGLCD.fillRect (x+1,y+7,x+3,y+2);
  myGLCD.fillRect (x+3,y+1,x+8,y+2);
  myGLCD.fillRect (x+8,y+2,x+10,y+13);
  myGLCD.fillRect (x+3,y+8,x+7,y+7);
  myGLCD.fillRect (x+1,y+14,x+3,y+12);
  myGLCD.drawHLine(x+4,y+14,5);
  myGLCD.drawHLine(x+3,y+15,5);   
 } 
 if (count_number == 0)
 {
  myGLCD.fillRect (x+1,y+13,x+3,y+3);
  myGLCD.fillRect (x+8,y+13,x+10,y+3);
  myGLCD.drawHLine(x+3,y+1,5); 
  myGLCD.drawHLine(x+2,y+2,7);
  myGLCD.drawHLine(x+2,y+14,7);
  myGLCD.drawHLine(x+3,y+15,5);    
 } 
}

int light_counter (int x, int y, byte count_number, boolean i)// Счетчик 2х разрядных чисел 2х6 px.
 {                                                            // При вызове функции i=0
   byte a,b;    
   
   a = count_number % 10 ;                 //Единицы счетчика.
   b = (count_number /10) % 10 ;           //Десятки счетчик
   
  myGLCD.setColor(VGA_BLACK);              // Выбираем черный (цвет фона)
  myGLCD.fillRect(x,y,x+3,y+6);          // Закрашиваем место будующей цифры 
  myGLCD.setColor(200,200,200);              // Выбираем цвет цифры.

 if (a == 1)
 { 
  myGLCD.drawVLine (x+3,y+1,5);
  //myGLCD.drawPixel (x+2, y+2);   
 } 
 if (a == 2)
 {
  myGLCD.drawVLine (x+3,y+1,3);
  myGLCD.drawVLine (x+1,y+4,2);
  myGLCD.drawHLine (x+1,y+1,1);
  myGLCD.drawHLine (x+2,y+6,1);
  myGLCD.drawPixel (x+2, y+4);   
 } 
 if (a == 3)
 { 
  myGLCD.drawVLine (x+3,y+2,4);
  myGLCD.drawHLine (x+1,y+1,2);
  myGLCD.drawHLine (x+1,y+6,1);
  myGLCD.drawPixel (x+2, y+3);  
 } 
 if (a == 4)
 {
  myGLCD.drawVLine (x+1,y+1,2);
  myGLCD.drawVLine (x+3,y+1,5);
  myGLCD.drawPixel (x+2, y+3);  
 } 
 if (a == 5)
 {  
  myGLCD.drawVLine(x+3,y+4,1);
  myGLCD.drawHLine(x+1,y+1,2);
  myGLCD.drawHLine(x+1,y+3,2);
  myGLCD.drawHLine(x+1,y+6,2);
  myGLCD.drawPixel (x+1, y+2);  
 } 
 if (a == 6)
 {  
  myGLCD.drawVLine(x+1,y+3,3);
  myGLCD.drawVLine(x+3,y+4,2);
  myGLCD.drawPixel (x+3, y+1);
  myGLCD.drawPixel (x+2, y+2);
  myGLCD.drawPixel (x+2, y+4);
  myGLCD.drawPixel (x+2, y+6);   
 } 
 if (a == 7)
 {
   myGLCD.drawVLine(x+2,y+3,1);
   myGLCD.drawVLine(x+1,y+5,1);
   myGLCD.drawHLine(x+1,y+1,2);
   myGLCD.drawPixel (x+3, y+2);   
 } 
 if (a == 8)
 {  
  myGLCD.drawVLine(x+1,y+1,5);
  myGLCD.drawVLine(x+3,y+1,5);
  myGLCD.drawPixel (x+2, y+1);
  myGLCD.drawPixel (x+2, y+3);
  myGLCD.drawPixel (x+2, y+6);  
 }
if (a == 9)
 {
  myGLCD.drawVLine(x+1,y+1,2);
  myGLCD.drawVLine(x+3,y+1,3);
  myGLCD.drawPixel (x+2, y+1);
  myGLCD.drawPixel (x+2, y+3);
  myGLCD.drawPixel (x+2, y+5);
  myGLCD.drawPixel (x+1, y+6);    
 } 
 if (a == 0)
 {
  myGLCD.drawVLine(x+1,y+2,3); 
  myGLCD.drawVLine(x+3,y+2,3);
  myGLCD.drawPixel (x+2, y+1); 
  myGLCD.drawPixel (x+2, y+6);     
 } 
  
 if (i==1){return 0;};  
 if (b==0){return 0;}; 
 
  
   light_counter (x-5, y, b+10, 1);   
   
 }  
 
int symbol_temperature (int x1, int y1)
  {
    boolean tem [15][13]={{0,0,0,1,1,0,0,0,0,0,0,0,0},
                          {0,0,0,1,1,0,0,0,0,0,1,1,0},
                          {0,0,0,1,1,0,0,0,0,1,0,0,1},
                          {0,0,0,1,1,0,0,0,0,1,0,0,1},
                          {0,1,1,1,1,1,1,0,0,0,1,1,0},
                          {0,1,1,1,1,1,1,0,0,0,0,0,0},
                          {0,0,0,1,1,0,0,0,0,0,0,0,0},
                          {0,0,0,1,1,0,0,0,0,0,0,0,0},
                          {0,0,0,1,1,0,0,0,0,0,0,0,0},
                          {0,0,0,1,1,0,0,0,0,0,0,0,0},
                          {0,0,0,1,1,0,0,0,0,0,1,1,0},
                          {0,0,0,1,1,1,0,0,0,0,1,1,0},
                          {0,0,0,0,1,1,1,1,1,1,1,0,0},
                          {0,0,0,0,0,1,1,1,1,1,0,0,0},
                          {0,0,0,0,0,0,0,0,0,0,0,0,0}};
    for (byte k=0; k<13; k++)
    {
    for (byte n=0; n<15; n++)
     {
      if  (tem[n][k] == true)   {
        myGLCD.drawPixel(x1+k, y1+n);
      }  
     }
    }
  } 
  

 

Nord_Air
Offline
Зарегистрирован: 15.06.2020
Nord_Air
Offline
Зарегистрирован: 15.06.2020

Допишу уж чё писал на форуме в амперке...

Насчет датчиков DHT.
 В процессе выяснилось пару глюков. DHT 22.  Уличный датчик подключен изначально был через нормальные 5V, (позже запитал от пина) Провод ~3м. Ethernet кабель, но самый беспонтовый, тоненькие проводки одножильные, без экрана, просто он был у меня, но сейчас я подозреваю что и в нём могло быть дело.  Соединен крепко, я разобрал "маму" поджал и с трудом запхнул "папу".

 1. От датчика приходят нулевые значения. Я не смотрел что он мог бы слать в серийный порт, так как функция контроля была к тому  выпелена. Глюк проявлял себя довольно редко (может 1 раз за три дня). Но решался например перепрошивкой. Я добавил функцию софтварного рестарта, которая перезагружает плату когда и влажность и температура принимает нулевые значения. Недели 2 подобного глюка не наблюдаю. Тем не менее нужно сделать лог в еппром...
  Проблема была именно с уличным датчиком, внутренний стоит в самой коробке, рядом с платой, другой датчик DHT 11 висит на 2х метровом кабеле патч-корде, но сам кабель получше,  одиночный провод - многожильный.

2. Второй косяк-с... Так же с уличным датчиком. Ночью, влажность поднимается почти до 100% (95-97), а утром значения не проседают. Аппартная перезагрузка тут не помогает. Для этих целей, я подключил питание датчика на отдельный пин. "перезагрузка" датчика, решает эту проблему...

Выглядит несколько костыльно... Если будут вопросы - допишу. 

 

Но что самое главное? Самое главное в наше время не кашлять;) Так что здоровья :)))   

b707
Онлайн
Зарегистрирован: 26.05.2017

NordAir - зачем вы дрязги чужого форума сюда принесли? - вам заняться нечем? -  из 11 сообщений 8 про то, как вас угнетают на Амперке...

Это теперь называется "я разместил программу"?

 

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Nord_Air пишет:
Но что самое главное? Самое главное в наше время не кашлять;)
Это для кого как.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Nord_Air пишет:

Всем доброго времени суток.  Сам начал разбираться, с ардуинкой, написал программку. Польовался в основном материалами амперки. И посчиталправильным разместить свою первую  прогу на их форуме..
Честно.справедливо, более чем на мой взгляд... 

Нет, на первый взгляд, действительно, все честно и справедливо.

Цитата:

Это с их форума...

 ребят, может вы мне поясните...  Я что-то не понимаю в современных реалиях. Я просто написал программу, выложил её на форуме...   Меня Банят как какого-то злоумышлиника

Вы знаете, после просмотра текста самой программы, объемом почти 2 тыс. строк, большинство из которых - "пачки" drawPixel и drawLine, желание забанить вполне объяснимо. Это просто графоманство какое-то.

Но самое главное, что написанная в подобном стиле программа:

1. В принципе не способна надежно работать.

2. Не может служить источником каких-либо полезных идей.

Другими словами:

1. Бесполезна.

2. Вредна.

3. А если учесть способ выкладывания (почти 2000 строк без сворачивания), то еще и является неуважением  к посетителям форума.

 

Подумайте над этим прежде, чем обвинять других в несправедливом к себе отношении.

Morroc
Offline
Зарегистрирован: 24.10.2016

Буквы лайнами... прикольно ) Почти TrueType если допилить ) Времени небось потрачено дофига. Библиотека не умеет в символы что ли ?

sadman41
Онлайн
Зарегистрирован: 19.10.2016

Nord_Air пишет:

Допишу уж чё писал на форуме в амперке...

Насчет датчиков DHT.
 В процессе выяснилось пару глюков. DHT 22.  Уличный датчик подключен изначально был через нормальные 5V, (позже запитал от пина) Провод ~3м. Ethernet кабель, но самый беспонтовый, тоненькие проводки одножильные, без экрана, просто он был у меня, но сейчас я подозреваю что и в нём могло быть дело.  Соединен крепко, я разобрал "маму" поджал и с трудом запхнул "папу".

AM2301. Метров 10 кабеля от какой-то сигналки (ОПС). Явно похуже, чем витая пара (0.5м^2). Питание от +5V паралллельно с ардуиной. Два года онлайна без проблем.

Nord_Air
Offline
Зарегистрирован: 15.06.2020

andriano пишет:

Но самое главное, что написанная в подобном стиле программа:

1. В принципе не способна надежно работать.

2. Не может служить источником каких-либо полезных идей.

 

Я первый раз пишу программу, я не знал. что у неё должен стиль какой-то, быть;)  Как мне кажется, программа должна максимально четко исполнять возложенные на неё обязанности.

  А если бы она на ассемблере была написана, ты бы там вообще знакомых букв не увидел, и чё теперь? Не в том стиле написана??? ;) 

 Или может как Бейсике, строчки кода местами помять, и всё понятно станет, нет? ;)

В современной игре, 95% кода, это текстуры, в моём случае это бесконечные строчки, куда их девать? Я не знаю что с этим делать?

andriano пишет:

3. А если учесть способ выкладывания (почти 2000 строк без сворачивания), то еще и является неуважением  к посетителям форума.

 

Тут глубоко уважаемый сорян ко всем посетителям форума.  Стоило бы затереть под кат...  Но теперь уж хз как...

 

andriano пишет:

Подумайте над этим прежде, чем обвинять других в несправедливом к себе отношении.

Я особо никого не обвиняю.  Я действительно был поражен, редкой формой слабоумия...  Бреда...  Ересью, отдельных представителей форумов.

 Они реально, в своей голове с кем то воюют.  Говорит, (пишет) Я не узнаю вас в гриме... Если это не болезнь, вы мне хоть объясните что отвечать :)

Так как иными словоразованиями  их ответы я объяснить не могу.

Nord_Air
Offline
Зарегистрирован: 15.06.2020

Morroc пишет:
Буквы лайнами... прикольно ) Почти TrueType если допилить ) Времени небось потрачено дофига. Библиотека не умеет в символы что ли ?

Буквы лайнами, это ультра фест;) Насчет времени...  Изначально были булевые массивы, по ним бегала функция и рисовала  букву. Плюсы - рисовать букву удобно, рисовать букву быстро...  Минус ---  массивы подчистую выедают ОЗУ ~ 180 байт на символ . Пришлось перепилить в линии и прямоугольники, вот это оказалось несколько напряжно...

У меня осталась данная функция  symbol_temperature, она рисует значек температуры, по старой схеме.  Оставил специально, чтобы, если вдруг чё потребуется не стандартное нарисовать...  Перепилил массив и всё. 

Nord_Air
Offline
Зарегистрирован: 15.06.2020

 andriano Вы из кодеров, или из Бла-Бла кодеров??? ;)

Nord_Air
Offline
Зарегистрирован: 15.06.2020

sadman41 пишет:

AM2301. Метров 10 кабеля от какой-то сигналки (ОПС). Явно похуже, чем витая пара (0.5м^2). Питание от +5V паралллельно с ардуиной. Два года онлайна без проблем.

 

Питание так же, так же 5V.  Потом я перепили на питание от пина, чтобы перезагружать датчик.

 

Явно похуже, чем витая пара....  Мне моя эта витая пара ну очень не понравилась :)

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Nord_Air пишет:

Я первый раз пишу программу, я не знал. что у неё должен стиль какой-то, быть;)  

Воспользуюсь аллегорией: Вы считаете, что научились играть на гитаре - освоили целых два аккорда (третий - пока не смогли). Теперь хотите осчастливить своим "творчеством" весь мир и искренне недоумеваете, почему окружающие от Вашего бренчания затыкают уши.

Цитата:

Как мне кажется, программа должна максимально четко исполнять возложенные на неё обязанности.

Это Вам так кажется

Опять аллегория: "еда должна быть съедобной" - в принципе, с этим утверждением никто не спорит, но, боюсь, если "еда" не будет удовлетворять еще длинному списку условий:

- быть питательной,

- иметь приятный внешний вид,

- иметь приятный запах,

- не содержать ядовитых веществ,

...

то вряд ли у нормального человека возникнет желание употреблять ее в пищу.

Так же и с программой.

А у Вас даже "четко исполнять" - пока не доказано.

Ну а для программы, которая подлежит публикации, "четко исполнять" - это далеко не самый важный и даже не необходимый критерий.

Цитата:

В современной игре, 95% кода, это текстуры, в моём случае это бесконечные строчки, куда их девать? Я не знаю что с этим делать?

Ну, если Вы не знаете, тем более, сами осознаете, что не знаете, на мой взгляд, наиболее естественным было бы задавать вопросы.

Nord_Air пишет:

 andriano Вы из кодеров, или из Бла-Бла кодеров??? ;)

Чукча не читатель, чукча - писатель?

А почитать форум?

Хотя бы раздел "Проекты".

b707
Онлайн
Зарегистрирован: 26.05.2017

Nord_Air пишет:

Изначально были булевые массивы, по ним бегала функция и рисовала  букву. Плюсы - рисовать букву удобно, рисовать букву быстро...  Минус ---  массивы подчистую выедают ОЗУ ~ 180 байт на символ . Пришлось перепилить в линии и прямоугольники


прежде чем выкладывать в форум эту бредятину ( я имею в виду ваш код) - может стоило поинтересоваться, как это делают другие?
Массивы фонтов никто не кладет в оперативку, их размещают во флеш. Погуглите по слову " progmem"

Согласен с характеристикой "графоманство" в отношении ТС - оно проступает не только в желании поделится помоечным кодом, но и в словесном недержании в комментах, когда на одно замечание мы видим десять ответов ни о чем

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Мужики, чего Вы к коду привязались? Топик ведь не про код, а про "поплакаться в жилетку как на амперке обидели". Помнится был тут один "обиженный амперкой", так он быстро выяснил, что мы тут все - "шпионы амперки". Помните такого?

Nord_Air
Offline
Зарегистрирован: 15.06.2020

andriano пишет:

Как мне кажется, программа должна максимально четко исполнять возложенные на неё обязанности.

 

Это Вам так кажется

Опять аллегория: "еда должна быть съедобной" - в принципе, с этим утверждением никто не спорит, но, боюсь, если "еда" не будет удовлетворять еще длинному списку условий:

- быть питательной,

- иметь приятный внешний вид,

- иметь приятный запах,

- не содержать ядовитых веществ,

...

 

Вам не кажется, что вы БЛА-БЛА кодер, как я и писал ранее?   Если это не очевидно , то это можно поднять на суд обществености?

 По тексту  чета будет? ;) Ааа!??? :)))

Nord_Air
Offline
Зарегистрирован: 15.06.2020

b707 пишет:

 прежде чем выкладывать в форум эту бредятину ( я имею в виду ваш код) - может стоило поинтересоваться, как это делают другие? Массивы фонтов никто не кладет в оперативку, их размещают во флеш. Погуглите по слову " progmem"

 

Сделате отдолжение, уважаемый. Разместите код во влэш :))) Ткните котенка...  Код программы вам  предложен. Напишите как надо.   Если нет. то и Бла-бла тоже нет, справедливо?;)

Nord_Air
Offline
Зарегистрирован: 15.06.2020

 Дополню по тексту я.

 Прога, на текущий момент состоит из двух частей. Грубо говоря.

1. Это отрисовка и анимация. (99% кода)

2.Функционал климат контроля. (10 строчек кода)

 

По первому пункту, вопросов вроде быть не должно я более менее вроде постарался чтобы всё отображалось и работало во всех режимах. Шрифт отрисовывается  довольно быстро. То есть если мутить вторую страницу не придется мучительно долго ждать, если юзать стандартные шрифты UTFT. И мне до сих пор непонятно, зачем там нужен строчный шрифт :)  Запилено пару цифровых счетчиков, и это еще не всё что было задумано :) Тут я чёт малёк увлёкся :)

Второй пункт, это климатические режимы  Это всё спорный вопрос. Я не могу претендовать, что именно так должен выглядеть климат-контроль.  Очень много параметров влияет на работу. Я тестил систему летом. Как это будет выглядеть зимой???   Есть такие физические особенности, о которых вы навряд ли ранее задумывались. К примеру, в помещении влажность 55%,  вечер, температура  в помещении +23, на улице +13. Открываем входную дверь на 30-40сек, влажность проседает практически моментально на 20-25%, потом, после закрытия двери, в течении 5-7 минут снова поднимается до 55%.  Понятно, что влага резко сконенсировалась  в объеме холодного воздуха. Это понятно, когда ты об этом читаешь. Но это не очень понятно когда ты пишешь код.  То есть раздел климатический режим, он весь пока спорный.  Тут надо смотреть и тестить.

Nord_Air
Offline
Зарегистрирован: 15.06.2020

ЕвгенийП пишет:

Мужики, чего Вы к коду привязались? Топик ведь не про код, а про "поплакаться в жилетку как на амперке обидели". Помнится был тут один "обиженный амперкой", так он быстро выяснил, что мы тут все - "шпионы амперки". Помните такого?

Ты точно не ошибся с формой обращения?;)

Morroc
Offline
Зарегистрирован: 24.10.2016

Nord_Air пишет:
Буквы лайнами, это ультра фест;)

Это вы с другим своим кодом сравнили ? ) Это точно не быстро и точно отнимает больше памяти (причем разница большая). Единственное преимущество - масштабировать можно, но при этом может выглядеть.страшновато.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Nord_Air пишет:

Вам не кажется, что вы БЛА-БЛА кодер, как я и писал ранее?

Значит, Вы так и не удосужились посмотреть мои проекты... Выходит, верно: чукча не читатель, чукча - писатель.

Кстати, Вам не приходило в голову, что если Вы не понимаете некий текст, то это совершенно не означает, что текст лишен смысла, может, просто у Вас что-то с "понималкой"?

Ну и на закуску: попытайтесь привести хоть какие-нибудь аргументы за то, что ниже расположенный текст это не БЛА-БЛА:

Nord_Air пишет:

По первому пункту, вопросов вроде быть не должно я более менее вроде постарался чтобы всё отображалось и работало во всех режимах. Шрифт отрисовывается  довольно быстро. То есть если мутить вторую страницу не придется мучительно долго ждать, если юзать стандартные шрифты UTFT. И мне до сих пор непонятно, зачем там нужен строчный шрифт :)  Запилено пару цифровых счетчиков, и это еще не всё что было задумано :) Тут я чёт малёк увлёкся :)

Второй пункт, это климатические режимы  Это всё спорный вопрос. Я не могу претендовать, что именно так должен выглядеть климат-контроль.  Очень много параметров влияет на работу. Я тестил систему летом. Как это будет выглядеть зимой???   Есть такие физические особенности, о которых вы навряд ли ранее задумывались. К примеру, в помещении влажность 55%,  вечер, температура  в помещении +23, на улице +13. Открываем входную дверь на 30-40сек, влажность проседает практически моментально на 20-25%, потом, после закрытия двери, в течении 5-7 минут снова поднимается до 55%.  Понятно, что влага резко сконенсировалась  в объеме холодного воздуха. Это понятно, когда ты об этом читаешь. Но это не очень понятно когда ты пишешь код.  То есть раздел климатический режим, он весь пока спорный.  Тут надо смотреть и тестить.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Morroc пишет:
Это точно не быстро и точно отнимает больше памяти (причем разница большая). Единственное преимущество - масштабировать можно, но при этом может выглядеть.страшновато.
Нет, векторные фонты - это отдельная песня, но и векторные фонты программируются совсем не так. В любом случае (вне зависимости от того, вектор или растр) данные о фонте содержатся в массиве и обрабатываются программой. При этом, хотя наружу и выдается последовательность отрисовки линий и пикселей, но эти вызовы отрисовки линий и пикселей не включаются явно в текст программы.

у и по поводу "масштабировать". Нормальный векторный фонт - масштабируется, а то, что написал ТС - нет. В силу того, что все необходимые для масштабирования константы разбросаны по телу кода. Т.е. минусы присутствуют, а плюсов не наблюдается.

b707
Онлайн
Зарегистрирован: 26.05.2017

мужики. да не тратьте на дебила время. Видно же, что он убежден в собственной гениальности :)На амперке его забанили - а здесь даже банить необязательно,  никто его творение повторять не будет, если не обращать внимания - через пару дней уйдет в архив и затеряется навечно

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Nord_Air пишет:

ЕвгенийП пишет:

Мужики, 

Ты точно не ошибся с формой обращения?;)

Точно. Я же не к Вам обращался.

Пушной звер
Пушной звер аватар
Offline
Зарегистрирован: 17.03.2013

ЕвгенийП пишет:

Мужики, чего Вы к коду привязались? Топик ведь не про код, а про "поплакаться в жилетку как на амперке обидели". Помнится был тут один "обиженный амперкой", так он быстро выяснил, что мы тут все - "шпионы амперки". Помните такого?

а кто тут в обиженые амперкой крайний?

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Пушной звер пишет:

а кто тут в обиженые амперкой крайний?

Я

Пушной звер
Пушной звер аватар
Offline
Зарегистрирован: 17.03.2013

DetSimen пишет:

Пушной звер пишет:

а кто тут в обиженые амперкой крайний?

Я

за вами буду...

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Вас здесь не стояло!!!

Nord_Air
Offline
Зарегистрирован: 15.06.2020

andriano пишет:

Нет, векторные фонты - это отдельная песня, но и векторные фонты программируются совсем не так. В любом случае (вне зависимости от того, вектор или растр) данные о фонте содержатся в массиве и обрабатываются программой.

Какие векторные фонты?  Ты о чём вообще шепчешь? :))) Ты себя слышишь? ;)  Я всю программу писал от и до, включая шрифт, и цифры для счетчиков, при всём при этом я знаю что такое растровые и векторные шрифты...   Они к этому коду, даже не побоюсь, к любо ардуино проге, не имеют никакого отношения.

andriano пишет:
данные о фонте содержатся в массиве и обрабатываются программой.
Ты это на каком-то умном форуме прочёл, или сам додумался? :)

Я думаю искушенный читатель сможет оценить степень моей выдержки...  Какие внутренние усилия мне потребовались, чтобы не перейти на откровенный МАТ ;) 

 Мои буквы рисуются, наитупейшими функциями библиотеки UTFT, рисуются средствами линий, прямоугольников, и в последнюю очередь пикселями.  Данный метод, значительно быстрее, даже стандартного шрифта UTFT соразмерного моему (15Х10 или около того). 

Можно нарисовать другим способом. Счетчик бегает по булевскому массиву, и сверяется ежели 1 рисуем пиксель. Так я рисовал ранее, есть в проге пример, таким образом отрисован значок "температура"

Есть другой вариант, который собсно в библиотеке UTFT (Но наиболее вероятно, по разного рода схожим признакам, это переработка древней библиотеки для Cи) изначально я пробовал рисовать в ней.  Но я толком не вник в способ отрисовки буквы из массива, как это реализовано в бтблиотеке UTFT...  Тем не менее  с десяток строк, отрисованных  функцией библиотеки UTFT, будет значительно отличаться по скорости появления на экране, в сравнении с моим вариантом шрифта.  И принципиально это будет когда, потребуется переключиться на следующую страницу, и её придется заполнять букавками.  В остальных случаях, когда речь идет о статичной странице - по барабану. Лишь внешний вид.  

Nord_Air
Offline
Зарегистрирован: 15.06.2020

ЕвгенийП пишет:

Точно. Я же не к Вам обращался.

 

Ну дай Бог. А то так со стороны глянешь, ответы прочтешь...  На баб базарных похожи, не сказать бы хуже ;)

 Вот...  Ну дай Бог, дай Бог ;) 

Nord_Air
Offline
Зарегистрирован: 15.06.2020

Morroc пишет:
Единственное преимущество - масштабировать можно, но при этом может выглядеть.страшновато.

 Масштабировать? Вы это серьезно? :)))) Как вы себе это представляете? Масштабировать прямоугольник конечно можно... К двум последним х и у прибавить переменную, значение которой можно прередавать в функцию.  Но у меня используется далеко не только прямоугольники. 

 Идея может оказаться интересной, но для этого нужно чтобы весь шрифт был отрисован исключительно прямоугольниками, при этом чтобы они все рисовались из верхнего левого угла, например...  Но это далеко не факт...  Так, на вскидку, сложно прикинуть возможные косяки.  У меня проблемы возникали и с простыми линиями идущими под углом, в последствии я старался рисовать исключительно горизонтальными, вертикальными линиями прямоугольниками и пикселями в совсем крайнем случае. 

ЗЫ. Немного подумав...  Если масштабировать  прямоугольники в плюс, то  шрифт в итоге получится очень "топорный".  То есть, я например использую прямоугольники (в текущем шрифте)  там, где они тупо влезают. Переходы между прямоугольниками "сглаживаются" (заполняются) линиями и в крайних случаях пикселями.

Увеличивая прямоугольники, потребуется и увеличения заполнения, сглаживания пространства между ними...  Либо морщить моск над шрифтом, который будет рисоваться исключительно прямоугольниками.   

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Эк тебя плющит-то...

Nord_Air
Offline
Зарегистрирован: 15.06.2020

Пушной звер пишет:

а кто тут в обиженые амперкой крайний?

 

Чем же вас они обидели???

У них довольно неплохой контент, всё очень четко и понятно расписано. Я например, изначально, читал в основном только их вики. без обид если что...

 Чисто мое мое мнение, навскидку...  Есть амперка магазин, есть амперка видеоблог на ютубе, которая этим живет и зарабатывает.  И есть какие-то люди на форуме, которые хотят вложиться и зарабатывать, или которым очень хочется на разного рода  девайсах как-то зарабатывать, в отличии от их производства и написании для них кода.  Я не программу "бесплатно" выкладываю, я хлеб у них отбираю, получается. В их мировозрении программу, можно только купить, у тех кто "шарит", у людей, на которых у них есть выход. (на cyberforum'е с кем-то ...  списались)

Nord_Air
Offline
Зарегистрирован: 15.06.2020

DetSimen пишет:

Эк тебя плющит-то...

Апать, не па тексту ;) Предмет для диалога будет?

 

Или ты из этих...  Бла-бла кодеров? ;)

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Nord_Air пишет:

Или ты из этих...  

Из этих 

у мня и медалька есь

Nord_Air
Offline
Зарегистрирован: 15.06.2020

Добро! :)

Nord_Air
Offline
Зарегистрирован: 15.06.2020

b707 пишет:

мужики. да не тратьте на дебила время. Видно же, что он убежден в собственной гениальности :)На амперке его забанили - а здесь даже банить необязательно,  никто его творение повторять не будет, если не обращать внимания - через пару дней уйдет в архив и затеряется навечно

Дык, а зачем же ты тогда тему аппаешь?  Я еще и гениален?  Вы крайне низкого о себе мнения ;)

 

 

Radistx100
Offline
Зарегистрирован: 29.11.2016

на амперке свои проекты и любой проект должен быть подвязан к их оборудованию и их программному продукту, вот и блочат

b707
Онлайн
Зарегистрирован: 26.05.2017

Radistx100 пишет:

на амперке свои проекты и любой проект должен быть подвязан к их оборудованию и их программному продукту, вот и блочат

это бред, там полно проектов, никак не связанных с амперкой

А ТС блочат совсем не поэтому, он просто крайне болезненно относится к критике своего кода, вместо нормального обсуждения устраивает срач с десятками сообщений.

 

v258
Offline
Зарегистрирован: 25.05.2020

"Вчера ходила на соседнюю улицу, там такие бабы злые, я одна от семерых еле отбрехалась."

Пушной звер
Пушной звер аватар
Offline
Зарегистрирован: 17.03.2013

Nord_Air пишет:

Пушной звер пишет:

а кто тут в обиженые амперкой крайний?

 

Чем же вас они обидели???

какая разница? его уже не спасти.

Nord_Air
Offline
Зарегистрирован: 15.06.2020

b707 пишет:

А ТС блочат совсем не поэтому, он просто крайне болезненно относится к критике своего кода, вместо нормального обсуждения устраивает срач с десятками сообщений.

   Дык она была критика кода???
Я неоднократно упоминал, по тексту что-то есть? Что здесь, что на амперке. На амперке был настолько лютый бред.  Я просто тераюсь в диагнозе... У меня начали появляться предположения, что человек хотел на чем-то подобном заработать.  Ладно не важно...
 
 Что касается критики кода. 95% кода что-то рисует. Функции несколько раз переписывались, в первом случае я не мог понять откуда появляются артеакты на экране, (это было из-за перерасхода ОЗУ) и далее, для ускорения отрисовки на экране. 
 
 Например, на первый взгляд может показаться что проще и правильнее и выглядит код лучше, если передавать в функцию-счетчик двухзначное число, температуры например. Чем например плодить переменные для обоих разрядов, потом еще переменные для сохранения  и т.д. Можно переписать функцию, сократив количество переменных вдвое. Но при изменении значения, экранчик будет перерисовывать уже оба разряда, два числа, и это только в одном счетчике. А если их с десяток. Плюс еще рисуется всякая анимация.
 
 То есть к критике принимается замечания, которые могут ускорить отрисовку символов на экране. Пусть даже функция будет выглядеть еще более безобразнее, и код распухнет еще на сотню строк. 
 Например, мне потребовалось закрыть бегающие рамки вокруг вентилятора, после отключения ручного его включения. Проще всего, перекрыть всю область черным прямоугольником, но на деле прямоугольник всё же заметно рисуется и гораздо быстрее и визуально красивее, перекрыть уже четырьмя прямоугольниками именно рамку которую нужно убрать. 
 
 Здесь работает уже другая логика ;)
Nord_Air
Offline
Зарегистрирован: 15.06.2020

 Что еще могу отметить по программе...  Еще одна-две иконки анимации, еще пару активных счетчиков и пару библиотек и будет заметно сильное подтупливание экранчика. Анимацию нужно делать хотя бы на 5-6 кадров, а не 3 как у меня.

Если планируется рисовать что-то посерьезней, нужно переходить на параллельный интерфейс подключения экрана. Я думаю он должен тащить :)

И возможно переходить к архитектуре PC :) То есть одна плата это условно процессор, которая принимает данные и их обрабатывает, вторая, принимет некоторые переменные от первой платы и чисто отрисовывает что-то на экране.

Если и этого окажется мало, то тогда уже переходить на более скоростные платформы. 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017
Nord_Air
Offline
Зарегистрирован: 15.06.2020

Хорошо, такой ответ поит корректен?  

 Все новости в видео!!!   https://youtu.be/u3fWYujRBk0

 

Версия 2.0   Patch note! J

  1. Добавлено, отображение отрицательных температур  на основном экране. Но работоспособность датчиков и библиотек при отрицательных температурах всё же не проверил, в виду их отсутствия.
  2. Добавлены часы, (RTC)  для ведения статистики.
  3. Добавлены три тактовые кнопки (вперед, назад, вернуться на главную)  для переключения на следующий экран. (страницу). В библиотеке UTFT, есть какие-то переключения на новую страницу, но даже не вникал…
  4. Немного отредактировал основные климатические функции и исправил некоторые мелкие косяки…
  5. Ну и основное, это запилил функцию отрисовки графика. На текущий момент, это пока суточный график, который пишет в ОЗУ, (не хочу пока мучать, тестами  Епппром… ) Это уже второй вариант функции… Хочется сделать универсальный вариант, но пока имеем что имеем.

 

Nord_Air
Offline
Зарегистрирован: 15.06.2020
//-------------------------------------------------------------------------График-------------------------------------------------------------------------

int graphic ( int x, int y, int resolution_grid_x, int resolution_grid_y, int step_X, int step_Y, int zoom_Y, int l, int type, int data_1[], int data_2[] ){
//graphic ( 20, 15, 240, 200, 10, 10, 2, 25, 1, day_T_for_graphic, day_t_for_graphic );
//int l = 25; //длинна графика в вершинах из массива. 
            //Одна точка, одна ячейка массива.            
//int step_X = 10; //шаг вершин графика по оси Х, сетка по оси х в 2 раза больше этого значения.
//int step_Y = 10; //шаг по оси Y
//int zoom_Y = 2;  //масштабирование графика по оси Y. (умножение значения Y)
//int x=20; //начальные координаты графика. 
//int y=15; //левый верхний угол
//int type=1; //тип графика     Тип 1: положительные и отрицательные значения по оси Y. Тип 2: только положительные по Y.
//int resolution_grid_x=240; // (размер (разрешение) графика)  
//int resolution_grid_y=200;

resolution_grid_y=resolution_grid_y/2;
      
    myGLCD.setColor(70,70,70);
        for (int i=1; i<l/2; i++ )  //рисуем фоновую сетку по вертикали.
        {         
          myGLCD.drawLine ( ((x)+step_X*i*2), y+resolution_grid_y, ((x)+step_X*i*2),  y+10);  
          myGLCD.drawLine ( ((x)+step_X*i*2), y+resolution_grid_y, ((x)+step_X*i*2),  y+resolution_grid_y*2);  
        }

        if (type==1){
        for (int i=0; i<(step_Y/zoom_Y); i++ ) //рисуем фоновую сетку по горизонтали          
        {
          myGLCD.drawLine (x, (resolution_grid_y-(step_Y)*i*zoom_Y)+y, x+resolution_grid_x, (resolution_grid_y-(step_Y)*i*zoom_Y)+y );
          myGLCD.drawLine (x, (resolution_grid_y+(step_Y)*i*zoom_Y)+y, x+resolution_grid_x, (resolution_grid_y+(step_Y)*i*zoom_Y)+y );
        }; 
                   };
        
        if (type==2){

        for (int i=0; i<(resolution_grid_y/step_Y); i++ ) //рисуем фоновую сетку по горизонтали          
        {
          myGLCD.drawLine (x, (resolution_grid_y-(step_Y)*i*zoom_Y)+y, x+resolution_grid_x, (resolution_grid_y-(step_Y)*i*zoom_Y)+y );
          myGLCD.drawLine (x, (resolution_grid_y+(step_Y)*i*zoom_Y)+y, x+resolution_grid_x, (resolution_grid_y+(step_Y)*i*zoom_Y)+y );
        }; 
                   };           
                       
        for (int i=1; i<=l/4; i++ ) //рисуем вертикальные риски оси х  
        {
          myGLCD.setColor(VGA_WHITE);
          myGLCD.drawLine ( ((x)+step_X*i*4), (y+resolution_grid_y*type), ((x)+step_X*i*4),  (y+resolution_grid_y*type)-7); 
        };

        if (type==1){  
        for (int i=0; i<(step_Y/zoom_Y); i++ ) //рисуем горизонтальные риски оси y
        {
          myGLCD.drawLine (x, resolution_grid_y+(step_Y*zoom_Y)*i+y, x+5, resolution_grid_y+(step_Y*zoom_Y)*i+y );
          myGLCD.drawLine (x, resolution_grid_y-(step_Y*zoom_Y)*i+y, x+5, resolution_grid_y-(step_Y*zoom_Y)*i+y );
         }; 
                  }; 

         if (type==2){  
        for (int i=0; i<(resolution_grid_y/step_Y); i++ ) //рисуем горизонтальные риски оси y
        {
          myGLCD.drawLine (x, resolution_grid_y+(step_Y*zoom_Y)*i+y, x+5, resolution_grid_y+(step_Y*zoom_Y)*i+y );
          myGLCD.drawLine (x, resolution_grid_y-(step_Y*zoom_Y)*i+y, x+5, resolution_grid_y-(step_Y*zoom_Y)*i+y );
         }; 
                  }; 
                          
       
        if (type==1){
          myGLCD.drawLine (x, y+resolution_grid_y, x+resolution_grid_x, y+resolution_grid_y);         //основная ось х, тип 1          
                   };
        if (type==2){
          myGLCD.drawLine (x, (y+resolution_grid_y*2), x+resolution_grid_x, (y+resolution_grid_y*2));  //основная ось х, тип 2
                    };
          myGLCD.drawLine (x, y+10,  x,  resolution_grid_y*2+y);                                       //основная ось y          


   draw_graphic (x, y, step_X, zoom_Y, l, resolution_grid_y, 255, 140, 0, data_1, type );
   draw_graphic (x, y, step_X, zoom_Y, l, resolution_grid_y, 0, 0, 255, data_2, type );  
};


void draw_graphic (int x, int y, int step_X, int zoom_Y, int l, int resolution_grid_y, int a, int b, int c, int data[], int type )
 {
   int Ax,  Ay,  Bx,  By, Cx, Cy;              // основные точки для построения графика
   int A2x, A2y, B1x, B1y, B2x, B2y, C1x, C1y; // вспомогательные точки, для сглаживания вершин
   int r1, r2;                                 // направление прямой графика.
  
   
   
 for (int i=1; i<l; i=i+2)
    {
      Ax=x+(step_X*(i-1));      
      Ay=y+(resolution_grid_y*type)-(data[i-1]*zoom_Y);       
       
      Bx=x+(step_X*i);      
      By=y+(resolution_grid_y*type)-(data[i]*zoom_Y);
       
      Cx=x+(step_X*(i+1));      
      Cy=y+(resolution_grid_y*type)-(data[i+1]*zoom_Y);
       
      myGLCD.setColor(a,b,c);  
 
 /// --- Проверка на движение графика и расчет доп. точек для сглаживания вершин --- 
  if        (Ay>By && (Ay-By)>5){r1=1;}   // возростание 1й линии графика
   else if  (Ay<By && (By-Ay)>5){r1=2;}   // снижение 1й линии графика
     else                      {r1=0;};   // без сглаживания

 
  if        (By>Cy && (By-Cy)>5){r2=1;}   // возростание 2й линии графика
   else if  (By<Cy && (Cy-By)>5){r2=2;}   // снижение 2й линии графика
     else                      {r2=0;};   // без сглаживания 
 //--сглаживание вершин происходит если расcтояние между соседними вершинами по оси Y более 5px
 
 if (r1==1) {A2x=Ax+2;
             A2y=Ay-1;
             B1x=Bx-2;
             B1y=By+1;};
   
 if (r1==2) {A2x=Ax+2;
             A2y=Ay+1; 
             B1x=Bx-2;
             B1y=By-1;};
 
 if (r1==0) {A2x=Ax;
             A2y=Ay;
             B1x=Bx;
             B1y=By;};

 if (r2==1) {B2x=Bx+2;
             B2y=By-1;
             C1x=Cx-2;
             C1y=Cy+1;};

 if (r2==2) {B2x=Bx+2;
             B2y=By+1; 
             C1x=Cx-2;
             C1y=Cy-1;};

 if (r2==0) {B2x=Bx;
             B2y=By;
             C1x=Cx;
             C1y=Cy;};
  
  
 //---- 1.   График со сглаженными вершинами
 myGLCD.drawLine (Ax, Ay, A2x, A2y);
 myGLCD.drawLine (A2x, A2y, B1x, B1y);
 myGLCD.drawLine (B1x, B1y, Bx, By);
 myGLCD.drawLine (Bx, By, B2x, B2y);
 myGLCD.drawLine (B2x, B2y, C1x, C1y);
 myGLCD.drawLine (C1x, C1y, Cx, Cy);
      
//---- 2.  График без сглаживания вершин        
   //myGLCD.drawLine (Ax,Ay,Bx,By);
   //myGLCD.drawLine (Bx,By, Cx,Cy); 
  };
 };

 Спасибо, буду знать ;))))

Nord_Air
Offline
Зарегистрирован: 15.06.2020

 Комментарии по коду принимаются :))) Лично, крайне тяжело чужой код читаю.

полная версия https://yadi.sk/d/y92K-TXYTI7ZAQ

 

Модератору сорян, код действительно стал "меньше", я как-то через чур эмоционально воспринял правку ;)