Arduino:Примеры/GLCDdemo
Перейти к навигации
Перейти к поиску
Поддержать проект | Содержание | Знакомство с Arduino | Продукты | Основы | Справочник языка Arduino | Примеры | Библиотеки | Хакинг | Изменения | Сравнение языков Arduino и Processing |
Перевод: Максим Кузьмин (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 }
См.также
Внешние ссылки