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

Arduino:Примеры/BigNums

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

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

Контакты:

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


Использование текстовых областей [1]

Этот пример показывает, как при помощи библиотеки GLCD настроить плату Arduino таким образом, чтобы показать на GLCD-панели несколько текстовых областей. Всего демонстрируется четыре разных способа задать на экране текстовую область.

Код

  1. /*
  2.  * Использование текстовых областей
  3.  *
  4.  * Этот скетч демонстрирует, как использовать текстовые области,
  5.  * большие шрифты и форматирующую функцию Printf().
  6.  *
  7.  * Примечание: Printf() использует около 1,8 Кб программной памяти.
  8.  * Если печатать строки, то она может быть довольно ресурсоемкой,
  9.  * особенно по сравнению с более простыми функциями вроде Puts() и
  10.  * класса Print из языка Arduino.
  11.  * Впрочем, если использовать много форматирующих строк и выдачу в
  12.  * шестнадцатеричных числах, Printf() можно сделать менее громоздкой.
  13.  *
  14.  * Чтобы сэкономить программную память, имеет смысл не использовать
  15.  * в одном скетче и Printf(), и класс Print.
  16.  *
  17.  * Также имейте в виду, что когда Printf() использует форматирующие
  18.  * строки, это требует места в RAM-памяти (обычные строки копируются
  19.  * в RAM, где их можно модифицировать). То же самое касается и Puts().
  20.  * Во избежание этого нужно объявить, чтобы строки сохранялись только
  21.  * в программной памяти AVR при помощи макроса PSTR. Впрочем, тогда
  22.  * придется использовать функции Print_P() и Puts_P().
  23.  *
  24.  * Пример:
  25.  *
  26.  * GLCD.Printf_P(PSTR("форматирующая строка"), arg1, arg2, ...);
  27.  * Этот метод также можно использовать для простых строк:
  28.  * GLCD.Printf_P(PSTR("Hello world"));
  29.  * GLCD.Puts_P(PSTR("Hello world"));
  30.  *
  31.  * Моноширинные шрифты – это неполные шрифты. Заголовочные файлы с
  32.  * этими шрифтами содержат лишь следующие символы: '+', ',', '-', '.',
  33.  * '/', '0', '1', '2', '3', '4', '5', '6', '7', '9'. Таким образом,
  34.  * символы вроде 'V', 'F', 'C' напечатать не получится.
  35.  *
  36.  * Это сделано намеренно – чтобы была возможность печатать большие
  37.  * цифры, не расходуя много места во flash-памяти. Этого должно быть
  38.  * достаточно, чтобы показывать вещи вроде часов или цифр для
  39.  * счетчиков, показателей напряжения, температуры и т.д.
  40.  *
  41.  * 2011-04-23 Создан Биллом Перри (Bill Perry)
  42.  */
  43.  
  44. #include "glcd.h"
  45.  
  46. /*
  47.  * Если вы подключили файл allFonts.h, то другие шрифты отдельно
  48.  * подключать не нужно.
  49.  */
  50. //#include "fonts/fixednums15x31.h"
  51. //#include "fonts/fixednums8x16.h"
  52. //#include "fonts/fixednums7x15.h"
  53. //#include "fonts/SystemFont5x7.h"
  54.  
  55. #include "fonts/allFonts.h"
  56.  
  57. void setup() {
  58.         GLCD.Init(NON_INVERTED);
  59. }
  60.  
  61. /*
  62.  * Определяем текстовые области.
  63.  * Их можно определить и в блоке setup(), и в блоке loop().
  64.  *
  65.  * Примечание:
  66.  * В объект GLCD встроена текстовая область на весь GLCD-дисплей.
  67.  * Печатающие функции есть и для объекта GLCD, и для текстовых
  68.  * областей, заданных самим пользователем.
  69.  */
  70.  
  71. gText t1; // зададим эту текстовую область в блоке loop()
  72.  
  73. #if DISPLAY_HEIGHT > 32
  74. gText t2; // эту тоже
  75.  
  76. /*
  77.  * Задаем текстовую область t3. Она начинается в центре дисплея,
  78.  * но по оси X прибавлен один пиксель. Размер области – 8 столбцов и
  79.  * 1 ряд. В качестве шрифта используется системный шрифт.
  80.  */
  81. gText t3 = gText(GLCD.CenterX+1, GLCD.CenterY, 8, 1, SystemFont5x7);
  82.  
  83. gText t4; // зададим эту текстовую область в блоке loop()
  84. #endif
  85.  
  86. void loop()
  87. {
  88. int hr, min, sec;
  89. int counter = 0;;
  90.  
  91.         /*
  92.          * Разными способами создаем 4 текстовые области
  93.          * (в демонстрационных целях).
  94.          *
  95.          * Функция DefineArea() позволяет объявить текстовые области
  96.          * несколькими способами:
  97.          * - при помощи заранее определенных областей;
  98.          * - x1, y1, столбцы, ряды;
  99.          * - от x1,y1 к x2,y2.
  100.          *
  101.          */
  102.  
  103.         /*
  104.          * Задаем текстовую область t1 исходя из заранее определенной
  105.          * области размером во весь дисплей.
  106.          */
  107.  
  108.         t1.DefineArea(textAreaTOP);
  109.         t1.SelectFont(fixednums15x31);
  110.  
  111. #if DISPLAY_HEIGHT > 32
  112.         /*
  113.          * Задаем t2. Исходная точка середина левой стороны экрана.
  114.          * Размер – 8 столбцов и 2 ряда.
  115.          */
  116.         t2.DefineArea(0, GLCD.CenterY, 8, 2, fixednums7x15);
  117.  
  118.         /*
  119.          * В демонстрационных целях делаем цвет шрифта белым и очищаем
  120.          * всю текстовую область, чтобы сделать ее видимой.
  121.          */
  122.         t2.SetFontColor(WHITE); // задаем цвет шрифта
  123.         t2.ClearArea(); // очищаем всю текстовую область, чтобы видеть ее границы
  124.  
  125.         /*
  126.          * Область t3 была задана в блоке setup().
  127.          */
  128.  
  129.         /*
  130.          * Задаем t4. Это текстовая область с 8 столбцами и 1 рядом.
  131.          * Она начинается в середине экрана на высоте в 3/4 дисплея.
  132.          */
  133.  
  134.         t4.DefineArea(GLCD.CenterX, GLCD.Height * 3/4, 8, 1, fixednums7x15);
  135. #endif
  136.  
  137.         hr = 0;
  138.         min = 0;
  139.         sec = 0;
  140.         while(1)
  141.         {
  142.  
  143. #if DISPLAY_WIDTH > 127
  144.                 t1.CursorToXY(0,0); // Координаты (столбец, ряд)
  145.                                // относительно текстовой области
  146.                 /*
  147.                  * используем форматирующую строку, но находящуюся
  148.                  * во FLASH/(программной памяти), а не в RAM.
  149.                  */
  150.                 t1.Printf_P(PSTR("%02d:%02d.%02d"), hr, min, sec);
  151.  
  152. #if DISPLAY_HEIGHT > 32
  153.                 t2.CursorTo(0,0); // Координаты (столбец, ряд) относительно
  154.                              // текстовой области
  155.                 t2.Printf("%02d:%02d.%02d", hr, min, sec);
  156.  
  157.                 /*
  158.                  * Поскольку размер области t3 – 8х1 (в символах), и мы
  159.                  * будем печатать ее очень часто, нет нужды очищать область
  160.                  * и указывать конкретную позицию. Новый текст будет
  161.                  * вытеснять собой старый текст.
  162.                  */
  163.                 t3.Printf("%02d:%02d.%02d", hr, min, sec);
  164.  
  165.                 /*
  166.                  * Вы также можете пользоваться классом Print
  167.                  * из языка Arduino. Если использовать printIn(),
  168.                  * библиотека будет отсрочивать печать новой строки до
  169.                  * появления нового символа. Таким образом, если вы
  170.                  * используете однолинейную текстовую область, то при печати
  171.                  * нового символа она будет автоматически очищаться.
  172.                  */
  173.  
  174.                 /*
  175.                  * Здесь создается такая же форматирующая строка, как и при
  176.                  * помощи функции printf(), но с использованием класса Print
  177.                  * из языка Arduino.
  178.                  */
  179.                 if(hr < 9)
  180.                         t4.print(0);
  181.                 t4.print(hr);
  182.                 t4.print(":");
  183.                 if(min < 9)
  184.                         t4.print(0);
  185.                 t4.print(min);
  186.                 t4.print(".");
  187.                 if(sec < 9)
  188.                         t4.print(0);
  189.                 t4.println(sec);
  190. #endif
  191.                 sec++; // не совсем секунды, но для демонстрационных целей – то, что нужно
  192.                 if(sec > 59)
  193.                 {
  194.                         sec = 0;
  195.                         min++;
  196.                         if(min>59)
  197.                         {
  198.                                 min = 0;
  199.                                 hr++;
  200.                                 if(hr>11)
  201.                                         hr = 0;
  202.                         }
  203.                 }
  204. #else
  205.                 /*
  206.                  * Печатаем простой счетчик с «0» (для маленьких дисплеев).
  207.                  */
  208.                 t1.CursorTo(0,0);
  209.                 t1.Printf("%04d", counter);
  210.                 counter++;
  211.                 delay(100);
  212. #endif
  213.         }
  214. }

См.также

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

  1. glcd-v3-20111205.zip