Arduino:Примеры/clockFace

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

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


Аналоговые часы[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 }

См.также

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