Arduino:Примеры/clockFace

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

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


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

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

Код

 
/*
 * Аналоговые часы
 *
 * Создание аналоговых часов при помощи библиотеки GLCD
 *
 * Использует нажимные кнопки для настройки времени.
 * По умолчанию подключение осуществляется через 2-ой и 3-ий контакты. 
 * Подключите одну сторон кнопки к контакту, а другую – к «земле».
 * Одна кнопка мотает время вперед, а другая – назад.
 *
 */
 
#include <Time.h>    // загрузить можно тут: http://www.arduino.cc/playground/Code/Time
#include <glcd.h>    // библиотека GLCD
#include "fonts/SystemFont5x7.h"       // системный шрифт
#include "AnalogClock.h"  // заголовочный файл с классом для аналоговых часов

#define PULL_UP  HIGH

const int  btnForward = 2;  // кнопки для настройки часов
const int  btnBack = 3;

AnalogClock analogClock = AnalogClock();  // создаем экземпляр класса для аналоговых часов 

void setup(){
  digitalWrite(btnForward, PULL_UP);  // активируем встроенные подтягивающие резисторы
  digitalWrite(btnBack, PULL_UP);  

  GLCD.Init(); // запускаем код GLCD
  GLCD.SelectFont(System5x7);

  setTime(4,37,0,2,1,10); // задаем время на 4:37, 2 января 2010 года  
  analogClock.Init(GLCD.CenterX,GLCD.CenterY,GLCD.CenterY-4);  // рисуем циферблат  
}

void  loop(){  
  unsigned long  prevtime;
  prevtime = now(); 
  while( prevtime == now() )
  {
    // проверяем, нажаты ли кнопки и секунду ждем повторного нажатия:
    checkSetButton(btnForward, 1);    
    checkSetButton(btnBack, -1);
  }
#ifdef DISPLAY_HEIGHT < 64
// перерисовываем циферблат:
  analogClock.DrawFace();
#endif
  analogClock.DisplayTime(hour(), minute(), second() ); // обновляем информацию на аналоговых часах
}


void checkSetButton(int button, int direction)
{
const int stepSecs[] = {1,30,300};  // значения, которые будут 
                                    // использоваться для ускорения 
                                    // движения стрелок, если кнопка 
                                    // будет в зажатом состоянии
int stepIndex = 0; // индекс, определяющий значение для ускорения
int step = 0; // счетчик шагов между повышениями индекса

  if(digitalRead(button)== LOW)
  {
     delay(50);  // небольшая задержка      
     unsigned long startTime = millis() + 1000;
     while(digitalRead(button)== LOW)
     {
       if(millis() - startTime > 100){
         startTime = millis();
         adjustTime(stepSecs[stepIndex] * direction);
#ifdef DISPLAY_HEIGHT < 64
// перерисовываем циферблат:
         analogClock.DrawFace();
#endif
         analogClock.DisplayTime(hour(), minute(), second() ); // update analog clock  
         if( ++step > 30){
            step=0;
            if(stepIndex < 2){
               stepIndex++; 
            }
         }        
       }
     } 
  }   
}

См.также

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