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

Arduino:Примеры/clockFace

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

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

Контакты:

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


Аналоговые часы[1]

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

Код

  1.  
  2. /*
  3.  * Аналоговые часы
  4.  *
  5.  * Создание аналоговых часов при помощи библиотеки GLCD
  6.  *
  7.  * Использует нажимные кнопки для настройки времени.
  8.  * По умолчанию подключение осуществляется через 2-ой и 3-ий контакты.
  9.  * Подключите одну сторон кнопки к контакту, а другую – к «земле».
  10.  * Одна кнопка мотает время вперед, а другая – назад.
  11.  *
  12.  */
  13.  
  14. #include <Time.h>    // загрузить можно тут: http://www.arduino.cc/playground/Code/Time
  15. #include <glcd.h>    // библиотека GLCD
  16. #include "fonts/SystemFont5x7.h"       // системный шрифт
  17. #include "AnalogClock.h"  // заголовочный файл с классом для аналоговых часов
  18.  
  19. #define PULL_UP  HIGH
  20.  
  21. const int  btnForward = 2;  // кнопки для настройки часов
  22. const int  btnBack = 3;
  23.  
  24. AnalogClock analogClock = AnalogClock();  // создаем экземпляр класса для аналоговых часов
  25.  
  26. void setup(){
  27.   digitalWrite(btnForward, PULL_UP);  // активируем встроенные подтягивающие резисторы
  28.   digitalWrite(btnBack, PULL_UP);  
  29.  
  30.   GLCD.Init(); // запускаем код GLCD
  31.   GLCD.SelectFont(System5x7);
  32.  
  33.   setTime(4,37,0,2,1,10); // задаем время на 4:37, 2 января 2010 года  
  34.   analogClock.Init(GLCD.CenterX,GLCD.CenterY,GLCD.CenterY-4);  // рисуем циферблат  
  35. }
  36.  
  37. void  loop(){  
  38.   unsigned long  prevtime;
  39.   prevtime = now();
  40.   while( prevtime == now() )
  41.   {
  42.     // проверяем, нажаты ли кнопки и секунду ждем повторного нажатия:
  43.     checkSetButton(btnForward, 1);    
  44.     checkSetButton(btnBack, -1);
  45.   }
  46. #ifdef DISPLAY_HEIGHT < 64
  47. // перерисовываем циферблат:
  48.   analogClock.DrawFace();
  49. #endif
  50.   analogClock.DisplayTime(hour(), minute(), second() ); // обновляем информацию на аналоговых часах
  51. }
  52.  
  53.  
  54. void checkSetButton(int button, int direction)
  55. {
  56. const int stepSecs[] = {1,30,300};  // значения, которые будут
  57.                                     // использоваться для ускорения
  58.                                     // движения стрелок, если кнопка
  59.                                     // будет в зажатом состоянии
  60. int stepIndex = 0; // индекс, определяющий значение для ускорения
  61. int step = 0; // счетчик шагов между повышениями индекса
  62.  
  63.   if(digitalRead(button)== LOW)
  64.   {
  65.      delay(50);  // небольшая задержка      
  66.      unsigned long startTime = millis() + 1000;
  67.      while(digitalRead(button)== LOW)
  68.      {
  69.        if(millis() - startTime > 100){
  70.          startTime = millis();
  71.          adjustTime(stepSecs[stepIndex] * direction);
  72. #ifdef DISPLAY_HEIGHT < 64
  73. // перерисовываем циферблат:
  74.          analogClock.DrawFace();
  75. #endif
  76.          analogClock.DisplayTime(hour(), minute(), second() ); // update analog clock  
  77.          if( ++step > 30){
  78.             step=0;
  79.             if(stepIndex < 2){
  80.                stepIndex++;
  81.             }
  82.          }        
  83.        }
  84.      }
  85.   }  
  86. }

См.также

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

  1. glcd-v3-20111205.zip