Cat hungry.png
Здравствуйте! Собираем деньги на перевод материалов по электронике(https://www.allaboutcircuits.com/education/). Реквизиты указаны здесь.

Arduino:Примеры/GLCDdemo

Материал из Онлайн справочника
Перейти к: навигация, поиск

Перевод: Максим Кузьмин (Cubewriter)
Перевел 2686 статей для сайта.

Контакты:

Проверка/Оформление/Редактирование: Мякишев Е.А.


Пример работы нескольких графических функций[1]

Этот пример показывает, как использовать на Arduino несколько графических функций библиотеки GLCD.

Код

  1.  
  2. /*
  3.  * Пример работы нескольких графических функций
  4.  *
  5.  * Основной тестовый скетч к библиотеке GLCD для Arduino.
  6.  * Здесь демонстрируется использование нескольких графических функций,
  7.  * имеющихся в библиотеке. Кроме того, этот скетч отображает
  8.  * производительность системы в виде количества кадров в секунду.
  9.  */
  10.  
  11. #include <glcd.h>
  12.  
  13. #include "fonts/allFonts.h"         // используются два шрифта – системный и arial14
  14. #include "bitmaps/allBitmaps.h"     // все изображения находятся в папке «bitmaps»
  15.  
  16. Image_t icon;
  17.  
  18. gText textArea;              // текстовая область, которая будет определена дальше в скетче
  19. gText textAreaArray[3];      // массив текстовых областей  
  20. gText countdownArea =  gText(GLCD.CenterX, GLCD.CenterY,1,1,Arial_14); // текстовая область для цифр обратного отсчета
  21.  
  22. unsigned long startMillis;
  23. unsigned int  loops = 0;
  24. unsigned int  iter = 0;
  25.          int  theDelay = 20;
  26.  
  27. void setup()
  28. {
  29.   GLCD.Init();   // инициализируем библиотеку; если в скобках поставить «false», это включит режим рисования, а если «true», то режим «стерки»
  30.   if(GLCD.Height >= 64)
  31.     icon = ArduinoIcon64x64;  // иконка с высотой 64 пикселя
  32.   else
  33.     icon = ArduinoIcon64x32;  // иконка с высотой 32 пикселя
  34.   introScreen();
  35.   GLCD.ClearScreen();
  36.  
  37.   GLCD.SelectFont(System5x7, BLACK); // шрифт, используемый по умолчанию
  38. }
  39.  
  40. void  loop()
  41. {  
  42.   iter=0;
  43.   startMillis = millis();
  44.   while(iter++ < 10){   // в этом цикле будет 10 шагов
  45.     GLCD.DrawRect(0, 0, GLCD.CenterX, GLCD.Bottom); // прямоугольник в левой части экрана
  46.     GLCD.DrawRoundRect(GLCD.CenterX + 2, 0, GLCD.CenterX - 3, GLCD.Bottom, 5);  // закругленный прямоугольник вокруг этой текстовой области
  47.     for(int i=0; i < GLCD.Bottom; i += 4)
  48.       GLCD.DrawLine(1,1, GLCD.CenterX-1, i);  // рисуем линии от верхней левой до нижней правой углов прямоугольника
  49.     GLCD.DrawCircle(GLCD.CenterX/2, GLCD.CenterY-1, min(GLCD.CenterX/2, GLCD.CenterY)-2);   // рисуем круг с центром в левой части экрана
  50.     GLCD.FillRect( GLCD.CenterX + GLCD.CenterX/2-8 ,GLCD.CenterY + GLCD.CenterY/2 -8,16,16, WHITE); // стираем предыдущую позицию счетчика  
  51.     drawSpinner(loops++, GLCD.CenterX + GLCD.CenterX/2, GLCD.CenterY + GLCD.CenterY/2);       // рисуем новую позицию счетчика
  52.     GLCD.CursorToXY(GLCD.CenterX/2, GLCD.Bottom -15);          
  53.     GLCD.print(iter);            // печатаем текущий номер шага на текущей позиции курсора
  54.   }
  55.   // показываем количество шагов цикла, происходящих в секунду
  56.   unsigned long duration = millis() - startMillis;
  57.   int fps = 10000 / duration;
  58.   int fps_fract = (10000 % duration) * 10 / (duration/10);
  59.   GLCD.ClearScreen();               // очищаем экран  
  60.   GLCD.CursorToXY(GLCD.CenterX + 16, 9);
  61.   GLCD.print("GLCD ");
  62.   GLCD.print(GLCD_VERSION, DEC);
  63.   if(GLCD.Height <= 32)
  64.     GLCD.CursorToXY(GLCD.CenterX + 4, 1);
  65.   else  
  66.     GLCD.CursorToXY(GLCD.CenterX + 4, 24);
  67.   GLCD.print("FPS=");               // печатаем текстовую строку
  68.   GLCD.print(fps);                  // печатаем целочисленное значение
  69.   GLCD.print(".");
  70.   if(fps_fract < 10)
  71.     GLCD.print((int)0);             // если необходимо, приходится также вручную печатать ведущий нуль
  72.   GLCD.print(fps_fract);
  73. }
  74.  
  75.  
  76. void introScreen(){  
  77.   GLCD.DrawBitmap(icon, 32,0);  //  рисуем изображение по указанным координатам X и Y
  78.   countdown(3);
  79.   GLCD.ClearScreen();
  80.   GLCD.SelectFont(Arial_14);  //  вы также можете использовать собственные шрифты
  81.   GLCD.CursorToXY(GLCD.Width/2 - 44, 3);
  82.   GLCD.print("GLCD version ");
  83.   GLCD.print(GLCD_VERSION, DEC);
  84.   GLCD.DrawRoundRect(8,0,GLCD.Width-19,17, 5);  // закругленный прямоугольник вокруг текстовой области
  85.   countdown(3);  
  86.   GLCD.ClearScreen();
  87.   scribble(5000);  // 5 секунд для функции scribble()
  88.   moveBall(6000);  // 6 секунд для функции mobeball()
  89.   GLCD.SelectFont(System5x7, BLACK);
  90.   showCharacters("5x7 font:", System5x7);
  91.   countdown(3);
  92.   showCharacters("Arial_14:", Arial_14);
  93.   countdown(3);
  94.   textAreaDemo();
  95.   scrollingDemo();
  96. }
  97.  
  98. void showCharacters(char * title, Font_t font) {
  99.   // эта функция показывает желаемый шрифт
  100.   GLCD.ClearScreen();  
  101.   GLCD.CursorTo(0,0);
  102.   GLCD.print(title);
  103.   GLCD.DrawRoundRect(GLCD.CenterX + 2, 0, GLCD.CenterX -3, GLCD.Bottom, 5);  // закругленный прямоугольник вокруг текстовой области
  104.   textArea.DefineArea(GLCD.CenterX + 5, 3, GLCD.Right-2, GLCD.Bottom-4, SCROLL_UP);
  105.   textArea.SelectFont(font, BLACK);
  106.   textArea.CursorTo(0,0);
  107.   for(char c = 32; c < 127; c++){
  108.     textArea.print(c);  
  109.     delay(20);
  110.   }
  111. }
  112.  
  113. void drawSpinner(byte pos, byte x, byte y) {  
  114.   // эта функция рисует объект, который будет находиться в счетчике
  115.   switch(pos % 8) {
  116.     case 0 : GLCD.DrawLine( x, y-8, x, y+8);        break;
  117.     case 1 : GLCD.DrawLine( x+3, y-7, x-3, y+7);    break;
  118.     case 2 : GLCD.DrawLine( x+6, y-6, x-6, y+6);    break;
  119.     case 3 : GLCD.DrawLine( x+7, y-3, x-7, y+3);    break;
  120.     case 4 : GLCD.DrawLine( x+8, y, x-8, y);        break;
  121.     case 5 : GLCD.DrawLine( x+7, y+3, x-7, y-3);    break;
  122.     case 6 : GLCD.DrawLine( x+6, y+6, x-6, y-6);    break;
  123.     case 7 : GLCD.DrawLine( x+3, y+7, x-3, y-7);    break;
  124.   }
  125. }
  126.  
  127. void  textAreaDemo()
  128. {
  129.   showArea( textAreaFULL,       "Full");
  130.   showArea( textAreaTOP,        "Top");
  131.   showArea( textAreaBOTTOM,     "Bottom");
  132.   showArea( textAreaRIGHT,      "Right");
  133.   showArea( textAreaLEFT,       "Left");
  134.   showArea( textAreaTOPLEFT,    "Top Left");
  135.   showArea( textAreaTOPRIGHT,   "Top Right");
  136.   showArea( textAreaBOTTOMLEFT, "Bot Left");
  137.   showArea( textAreaBOTTOMRIGHT,"Bot Right");  
  138. }
  139.  
  140. void showArea(predefinedArea area, char *description)
  141. {
  142.   GLCD.ClearScreen();
  143.   GLCD.DrawBitmap(icon, 0,  0);
  144.   GLCD.DrawBitmap(icon, 64, 0);
  145.   textArea.DefineArea(area);
  146.   textArea.SelectFont(System5x7);
  147.   textArea.SetFontColor(WHITE);
  148.   textArea.ClearArea();
  149.   textArea.println(description);
  150.   textArea.print("text area");
  151.   delay(1000);
  152.   textArea.SetFontColor(WHITE);
  153.   textArea.ClearArea();
  154.   showLines(10);
  155.   delay(1000);  
  156.   textArea.ClearArea();
  157.   textArea.SetFontColor(BLACK);  
  158.   showLines(10);
  159.   delay(1000);
  160. }
  161.  
  162. void showAscii()
  163. {
  164.   for( char ch = 64; ch < 127; ch++)
  165.   {
  166.     GLCD.print(ch);
  167.     delay(theDelay);
  168.   }  
  169. }
  170.  
  171. void showLines(int lines)
  172. {
  173.   for(int i = 1; i <= lines; i++)
  174.   {
  175.     textArea << " Line  " << i << endl;  
  176.     delay(theDelay);  // маленькая пауза между линиями
  177.   }
  178. }
  179.  
  180.  
  181. void countdown(int count){
  182.   while(count--){  // начинаем обратный отсчет  
  183.     countdownArea.ClearArea();
  184.     countdownArea.print(count);
  185.     delay(1000);  
  186.   }  
  187. }
  188.  
  189. void scrollingDemo()
  190. {
  191.   GLCD.ClearScreen();  
  192.   textAreaArray[0].DefineArea( textAreaTOPLEFT);  
  193.   textAreaArray[0].SelectFont(System5x7, WHITE);
  194.   textAreaArray[0].CursorTo(0,0);
  195.   textAreaArray[1].DefineArea( textAreaTOPRIGHT, SCROLL_DOWN);  // reverse scroll
  196.   textAreaArray[1].SelectFont(System5x7, BLACK);
  197.   textAreaArray[1].CursorTo(0,0);
  198.   textAreaArray[2].DefineArea(textAreaBOTTOM);
  199.  
  200.   textAreaArray[2].SelectFont(Arial_14, BLACK);
  201.   textAreaArray[2].CursorTo(0,0);
  202.  
  203.   for(byte area = 0; area < 3; area++)
  204.   {
  205.     for( char c = 64; c < 127; c++)
  206.       textAreaArray[area].print(c);
  207.     delay(theDelay);    
  208.   }
  209.   for(char c = 32; c < 127; c++)
  210.   {
  211.     for(byte area = 0; area < 3; area++)
  212.       textAreaArray[area].print(c);
  213.     delay(theDelay);
  214.   }  
  215.  
  216.   for(byte area = 0; area< 3; area++)
  217.   {
  218.     textAreaArray[area].ClearArea();
  219.   }
  220.   for(int x = 0; x < 15; x++)
  221.   {
  222.     for(byte area = 0; area < 3; area++)
  223.     {
  224.       textAreaArray[area].print("line ");
  225.       textAreaArray[area].println(x);
  226.       delay(50);
  227.     }
  228.   }
  229.   delay(1000);
  230. }
  231.  
  232. /*
  233.  * Графическая функция scribble(), за основу которой взят этот скетч
  234.  * от TellyMate: http://www.batsocks.co.uk/downloads/tms_scribble_001.pde
  235.  */
  236. void scribble( const unsigned int duration )
  237. {
  238.   const  float tick = 1/128.0;
  239.   float g_head_pos = 0.0;
  240.  
  241.   for(unsigned long start = millis();  millis() - start < duration; )
  242.   {
  243.     g_head_pos += tick ;
  244.  
  245.     float head = g_head_pos ;
  246.     float tail = head - (256 * tick) ;
  247.  
  248.     // рисуем пиксели в начале линии:
  249.     byte x = fn_x( head ) ;
  250.     byte y = fn_y( head ) ;
  251.     GLCD.SetDot( x , y , BLACK) ;
  252.  
  253.     // стираем пиксели в хвосте линии:
  254.     x = fn_x( tail ) ;
  255.     y = fn_y( tail ) ;  
  256.      GLCD.SetDot( x , y , WHITE) ;
  257.   }
  258. }
  259.  
  260. byte fn_x( float tick )
  261. {
  262.   return (byte)(GLCD.Width/2 + (GLCD.Width/2-1) * sin( tick * 1.8 ) * cos( tick * 3.2 )) ;
  263. }
  264.  
  265. byte fn_y( float tick )
  266. {
  267.   return (byte)(GLCD.Height/2 + (GLCD.Height/2 -1) * cos( tick * 1.2 ) * sin( tick * 3.1 )) ;
  268. }
  269.  
  270.  
  271. void moveBall(unsigned int duration)
  272. {
  273.  
  274. const byte ballR = 4;
  275. int ballX = GLCD.CenterX + 5;   // X position of the ball
  276. int ballY = GLCD.CenterY;       // Y position of the ball
  277. int ballDirectionY = 1;        // X direction of the ball
  278. int ballDirectionX = 1;        // Y direction of the ball
  279.  
  280.   GLCD.ClearScreen();
  281.   for(unsigned long start = millis();  millis() - start < duration; )
  282.   {
  283.     // если мяч выходит за пределы экрана вверху или внизу, реверсируем его движение по оси Y:
  284.     if (ballY + ballR >= GLCD.Bottom || ballY - ballR <= 0 )
  285.       ballDirectionY = -ballDirectionY;
  286.  
  287.      // если мяч выходит за пределы экрана слева или справа, реверсируем его движение по оси X:
  288.     if (ballX - ballR < 0 || ballX + ballR >= GLCD.Right )
  289.       ballDirectionX = -ballDirectionX;
  290.          
  291.      // стираем предыдущую позицию мяча:
  292.     //GLCD.DrawCircle(ballX, ballY,ballR, WHITE);
  293.     GLCD.FillRect(ballX-ballR-1, ballY-ballR-1, ballX+ballR, ballY+ballR, WHITE);
  294.    
  295.      // перемещаем позицию мяча по обеим осям:
  296.     ballX = ballX + 2 * ballDirectionX;
  297.     ballY = ballY + 2 * ballDirectionY;
  298.          
  299.     GLCD.FillCircle(ballX, ballY, ballR, BLACK);
  300.     delay(30 );
  301.   }
  302. }

См.также

Внешние ссылки

  1. glcd-v3-20111205.zip