Tau

personal lab:  Искусство перпендикулярного хвоста

 Часы на Arduino и TFT

19.05.13

Постройкой часов я решил заняться не просто так, а по суровой необходимости. Дело в том, что:
а) существующие будильники имеют странное кнопочное управление (и поэтому запутанное и неудобное)
б) для установки времени срабатывания на будильнике могут потребовать раз сто нажать на кнопки.
Кроме того, пищащие будильники я во сне не слышу или подсознательно игнорирую их писк.

Итак, будильник сделан из трех «деталей»: Ардуино Мега, TFT Sheld и зуммер. Зуммер подключается на пин 10 ардуины (но это можно, при необходимости, поменять в скетче).

Основные режимы часов: показ времени и даты, корректировка времени и даты, настройка будильников. Управление часами — путем тыка пальцем в дисплей.

Показ времени и даты
Практически все время часы находятся именно в этом режиме.

Снизу расположено меню управления.
Hide — отключение дисплея (например, в ночное время). Обратно включается повторным касанием дисплея пальцем
Set — настройка времени и даты
Alarm — настройка будильников

Настройка времени и даты

Для корректировки времени необходимо ткнуть пальцем в ту цифру, которую необходимо откорректировать, и ввести нужную

Желтым квадратиком обозначена та позиция, которая сейчас корректируется (чтобы не было ситуаций «забыл на какую позицию ткнул»).
Меню управления настройкой:
Save — сохранить выставленное время/дату и выйти
Date/Time — Переключение между датой и временем
Exit - выход без сохранения

С датой все аналогично:

Защитой от дурака настройка времени не обладает — т.е. можно выставить и 36:97 как время. Поэтому предполагается, что нормальный человек такого делать не будет. А кто будет — тот сам себе злобный буратино.

Настройка будильников

В часах есть три будильника
А — срабатывает только по рабочим дням (т.е. с понедельника по пятницу)
B — срабатывает ежедневно
C — «однократный» будильник. После срабатывания он отключается и для следующего срабатывания его нужно снова включить
Установка времени для будильника аналогично установке времени

Save — сохранить и выйти
On/Off — Включить/выключить будильник
Exit — выход без сохранения

Срабатывание будильника
При срабатывании будильника время показывается красным, звук отключается либо касанием, либо по достижении конца мелодии
Если есть желание заменить мелодия, то для этого нужно взять midi-файл с понравившейся мелодией и обработать его программой miditones с ключом -t1. Полученный текстовый файл можно вставить в файл adjee.ino вместо «ненужной» мелодии (мелодии именуются score, score2 и score3 для будильников A, B и C соответственно).

Нюансы:
1. Чтобы Hide работал, необходима поддержка контроллером дисплея функции отключения.
Если контроллер поддерживает эти функции, то необходимо откорректировать в файле UTFT.cpp (библиотека UTFT) функции lcdOn и lcdOff, прописав необходимую последовательность кодов
Для моего дисплея получилось так:

void UTFT::lcdOff()
{
cbi(P_CS, B_CS);
LCD_Write_COM(0x28);
delay(5);
sbi(P_CS, B_CS);
}

void UTFT::lcdOn()
{
cbi(P_CS, B_CS);
LCD_Write_COM(0x29);
delay(5);
sbi(P_CS, B_CS);
}

2. Время считается с помощью встроенной функции millis. Но millis переполняется каждые 49 дней, и что в этот момент будет с часами — непонятно. Возможно, собьется время и его придется корректировать
3. Время считается только в основном режиме. В режиме установки не считается, поэтому при выходе из установки время начинает считаться в три раза быстрее, чтобы догнать правильное время. Несколько смешной момент, но его в некоторых случаях надо учитывать

Программа (скетч) для будильника: (xclk)
Использовались дополнительные библиотеки UTFT, UTouch. Их надо скачать самостоятельно и разместить в каталоге library среды разработки Arduino. Библиотеку Playtune пришлось допиливать, поэтому она прилагается к скетчу (т.е. ее не надо скачивать, а просто скопировать в каталог library среды разработки Arduino)
Часть кода часов была взята вот отсюда и из примеров UTouch, остальное пришлось дописывать самому

Вариант с поддержкой RTC (Real time clock)
К часам можно подключить модуль RTC. Тогда при (внезапном) отключении электричества текущее время не сбросится, а продолжит считаться модулем RTC. Подключается RTC штатным способом — к пинам 20 (SDA) и 21 (SCL).
Скетч часов с поддержкой RTC (rclk). Дополнительно потребуется библиотека RTClib.
Если при запуске часов RTC не найден, на дисплее появится ошибка «RTC error», но часы продолжат работать (но уже в режиме «без поддержки RTC»)

ps. На самом деле я не настоящий ардуинщик и в ардуинах (и прочих микроконтроллерах) мало чего понимаю. Поэтому большая просьба — не надо со мной консультироваться по возникшим проблемам, ничего умного и хорошего я не скажу

 [ L ]