|
draw_cooler_on_icon
Анимация синхронизирована с циклами программы, 1 цикл - 1 кадр. Предварительно создана переменная tact,
которая считает количество циклов, и сбрасывается каждый раз после третьего. Функция запускается каждый цикл
и рисуется case в зависимости от текущего такта. Основная сложность работоспособности анимации,
в её синхронизации с кодом основной программы. Выполнение основного кода, будет подтормаживать анимацию.
Здесь возможно следующее решение. Увеличить количество тактов до 4-х, в четвертый такт поместить основной код,
а к первым трем добавить задержку (delay) которая по времени будет примерно равна времени выполнения
кода основной программы. Если код будет исполнятся 400-500 мсек, то ошибка или погрешности задержки для анимации
в 100-150 мсек не испортит восприятие анимации.
В противном случае, просто использовать статичное изображение при включении устройства вентиляции,
и закрашивать черным прямоугольником при отключении. Закрашивание при отключении потребуется
и для анимированного случая. В примере это не указано.
#include < UTFT.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 );
byte tact=0;
int draw_cooler_on_icon (byte a, byte b, byte c, int x, int y, byte id);
void setup() {
myGLCD.InitLCD(1); // инициализируем дисплей с горизонтальной ориентацией
// обязательно указать данную строчку в setup
}
void loop() {
if (tact==0) {myGLCD.clrScr();}; // очищаем экран в нулевом,
// условно загрузочном, такте
if (tact==4) {tact=1;}; //Cброс счетчика
// ....Тело основной программы.....
draw_cooler_on_icon(0,0,255,100,100,0);
delay (100); // Небольшая задержка для анимации
tact++;
}
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 - уникальный номер для возможности отрисовки
// нескольких вентиляторов на одном экране.
// Анимация происходит по 1 кадру за каждый цикл программы
{
myGLCD.setColor(VGA_BLUE); // цвет обрамления иконки
myGLCD.drawRoundRect(x-4,y-4,x+34,y+34);
switch ( tact ) {
case 1:
{
myGLCD.setColor(a,b,c);
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 2:
{myGLCD.setColor(a,b,c);
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 3:
{myGLCD.setColor(a,b,c);
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;
}
}
|
|