Анимированная иконка вытяжного вентилятора. (3 кадра) v 2.0



    draw_cooler_icon логичное продолжение предыдущей функции. Функция в текущем виде рисует 3 иконки. Одну для вентиляции и две для отопителей. Предполагается, что каждое устройство можно включить как вручную, кнопкой (отдельная переменная), в этом случае появляется бегущая рамка вокруг иконки, так и включить режим методами или функциями программы, которые в примере не описаны. (отдельная переменная). Функция написана таким образом, что у ручного управления приоритет выше автоматического, на запуск режима. При отключении режима, у кнопки приоритета нет. Если режим должен работать по условиям сторонних функций, то при отключении кнопки пропадает только бегающая рамка.

   draw_cooler_icon использует дополнительные глобальные переменные. cooler_z, heater_z и т.д. Это сделано, чтобы упростить логику работу функции и не обвязывать дополнительными условиями и так не самую быструю анимацию. В выключенном состоянии иконки окрашиваются в серый цвет. За это отвечает дополнительная функция draw_cooler_off_icon, которая по сути представляет отрисовку первого кадра из основной функции.

   Так же, добавлена переменная act, схожая по функции с переменной tact, только для более длительных, условных периодов работы основной программы. К этому счетчику удобно привязывать автоматический запуск различных функций.

  Организацию логики работы, можно посмотреть в описании к предыдущей версии.

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

      draw_cooler_icon


  
  #include     //библиотека для работы с дисплеем

  // создаём объект класса 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 );
    
  byte tact = 0;
  int  act  = 0;
   
  boolean cooler;             // переменная режима "вентилятор" 
  boolean heater_1;           // переменная режима "отопитель 1"
  boolean heater_2;           // переменная режима "отопитель 2"  
  
  boolean cooler_button;      // кнопка вентилятора
  boolean heater_1_button;    // кнопка 1-ого отопителя
  boolean heater_2_button ;   // кнопка 2-ого отопителя

   
    //-- переменные временного хранения-- 
    boolean cooler_z;
    boolean heater_1_z;
    boolean heater_2_z;
    //----------------------------------

  int draw_cooler_icon 
      (int x, int y, boolean cool, boolean heat, boolean Button, byte id);
  int draw_cooler_off_icon (int x, int y);

  void setup() {  
   myGLCD.InitLCD(1); // инициализируем дисплей с горизонтальной ориентацией
                      // обязательно указать данную строчку в setup
  }

  void loop() {
 
    if (tact==0) {myGLCD.clrScr();};   // очищаем экран в нулевом, 
                                       // условно загрузочном, такте
  
    if (tact == 4)     {tact=1;};  // Cброс счетчика тактов    
    if (act  == 1024)  {act=1;};   // Cброс счетчика тактов   

      // ....Тело основной программы.....
    
  draw_cooler_icon ( 270,9, cooler, false, cooler_button,1); 
  draw_cooler_icon ( 270,57, false, heater_1, heater_1_button,2);   
  draw_cooler_icon ( 270,105, false, heater_2, heater_2_button,3);

   delay (100); // Небольшая задержка для анимации

       //---Запись в переменные временного хранения состояния режима--
       cooler_z  =  cooler;
       heater_1_z = heater_1;
       heater_2_z = heater_2;    
       //-------------------------------------------------------------
       
    act++;
    tact++;    
  }

    int draw_cooler_icon 
    
    (int x, int y, boolean cool, boolean heat, boolean Button, byte id)
                    // Функция, по линиям рисует вентилятор.
                    // a,b,c - RGB цвет;
                    // x,y - координаты левого верхнего угла (-4px) 
                    // id - уникальный номер для возможности отрисовки
                    // нескольких вентиляторов на одном экране.
                    // Button Переменная ручного включения
 {                  
     
     int a=0; int b=0; int c=0;

                   // Анимация происходит по 1 кадру за каждый цикл программы 

    if (cool || heat)
  {
       if (cool) {c=255;};  // Выбор цвета для вентилятора. 
       if (heat) {a=255;};  // Выбор цвета для отопителя.

   if (tact == 1 )  
    {     
    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);

    ///----------Бегающая рамка при включенном вручную вентиляторе----------
     if (Button) {            
                                  myGLCD.setColor(0,0,0);
                                  myGLCD.drawRoundRect(x-8,y-8,x+38,38+y);
                                  myGLCD.setColor(a,b,c);                    
                                  myGLCD.drawRoundRect(x-6,y-6,x+36,36+y);}
     
                };
     if (tact == 2)
   {
    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);
  
  ///----------Бегающая рамка при включенном вручную вентиляторе-----------
     if (Button)    { 
                                  myGLCD.setColor(0,0,0);
                                  myGLCD.drawRoundRect(x-6,y-6,x+36,y+36);
                                  myGLCD.setColor(a,b,c);             
                                  myGLCD.drawRoundRect(x-7,y-7,x+37,y+37);}
                    }; 
    if (tact == 3)
   {
    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);
    
    ///----------Бегающая рамка при включенном вручную вентиляторе-----------
      if (Button) { 
                                   myGLCD.setColor(0,0,0);
                                   myGLCD.drawRoundRect(x-7,y-7,x+37,y+37);
                                   myGLCD.setColor(a,b,c);
                                   myGLCD.drawRoundRect(x-8,y-8,x+38,y+38);}
                  };
  }
  
   if (tact==1 && Button== false) {myGLCD.setColor(0,0,0);                   
                                   myGLCD.drawRoundRect(x-6,y-6,x+36,36+y);};
  
   if (tact==2 && Button== false)    {myGLCD.setColor(0,0,0);             
                                     myGLCD.drawRoundRect(x-7,y-7,x+37,37+y);};
   
   if (tact == 3 && Button== false) {myGLCD.setColor(0,0,0);
                                     myGLCD.drawRoundRect(x-8,y-8,x+38,38+y);};
       
   //-------  Отрисовка не активной иконки.  Функция запускается один раз, 
   //         при изменении состояния объекта. 
   if  ((cooler_z != cooler) && (cooler == false && id==1)  || act==0 )  
                                           {draw_cooler_off_icon (x,y);};
   //-----------------(  Лишнее отрезать  )------------------------------
   if  ((heater_1_z != heater_1) && (heater_1 == false && id==2) || act==0 )
                                           {draw_cooler_off_icon (x,y);};
   //-----------------(  Лишнее отрезать  )-------------------------------
   if  ((heater_2_z != heater_2) && (heater_2 == false && id==3) || act==0 )
                                           {draw_cooler_off_icon (x,y);};
 }


 int draw_cooler_off_icon (int x, int y) 
                                 
                                 // Дополнение к функции draw_cooler_icon
                                 // Отрисовка не активного вентилятора.
{
  
    myGLCD.setColor(0,0,0);    
    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);  
  }

  
   

       Функции


   1. Графические.

    Зависимость: UTFT

   Cчетчик, один разряд (10 x 15 px )
    Зависимость: UTFT









   Изготовление рекламы Изготовление мебели  Общестроительные работы 3D моделирование       Статьи
  Благоустройство тер.
   Общее портфолио    Мебель для мастерской   Установка бордюров   Портфолио   Контакты
   Наружняя реклама       Фасадные работы   Модели   Образец договора
   Внутреняя реклама       Утепление гаража   Инфо
   Таблички, наклейки       Косметический ремонт   Фото г.Надым
  Бетонные работы   Фото пригороды г.Надым