Arduino:Примеры/GLCDdemo

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

Перевод: Максим Кузьмин (Cubewriter) Контакты:</br>* Skype: cubewriter</br>* E-mail: cubewriter@gmail.com</br>* Максим Кузьмин на freelance.ru
Проверка/Оформление/Редактирование: Мякишев Е.А.


Пример работы нескольких графических функций[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 }

См.также

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