Крутые часы на адресных диодах (часть 3)
Часть 3. Прошивка, настройка и алгоритмы работы
В архиве проекта я собрал готовую прошивку, используемые библиотеки, а также статью с оригинальным проектом (к сожалению, сейчас она недоступна онлайн). Кроме того, там же лежит сканер шины I2C (на случай, если модуль часов или датчик освещённости будут использовать нестандартные адреса).
AttentionВнимание! Библиотека «MicroLED», написанная AlexGyver’ом, получила обновление (на момент написания статьи — до 3 версии). Однако обновлённая версия ломает прошивку, так как в ней были изменены алгоритмы указания цвета ленты.
В обновлённой версии добавлены функции, которые не используются в данном проекте, и обновлять библиотеку без переписывания кода нельзя.
Перед прошивкой я рекомендую настроить модуль bluetooth, а именно задать ему имя и пароль, а также проверить скорость обмена порта.
Можно оставить настройки по умолчанию (пароль 1234 или 0000), имя также будет стандартное.
В процессе работы над этим и другим проектом у меня в руках оказалось два модуля bluetooth (которые, конечно же, были куплены у наших азиатских друзей), установить модель которых возможным не представилось. Кроме того, они были у меня в руках в разное время, и я не смог их сравнить по внешнему виду. Однако особенности их настройки отличались (я полагаю, что это были HC-05 и HC-06).
Итак, для начала нужно соединить модуль bluetooth и arduino следующим образом:
Arduino | Bluetooth |
Pin 2 | TX |
Pin 3 | RX |
5V | VCC |
GND | GND |
В некоторых статьях встречаются схемы подключения с резисторами, однако всё это лишнее. Модуль настраивается AT-командами через указанный скетч.
Далее заливаем в arduino скетч «BluetoothAT» из архива, открываем монитор порта, выставляя настройки возврата каретки «CR&NL» и вводим следующее:
AT+BAUD4 (устанавливаем скорость обмена 9600 (проверяем, что с настройках порта стоит аналогичная)
AT — должны получить в ответ «ОК». Это значит, что связь с модулем настроена и работает правильно
Далее в зависимости от модели модуля могут потребоваться следующие команды:
Узнать имя | AT+NAME | AT+NAME? |
Узнать пароль | AT+PSWD | AT+PSWD? |
Установить новое имя | AT+NAME=Имя | AT+NAMEname |
Установить новый пароль | AT+PSWD:»9999» | AT+PINpass |
После настройки модуля можно прошивать arduino прошивкой часов подключать bluetooth к выходам RX и TX.
Внимание! Модуль bluetooth подключается на выходы RX и TX платы только после загрузки прошивки. В противном случае прошивка не загрузится!
После того как прошивка загружена в плату, плату можно устанавливать в шилд и подавать питание. При включении часы должны показать красивую анимацию (которая одновременно показывает правильность подключения ленты), после чего перейдут в режим отображения времени.
Для управления часами с телефона я использовал бесплатную программу «Serial Bluetooth Terminal». Она удобная, и позволяет сделать «горячие» кнопки на определённые команды.
В программе в настройках в разделе «Send» параметру «Newline» устанавливаем значение «CR» (это важно). Остальные настройки — по желанию.
Как я уже писал ранее, данные часы висят у меня на работе, в связи с чем алгоритмы работы подстроены именно под них, а именно:
Часы знают время начала и окончания рабочего дня;
Рабочий день в пятницу на один час короче;
Выходные дни;
Время обеда.
При этом время начала и окончания рабочего дня можно настроить с телефона, время обеда - только в прошивке.
Алгоритмы работы и настройка
Обед
# Вкладка "functions", функция "LedColor()"
if (time.Hours == 13 && time.weekday != 0 && time.weekday != 6) { //Обед
ledColor = GREEN;
}
else if (time.Hours == 12 && time.minutes >= 40 ) { //Почти обед
ledColor = LIME;
}
Как видно в функции выше, обеденное время начинается по будням в 13:00 и длится до 14:00. В это время часы меняют свой цвет на зелёный (по умолчанию они синие). Кроме того, за 20 минут до начала обеденного времени, часы также меняют свой цвет на оттенок зелёного.
При желании выставить иные интервалы — их нужно изменить здесь.
Скоро домой
else if (time.weekday != 5 && (time.Hours == (endWorkHours - 1) && time.minutes >= endWorkMinutes) || time.Hours == endWorkHours && time.minutes < endWorkMinutes) {
ledColor = OLIVE; //Скоро домой (не пятница)
}
За час до окончания рабочего дня часы также меняют свой цвет (в данном случае — на оливковый).
Параметры «startWorkHours» и «endWorkHours» хранятся в EEPROM (энергонезависимой памяти) и устанавливаются после прошивки (в любое время через Bluetooth).
В рабочее время часы отображают время синим цветом, в нерабочее (включая выходные) — красным, в обеденное время — зелёным, за час до окончания рабочего времени — оливковым.
Команды управления
info
— выводит в терминал показания датчиков и переменных начала и конца рабочего дня. Позволяет проверить корректность работы датчиков
setdate
— корректировка даты. После ввода команды в терминал будет выведены соответствующие подсказки. Время на ввод каждого параметра — 5 секунд. Требуется ввести число, номер месяца, две цифры года, а также день недели (воскресенье = 0, понедельник = 1…).
settime
— корректировка времени. Аналогично параметрам установки даты, в терминал выводятся подсказки, время на ввод параметров — 5 секунд. От пользователя требуется ввести часы и минуты, секунды обнуляются.
demo
— запуск демонстрационного режима (аналогичный режим запускается при включении часов). Позволяет проверить работу всей ленты или продемонстрировать её возможности
check
— запуск функций проверки датчиков освещённости и температуры. Часы принудительно отобразят текущую температуру, а также произойдёт принудительная корректировка яркости ленты в соответствии с освещённостью
setworktimes
— установка времени (часов и минут) начала и окончания рабочего дня. Время на ввод каждого параметра — 5 секунд. Время устанавливается один раз, настройки хранятся в энергонезависимой памяти (при выключении часов сохраняются). Пятница автоматически уменьшает рабочий день на 1 час.
setbright
— корректировка коэффициента яркости. Хранится в энергонезависимой памяти и может принимать как положительные, так и отрицательные значения. Подбирается экспериментально в зависимости от условий размещения часов. У меня равен 5.
Все команды не чувствительны к регистру. При вводе текста, не соответствующего команде, текст будет выведен назад в терминал.
В обычном режиме часы один раз в минуту (с 29 по 31 секунду) отображают текущую температуру, а также раз в 10 секунд регулируют яркость в соответствии с освещённостью.
Температура округляется по математическим правилам округления до целого числа.
Яркость ленты регулируется плавно на основании данных датчика освещённости:
— Если темно, то лента светит минимальной яркостью;
— Если есть хотя бы минимальный источник света, то яркость ленты устанавливается равной полученному значению датчика освещённости плюс коэффициент корректировки. При этом яркость ленты ограничена значением 210 (максимально возможная яркость — 256).
— В случае, если датчик работает некорректно — устанавливается значение яркости, равное 30 (константа max_bright
в начале прошивки).
Следует отметить, что в прошивке указывается количество диодов и тип ленты. Таким образом, при использовании других исходных данных, прошивка потребует внесения изменений как в параметры ленты и количества диодов, так и алгоритмов формирования цифр.
В заключение хочу добавить, что я не претендую на красоту или абсолютную правильность написания кода: любой желающий может его модифицировать на своё усмотрение.
Мне достаточно того, что часы работают без зависаний, меняют яркость и цвет без зависаний (в прошлой версии прошивки случались казусы, и функции были переписаны с нуля).
Ограничения по току, прерывания, и даже энергосбережение — это всё, конечно же, можно реализовать, только стоит задаться вопросом:, а зачем всё это именно в этом проекте?
Ведь это всего лишь часы.