Arduino:Примеры/clockFace
Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску
Содержание | Знакомство с Arduino | Продукты | Основы | Справочник языка Arduino | Примеры | Библиотеки | Хакинг | Изменения | Сравнение языков Arduino и Processing |
Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.
Аналоговые часы[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++;
}
}
}
}
}
}