Arduino:Примеры/GLCDdemo
Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску
Содержание | Знакомство с Arduino | Продукты | Основы | Справочник языка Arduino | Примеры | Библиотеки | Хакинг | Изменения | Сравнение языков Arduino и Processing |
Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.
Пример работы нескольких графических функций[1]
Этот пример показывает, как использовать на Arduino несколько графических функций библиотеки GLCD.
Код
/*
* Пример работы нескольких графических функций
*
* Основной тестовый скетч к библиотеке GLCD для Arduino.
* Здесь демонстрируется использование нескольких графических функций,
* имеющихся в библиотеке. Кроме того, этот скетч отображает
* производительность системы в виде количества кадров в секунду.
*/
#include <glcd.h>
#include "fonts/allFonts.h" // используются два шрифта – системный и arial14
#include "bitmaps/allBitmaps.h" // все изображения находятся в папке «bitmaps»
Image_t icon;
gText textArea; // текстовая область, которая будет определена дальше в скетче
gText textAreaArray[3]; // массив текстовых областей
gText countdownArea = gText(GLCD.CenterX, GLCD.CenterY,1,1,Arial_14); // текстовая область для цифр обратного отсчета
unsigned long startMillis;
unsigned int loops = 0;
unsigned int iter = 0;
int theDelay = 20;
void setup()
{
GLCD.Init(); // инициализируем библиотеку; если в скобках поставить «false», это включит режим рисования, а если «true», то режим «стерки»
if(GLCD.Height >= 64)
icon = ArduinoIcon64x64; // иконка с высотой 64 пикселя
else
icon = ArduinoIcon64x32; // иконка с высотой 32 пикселя
introScreen();
GLCD.ClearScreen();
GLCD.SelectFont(System5x7, BLACK); // шрифт, используемый по умолчанию
}
void loop()
{
iter=0;
startMillis = millis();
while(iter++ < 10){ // в этом цикле будет 10 шагов
GLCD.DrawRect(0, 0, GLCD.CenterX, GLCD.Bottom); // прямоугольник в левой части экрана
GLCD.DrawRoundRect(GLCD.CenterX + 2, 0, GLCD.CenterX - 3, GLCD.Bottom, 5); // закругленный прямоугольник вокруг этой текстовой области
for(int i=0; i < GLCD.Bottom; i += 4)
GLCD.DrawLine(1,1, GLCD.CenterX-1, i); // рисуем линии от верхней левой до нижней правой углов прямоугольника
GLCD.DrawCircle(GLCD.CenterX/2, GLCD.CenterY-1, min(GLCD.CenterX/2, GLCD.CenterY)-2); // рисуем круг с центром в левой части экрана
GLCD.FillRect( GLCD.CenterX + GLCD.CenterX/2-8 ,GLCD.CenterY + GLCD.CenterY/2 -8,16,16, WHITE); // стираем предыдущую позицию счетчика
drawSpinner(loops++, GLCD.CenterX + GLCD.CenterX/2, GLCD.CenterY + GLCD.CenterY/2); // рисуем новую позицию счетчика
GLCD.CursorToXY(GLCD.CenterX/2, GLCD.Bottom -15);
GLCD.print(iter); // печатаем текущий номер шага на текущей позиции курсора
}
// показываем количество шагов цикла, происходящих в секунду
unsigned long duration = millis() - startMillis;
int fps = 10000 / duration;
int fps_fract = (10000 % duration) * 10 / (duration/10);
GLCD.ClearScreen(); // очищаем экран
GLCD.CursorToXY(GLCD.CenterX + 16, 9);
GLCD.print("GLCD ");
GLCD.print(GLCD_VERSION, DEC);
if(GLCD.Height <= 32)
GLCD.CursorToXY(GLCD.CenterX + 4, 1);
else
GLCD.CursorToXY(GLCD.CenterX + 4, 24);
GLCD.print("FPS="); // печатаем текстовую строку
GLCD.print(fps); // печатаем целочисленное значение
GLCD.print(".");
if(fps_fract < 10)
GLCD.print((int)0); // если необходимо, приходится также вручную печатать ведущий нуль
GLCD.print(fps_fract);
}
void introScreen(){
GLCD.DrawBitmap(icon, 32,0); // рисуем изображение по указанным координатам X и Y
countdown(3);
GLCD.ClearScreen();
GLCD.SelectFont(Arial_14); // вы также можете использовать собственные шрифты
GLCD.CursorToXY(GLCD.Width/2 - 44, 3);
GLCD.print("GLCD version ");
GLCD.print(GLCD_VERSION, DEC);
GLCD.DrawRoundRect(8,0,GLCD.Width-19,17, 5); // закругленный прямоугольник вокруг текстовой области
countdown(3);
GLCD.ClearScreen();
scribble(5000); // 5 секунд для функции scribble()
moveBall(6000); // 6 секунд для функции mobeball()
GLCD.SelectFont(System5x7, BLACK);
showCharacters("5x7 font:", System5x7);
countdown(3);
showCharacters("Arial_14:", Arial_14);
countdown(3);
textAreaDemo();
scrollingDemo();
}
void showCharacters(char * title, Font_t font) {
// эта функция показывает желаемый шрифт
GLCD.ClearScreen();
GLCD.CursorTo(0,0);
GLCD.print(title);
GLCD.DrawRoundRect(GLCD.CenterX + 2, 0, GLCD.CenterX -3, GLCD.Bottom, 5); // закругленный прямоугольник вокруг текстовой области
textArea.DefineArea(GLCD.CenterX + 5, 3, GLCD.Right-2, GLCD.Bottom-4, SCROLL_UP);
textArea.SelectFont(font, BLACK);
textArea.CursorTo(0,0);
for(char c = 32; c < 127; c++){
textArea.print(c);
delay(20);
}
}
void drawSpinner(byte pos, byte x, byte y) {
// эта функция рисует объект, который будет находиться в счетчике
switch(pos % 8) {
case 0 : GLCD.DrawLine( x, y-8, x, y+8); break;
case 1 : GLCD.DrawLine( x+3, y-7, x-3, y+7); break;
case 2 : GLCD.DrawLine( x+6, y-6, x-6, y+6); break;
case 3 : GLCD.DrawLine( x+7, y-3, x-7, y+3); break;
case 4 : GLCD.DrawLine( x+8, y, x-8, y); break;
case 5 : GLCD.DrawLine( x+7, y+3, x-7, y-3); break;
case 6 : GLCD.DrawLine( x+6, y+6, x-6, y-6); break;
case 7 : GLCD.DrawLine( x+3, y+7, x-3, y-7); break;
}
}
void textAreaDemo()
{
showArea( textAreaFULL, "Full");
showArea( textAreaTOP, "Top");
showArea( textAreaBOTTOM, "Bottom");
showArea( textAreaRIGHT, "Right");
showArea( textAreaLEFT, "Left");
showArea( textAreaTOPLEFT, "Top Left");
showArea( textAreaTOPRIGHT, "Top Right");
showArea( textAreaBOTTOMLEFT, "Bot Left");
showArea( textAreaBOTTOMRIGHT,"Bot Right");
}
void showArea(predefinedArea area, char *description)
{
GLCD.ClearScreen();
GLCD.DrawBitmap(icon, 0, 0);
GLCD.DrawBitmap(icon, 64, 0);
textArea.DefineArea(area);
textArea.SelectFont(System5x7);
textArea.SetFontColor(WHITE);
textArea.ClearArea();
textArea.println(description);
textArea.print("text area");
delay(1000);
textArea.SetFontColor(WHITE);
textArea.ClearArea();
showLines(10);
delay(1000);
textArea.ClearArea();
textArea.SetFontColor(BLACK);
showLines(10);
delay(1000);
}
void showAscii()
{
for( char ch = 64; ch < 127; ch++)
{
GLCD.print(ch);
delay(theDelay);
}
}
void showLines(int lines)
{
for(int i = 1; i <= lines; i++)
{
textArea << " Line " << i << endl;
delay(theDelay); // маленькая пауза между линиями
}
}
void countdown(int count){
while(count--){ // начинаем обратный отсчет
countdownArea.ClearArea();
countdownArea.print(count);
delay(1000);
}
}
void scrollingDemo()
{
GLCD.ClearScreen();
textAreaArray[0].DefineArea( textAreaTOPLEFT);
textAreaArray[0].SelectFont(System5x7, WHITE);
textAreaArray[0].CursorTo(0,0);
textAreaArray[1].DefineArea( textAreaTOPRIGHT, SCROLL_DOWN); // reverse scroll
textAreaArray[1].SelectFont(System5x7, BLACK);
textAreaArray[1].CursorTo(0,0);
textAreaArray[2].DefineArea(textAreaBOTTOM);
textAreaArray[2].SelectFont(Arial_14, BLACK);
textAreaArray[2].CursorTo(0,0);
for(byte area = 0; area < 3; area++)
{
for( char c = 64; c < 127; c++)
textAreaArray[area].print(c);
delay(theDelay);
}
for(char c = 32; c < 127; c++)
{
for(byte area = 0; area < 3; area++)
textAreaArray[area].print(c);
delay(theDelay);
}
for(byte area = 0; area< 3; area++)
{
textAreaArray[area].ClearArea();
}
for(int x = 0; x < 15; x++)
{
for(byte area = 0; area < 3; area++)
{
textAreaArray[area].print("line ");
textAreaArray[area].println(x);
delay(50);
}
}
delay(1000);
}
/*
* Графическая функция scribble(), за основу которой взят этот скетч
* от TellyMate: http://www.batsocks.co.uk/downloads/tms_scribble_001.pde
*/
void scribble( const unsigned int duration )
{
const float tick = 1/128.0;
float g_head_pos = 0.0;
for(unsigned long start = millis(); millis() - start < duration; )
{
g_head_pos += tick ;
float head = g_head_pos ;
float tail = head - (256 * tick) ;
// рисуем пиксели в начале линии:
byte x = fn_x( head ) ;
byte y = fn_y( head ) ;
GLCD.SetDot( x , y , BLACK) ;
// стираем пиксели в хвосте линии:
x = fn_x( tail ) ;
y = fn_y( tail ) ;
GLCD.SetDot( x , y , WHITE) ;
}
}
byte fn_x( float tick )
{
return (byte)(GLCD.Width/2 + (GLCD.Width/2-1) * sin( tick * 1.8 ) * cos( tick * 3.2 )) ;
}
byte fn_y( float tick )
{
return (byte)(GLCD.Height/2 + (GLCD.Height/2 -1) * cos( tick * 1.2 ) * sin( tick * 3.1 )) ;
}
void moveBall(unsigned int duration)
{
const byte ballR = 4;
int ballX = GLCD.CenterX + 5; // X position of the ball
int ballY = GLCD.CenterY; // Y position of the ball
int ballDirectionY = 1; // X direction of the ball
int ballDirectionX = 1; // Y direction of the ball
GLCD.ClearScreen();
for(unsigned long start = millis(); millis() - start < duration; )
{
// если мяч выходит за пределы экрана вверху или внизу, реверсируем его движение по оси Y:
if (ballY + ballR >= GLCD.Bottom || ballY - ballR <= 0 )
ballDirectionY = -ballDirectionY;
// если мяч выходит за пределы экрана слева или справа, реверсируем его движение по оси X:
if (ballX - ballR < 0 || ballX + ballR >= GLCD.Right )
ballDirectionX = -ballDirectionX;
// стираем предыдущую позицию мяча:
//GLCD.DrawCircle(ballX, ballY,ballR, WHITE);
GLCD.FillRect(ballX-ballR-1, ballY-ballR-1, ballX+ballR, ballY+ballR, WHITE);
// перемещаем позицию мяча по обеим осям:
ballX = ballX + 2 * ballDirectionX;
ballY = ballY + 2 * ballDirectionY;
GLCD.FillCircle(ballX, ballY, ballR, BLACK);
delay(30 );
}
}