ARDUINO Часы на ГРИ. Альтернативная прошивка

Sergo_ST

★★★★★★✩
15 Мар 2020
1,093
884
Альтернативная прошивка для различных проектов часов на ГРИ под 4/6 ламп.
Имеет большую гибкость настройки и немалый функционал на борту.

Актуальная версия прошивки находится здесь. Последняя версия 2.2.8 от 18.09.2025.

Видео-обзор прошивки:
Для настройки прошивки под другую разводку плат, отличающуюся от "Часов на ГРИ v2", необходимо указать пины подключения периферии в "connection.h" и настроить используемую периферию в "userConfig.h", "config.h".

Поддерживаются:
  • MH2024K-24*
  • GD3200B
  • YX5200-24
  • AB23A797393.1-74
  • AB23A795250.1-74
  • AA19HFF859-94
  • TD5580A
Не поддерживаются:
  • MH2024K-16
  • AS21CN27OC
*Возможна задержка между фразами!
Connecting peripherals.png
Wireless_Sensor.png
Периферия:
  • Датчики температуры DHT11/DHT12/MW33/DHT21/DHT22(AM2301/AM2302), DS18B20/DS18S20/DS1820(поддержка отрицательных температур) - доступные пины подключения(D0..D13) с подтяжкой 4.7-10кОм к +5в.
  • Датчик температуры BME280(BMP085/180/280) - доступные пины подключения(A4 и A5) параллельно модулю часов.
  • Датчик температуры SHT20(SHT21/SHT25), SHT30(SHT31/SHT35) - доступные пины подключения(A4 и A5) параллельно модулю часов.
  • Датчик температуры AHT10(AHT15), AHT20 - доступные пины подключения(A4 и A5) параллельно модулю часов.
  • Датчик температуры DS3231 - встроенный в модуль часов реального времени.
  • Синхронизация времени по SQW - доступные пины подключения(D2).
  • Управление разделительными точками в индикаторах ИН12Б/14/16 - доступные пины подключения(D0..D13), для каждой точки используется свой пин.
  • Радиоприёмник RDA5807M - доступные пины подключения(A4 и A5) параллельно модулю часов.
  • Неоновая секундная точка(одна или две) - доступные пины подключения(D0..D13), для каждой точки используется свой пин.
  • Бузер(Для будильника и оповещений) - доступные пины подключения(D0..D13).
  • Подсветка на адресных светодиодах WS2812B - доступные пины подключения(D0..D13).
  • Подсветка на обычных светодиодах - доступные пины подключения(D11), с софт. шимом(D0..D13).
  • Дополнительная цифровая кнопка для управления таймером - секундомером - доступные пины подключения(D0..D13).
  • Преобразователь ВВ напряжения(Затвор мосфета) - доступные пины подключения(D9..D10).
  • Аналоговые кнопки(в т.ч. и дополнительная) - доступные пины подключения(A6..A7).
  • Обратная связь преобразователя ВВ напряжения на резистивном делителе(АЦП или компаратор) - доступные пины подключения(для АЦП)(A6..A7)(для компаратора)(только пин D7).
  • Озвучка на DF player - доступные пины подключения указаны в прошивке.
  • Озвучка на SD карте - доступные пины подключения указаны в прошивке.
  • Управление питанием усилителя - доступные пины подключения(D0..D13).
  • Приемник ИК пульта(Пульты только с протоколом NEC) - доступные пины подключения(D0..D13).
  • Датчик яркости освещения - доступные пины подключения(A6..A7).
  • Датчик движения - доступные пины подключения(D0..D13).
  • Сдвиговый регистр для управления анодами ламп и разделительными точками(неоновыми лампами) - доступные пины подключения указаны в прошивке.
  • Модуль ESP8266 - доступные пины подключения(A4 и A5) параллельно модулю часов.
Программно:
  • Поддержка часов на 4/6 ламп.
  • 12/24 часовой формат времени.
  • Переход на летнее/зимнее время(Только при использовании есп).
  • Будильник(Один или несколько).
  • Радиобудильник(При наличии модуля радио).
  • Автоматическое определение подключенного датчика температуры(Если выбрано несколько датчиков).
  • Второй датчик температуры(DHTxx или DS18x20) для "Улицы"(Требуется наличие есп).
  • Беспроводной WiFi датчик температуры(Требуется наличие есп).
  • Авто-показ температуры(Влажности/Давления).
  • Авто-показ даты/года.
  • Отображение метеоданных из погодного сервиса(Требуется наличие есп).
  • Отображение текущей температуры/давления/влажности.
  • Отображение текущей даты/года.
  • Режим сна(Отключение ламп через заданное время).
  • Упрощённый режим управления в режиме часов.
  • Меню настройки яркости и др. функций.
  • Быстрое меню для выбора анимации смены минут(секунд)/точек/подсветки.
  • Таймер - секундомер(Только при наличии доп. кнопки).
  • Радиоприёмник(Только при наличии доп. кнопки или есп).
  • Антиотравление ламп(3 варианта анимации, выбор из меню).
  • Мелодия смены часа(Или озвучка при использовании плеера).
  • Озвучка пунктов меню, времени и температуры.
  • Смена яркости по времени и по датчику освещённости.
  • Анимация глюков.
  • 10 режимов анимации авто-показа(Есть случайный режим).
  • 10 режимов анимации минут(Есть случайный режим).
  • 3 режима анимации секунд для 6-ти ламп.
  • 3 режима подсветки для обычных диодов и 15 для адресных WS2812B.
  • 5 режимов работы секундных точек и 2 для двух неоновых ламп / 6 для разделительных точек.
  • Возможность создания собственных мелодий будильника.
  • Система контроля основных параметров часов(Ошибки).
  • Меню отладки(Для опытных пользователей).
  • Программирование кнопок ИК пульта из меню отладки.
  • Веб-интерфейс для настройки и мониторинга(Требуется наличие есп).
  • Обновление прошивки часов через веб интерфейс(Требуется наличие есп).
  • Автоматическое обнаружение других часов в локальной сети wifi(Требуется наличие есп).
  • Добавить возможность выбора перехода на зимнее/летнее время в часах.
  • Добавить возможность воспроизводить музыку.
  • Добавить поддержку декатрона вместо секундных неонок.
  • Добавить поддержку статической индикации.
  • Добавить поддержку динамической индикации на двух К155ИД1.

Так-же не забудьте выбрать свою плату в "userConfig.h" - BOARD_TYPE.
Для других ламп(плат) используйте - BOARD_TYPE 3.
Маска дешефратора и порядок катодов указываются в "config.h".

Для сброса настроек -
необходимо зажать среднюю кнопку и подать питание на часы.
Для запуска меню отладки - необходимо зажать левую кнопку и подать питание на часы.
Для запуска теста системы(ламп тест) - необходимо зажать правую кнопку и подать питание на часы.

Если при работе часов возникла какая-то проблема, то при старте часов будет звуковой код, а на индикаторах отобразится код ошибки:
  • 0001 - Нет связи с модулем DS3231(модуль часов неисправен или проблемы с шиной i2c).
  • 0002 - Сбой осциллятора DS3231(батарейка модуля часов разряжена или проблемы с тактированием модуля часов).
  • 0003 - Слишком короткий сигнал SQW(во время работы часов были обнаружены помехи или неверный сигнал на SQW).
  • 0004 - Слишком длинный сигнала SQW(пропал сигнал SQW во время работы часов или сигнал отсутствовал при запуске).
  • 0005 - Выбранный датчик температуры не обнаружен(проверить подключение датчика температуры).
  • 0006 - Слишком низкое или слишком высокое напряжение питания(проверить источник питания).
  • 0007 - Сбой памяти EEPROM(повреждение данных, если ошибка будет повторятся слишком часто - износ EEPROM).
  • 0008 - Софтовая перезагрузка(говорит о нестабильности программы или об аппаратных проблемах с мк).
  • 0009 - Сбой работы преобразователя(регистры таймера были неожиданно изменены).
  • 0010 - Переполнение заполнения шим преобразователя(превышен верхний предел заполнения шим).
  • 0011 - Переполнение стека(утечка памяти).
  • 0012 - Переполнение тиков времени(основная программа не отвечает).
  • 0013 - Сбой работы динамической индикации(регистры таймера были неожиданно изменены или превышен предел регистра сравнения).
Если по какой-то причине нету сигнала от SQW или если во время работы сигнал он выйдет за рамки то часы перейдут на внутренний источник тактирования и по возможности будут синхронизироваться с модулем часов.
Для синхронизации хода секунд желательно подключить пин SQW модуля DS3231 к пину ардуино D2, если у вас модуль DS3231mini, то необходимо найти 3-ю ножку микросхемы и также проводком подпаять к пину D2.

Доработка DS3231.jpg
  • NEON_DOT 0 - Обычная светодиодная секундная точка(пин подключения указывается в DOT1_PIN)(возможно комбинирование с точками в индикаторах)
  • NEON_DOT 1 - Одна неоновая лампа в качестве секундной точки(пин подключения указывается в DOT1_PIN)(возможно комбинирование с точками в индикаторах)
  • NEON_DOT 2 - Две неоновые лампы в качестве секундных точек(пин подключения указывается в DOT1_PIN и DOT2_PIN)(возможно комбинирование с точками в индикаторах)
  • NEON_DOT 3 - Точки в индикаторах в качестве секундных точек(пин подключения указывается в DOTL_PIN и DOTR_PIN)
Пины подключения периферии к сдвиговому регистру указываются в connection.h: ANODE_1_PIN..ANODE_6_PIN, DOTL_PIN, DOTR_PIN, DOT_1_PIN, DOT_2_PIN. Доступные номера пинов 0..7.
  • Аноды ламп.
  • Разделительные точки в индикаторах.
  • Две раздельные неоновые лампы.
  • Одну неоновую лампу.
При использовании сдвигового регистра есть ограничения на пины D13-D10, а именно:
  • D13 может быть использован только как пин сдвигового регистра - SCK.
  • D12 может быть использован для остальной периферии в качестве входа(цифровые кнопки, датчик движения, ИК приёмник, BUSY DF плеера, MISO SD карты).
  • D11 может быть использован только как пин сдвигового регистра - DATA.
  • D10 может быть использован для остальной периферии в качестве выхода(ВВ преобразователь, секундные точки, подсветка, бузер, управление питанием усилителя, RX DF плеера при использовании софтового UART, MOSI/SCK/CS SD карты, защёлка сдвигового регистра).

Модуль ESP8266 подключается к шине I2C, пины которые модуль ESP8266 использует в качестве SCL/SDA нужно указать в прошивке модуля ESP8266. При использовании модуля ESP8266 подтяжка шины I2C должна быть организована к источнику 3.3в!
Питать модуль ESP8266 от вывода 3.3 ардуино нельзя! Нужно использовать линейный стабилизатор или DC-DC преобразователь на 3.3в!
Инструкцию по загрузке прошивки и файловой системы смотрите в шапке прошивки веб интерфейса.


Обновление прошивки часов через веб интерфейс возможна только после записи кастомного загрузчика!
Порядок записи нового загрузчика(потребуется isp программатор и программа avrdude_prog):
  1. Записываем кастомный загрузчик который идёт с прошивкой(i2c_bootloader_v2.hex).
  2. Настраиваем фьюзы(выставить вручную по картинке в папке загрузчика).
  3. Загружаем прошивку в есп(по UART).
  4. Компилируем прошивку часов(нужно выбрать плату "Arduino UNO").
  5. Экспортируем прошивку часов в hex(скетч -> экспорт бинарного файла).
  6. Заходим в веб интерфейс, вкладка "Обновление", загружаем файл прошивки часов(который без подписи "with_bootloader")(поддерживаемые расширения файла - .hex).
  7. Зажимаем кнопку ресет на мк часов(нужно только при первой загрузке прошивки или при нештатной ситуации).
  8. Ждём появления окна о начале загрузки прошивки(появится надпись "Подключение...").
  9. Отпускаем кнопку ресет на мк часов(появится надпись "Загрузка...").
  10. Ждём окончания загрузки(появится надпись "Загрузка прошивки завершена").
Внимание! После записи кастомного загрузчика прошивать часы нужно только через веб интерфейс, запись прошивки часов через программатор затрет загрузчик!
web1.pngweb2.pngweb3.pngweb4.pngweb5.pngweb6.pngweb7.pngweb8.pngweb9.pngweb10.pngweb11.pngweb12.pngweb13.png
  • После включения питания часов автоматически создаётся точка доступа "NixieClockAP"(после подключения к роутеру отключится через 5 мин).
  • С любого устройства(Смартфон, ПК и пр.) ищем сеть "NixieClockAP" и подключаемся к ней(Пароль по умолчанию 1234567890).
  • Далее с этого же устройства в браузере пишем в адресной строке: http://192.168.4.4/
  • Далее переходим во вкладку «Сетевые настройки» и в блоке «Локальная сеть WIFI» выбираем свой роутер из списка и вводим пароль(если нужной сети нет или ваша сеть скрыта, необходимо нажать на ссылку "Ручной режим").
  • При успешном соединении с роутером будет выдан IP адрес для доступа к веб интерфейсу по локальной сети(Далее всё управление в локальной сети будет именно по этому адресу).

Отладка: Удерживать "левую" кнопку при включении питания
Ввод пароля:
  • Клик по "средней кнопке" - переход между разрядами
  • Клик по "левой кнопке" - уменьшить значение
  • Клик по "правой кнопке" - увеличить значение
  • Удержать "среднюю кнопку" - подтвердить ввод пароля
Меню отладки:
  • Клик по "средней кнопке" - выбор пункта отладки
  • Клик по "левой кнопке" - уменьшить значение
  • Клик по "правой кнопке" - увеличить значение
  • Удержать "среднюю кнопку" - выход к часам
Пункты отладки:
  • 01 - Коррекция хода часов DS3231(Коррекция (0..255)(128 = 0))
  • 02 - Коррекция хода внутреннего осциллятора(Коррекция (2000..4000)(мкс))
  • 03 - Минимальное значение шим(Для линейной регулировки)(100..150)
  • 04 - Максимальное значение шим(Для линейной регулировки)(150..200)
  • 05 - Коррекция напряжения преобразователя(Для регулировки по обратной связи)(Внимание! Значение может меняться в зависимости от напряжения питания)(+-30)
  • 06 - Программирование кнопок ИК пульта(Поддерживаются пульты только с протоколом NEC)(1..8)
  • 07 - Калибровка датчика освещенности(Автоматическое определение диапазона)
  • 08 - Сброс настроек отладки(0..1)(0 - отмена | 1 - подтверждение)
  • Войти в режим отладки(удерж. левой кнопки при подаче питания).
  • Выбрать пункт меню отладки 07(калибровка датчика освещенности).
  • Поставить часы в светлое место(на 1-3 сек).
  • Поставить часы в тёмное место(на 1-3 сек).
  • Клик средней кнопкой(выйти к выбору пунктов меню отладки).
  • Удержание средней кнопки(выйти из меню отладки и сохранить настройки).
Управление:
  • Клик по "средней кнопке" - выйти из режима программирования кнопок ИК пульта
  • Клик по "левой кнопке" - уменьшить значение номера кнопки ИК пульта
  • Клик по "правой кнопке" - увеличить значение номера кнопки ИК пульта
  • Удержать "среднюю кнопку" - сбросить текущую кнопку ИК пульта

Нумерация кнопок:
  • 1 - Левая клик.
  • 2 - Левая удержание.
  • 3 - Правая клик.
  • 4 - Правая удержание.
  • 5 - Средняя клик.
  • 6 - Средняя удержание.
  • 7 - Доп.кнопка клик.
  • 8 - Доп.кнопка удержание.
  • 9 - Вкл/выкл питание радио.
  • 10 - Прибавить громкость радио.
  • 11 - Убавить громкость радио.
  • 12 - Переключить на следующую радиостанцию.
  • 13 - Переключить на предыдущую радиостанцию.
  • 14..23 - Переключить на ячейку памяти радиостанции 0..9

Настройка времени: Удерживать "правую" кнопку
  • Средняя кнопка - выбор, остальные "меньше" и "больше"
  • Клик по "выбору" - смена настройки часы/минуты | месяц/дата | год
  • Клик "меньше" или "больше" - изменение времени/даты
  • Удержать "выбор" - возврат к режиму часов

Настройка будильника: Удерживать "левую" кнопку
В режиме часов удержание левой клавиши – переход к настройке будильников.
После входа в настройку:
  • В левых двух разрядах отображается текущий номер будильника (0 – нет будильников).
  • В четвёртом разряде отображается текущий режим будильника (если будильников нет – ничего не отображается).
Экран «Выбор номера будильника»
Нажатие на:
  • Правую клавишу – увеличивает значение.
  • Левую клавишу – уменьшает значение.
  • Среднюю клавишу - переход к настройке выбранного будильника.
Удержание:
  • Правой клавиши – добавить новый будильник.
  • Левой клавиши – удалить текущий будильник.
  • Средней клавиши – выход к режиму часов.
После перехода к настройке будильника:
  • Средняя кнопка - выбор, остальные "меньше" и "больше".
  • Клик по "выбору" - перемещение по индикаторам.
  • Клик "меньше" или "больше" - изменение значений.
  • Удержать "меньше" или "больше" - смена настройки часы/минуты -> режим -> день недели/активация -> громкость(для плеера)/мелодия.
  • Удержать "выбор" - возврат к выбору будильника.
  • Удержать "доп. кнопку" - переключить режим мелодия/радио.
В режиме часов удержание левой клавиши – переход к настройке будильников.
После входа в настройку:
  • Средняя кнопка - выбор, остальные "меньше" и "больше".
  • Клик по "выбору" - перемещение по индикаторам.
  • Клик "меньше" или "больше" - изменение значений.
  • Удержать "меньше" или "больше" - смена настройки часы/минуты -> режим -> день недели/активация -> громкость(для плеера)/мелодия.
  • Удержать "выбор" - возврат к режиму часов.
  • Удержать "доп. кнопку" - переключить режим мелодия/радио.
Для начала нужно создать новый массив мелодии и прописать его в основном массиве всех мелодий(в config.h):
C++:
const uint16_t _sound_2[][3] PROGMEM = { //массив семплов 2-й мелодии будильника || семпл - частота(10..10000)(Hz) | длительность звука(50..500)(ms) | длительность паузы(50..1000)(ms)

};
const uint16_t alarm_sound[][2] = {  //массив мелодий будильника
  SOUND_PATTERN(_sound_1),
  SOUND_PATTERN(_sound_2)
};
Затем в массив добавить патерны:

C++:
const uint16_t _sound_2[][3] PROGMEM = { //массив семплов 2-й мелодии будильника || семпл - частота(10..10000)(Hz) | длительность звука(50..500)(ms) | длительность паузы(50..1000)(ms)
   {392, 700, 700}, //можно добавлять n-е количество
};
Патерн состоит из 3-х значений:
C++:
const uint16_t _sound_2[][3] PROGMEM = { //массив семплов 2-й мелодии будильника || семпл - частота(10..10000)(Hz) | длительность звука(50..500)(ms) | длительность паузы(50..1000)(ms)
  {/*Частота звука*/, /*Длительность звука*/, /*Пауза звука*/},
};
  • Частота звука(в герцах)
  • Длительность звука(в мс)
  • Пауза звука между патернами(в мс):
    Если равно длительности звука: паузы не будет.
    Если больше: пауза звука = (пауза звука - длительность звука).
  • 00 - выключен
  • 01 - однократный
  • 02 - каждый день
  • 03 - по будням
  • 04 - выбор по дням недели

Основные настройки: Удерживать "среднюю" кнопку
  • Клик по "средней кнопке" - переход в пункт меню для настройки/выход к выбору пункта меню
  • Клик "левой кнопке" или "правой кнопке" - выбор пункта меню
  • Удержать "среднюю кнопку" - возврат к режиму часов
  • Удержать "левую кнопку" или "правую кнопку" - выбор подпункта меню.
Пункты меню:
  • 01 - Бузер(Формат времени(12ч | 24ч)), Плеер(Формат времени(12ч | 24ч) : Глюки(0 - выкл | 1 - вкл))
  • 02 - Бузер(Глюки(0 - выкл | 1 - вкл)), Плеер(Громкость озвучки : Голос озвучки (0 - Алёна | 1 - Филипп))
  • 03 - Бузер(Звук кнопок(0 - выкл | 1 - вкл)), Плеер(Озвучка часа(Температура/Новый час) : Озвучка действий(0 - выкл | 1 - вкл))
  • 04 - Время звука смены часа(Начало : Конец)(Выключить звук смены часа: начало = конец)
  • 05 - Время смены яркости(Ночь : День)(Выключить смену яркости(включить датчик освещения): ночь = день)
  • 06 - Яркость индикаторов(Ночь : День)
  • 07 - Яркость подсветки(Ночь : День)
  • 08 - Яркость секундных точек(Ночь : День)
  • 09 - Коррекция датчика температуры(Коррекция : Сенсор(только отображение))
  • 10 - Настройка интервала и анимации автоматического отображения(Время в минутах(0 - выключить) : Анимация)
  • 11 - Настройка интервала и анимации антиотравления индикаторов(Время в минутах : Анимация)
  • 12 - Установка времени ожидания после выхода из сна(Ночь : День)(0 - выключить)

Таймер/секундомер: Клик по "дополнительной" кнопке
  • Клик по "дополнительной кнопке" - пуск/пауза
  • Клик по "средней кнопке" - вход в настройку таймера(только в режиме таймера)
  • Клик по "левой кнопке" или Удержать "левую кнопку" - режим секундомера
  • Клик по "правой кнопке" или Удержать "правую кнопку" - режим таймера
  • Удержать "дополнительной кнопку" - сброс таймера/секундомера
  • Удержать "среднюю кнопку" - возврат к режиму часов(таймер продолжает работать в фоне, секундомер ставится на паузу)

Настройка таймера: В режиме таймера - Клик по "средней" кнопке
  • Клик по "средней кнопке" - переключение разрядов ММ:СС(максимум 99:59)
  • Клик по "левой кнопке" - уменьшить значение
  • Клик по "правой кнопке" - увеличить значение
  • Удержать "среднюю кнопку" или Удержать "дополнительной кнопку" - выход к таймеру

Радиоприёмник: Удерживать "дополнительную" кнопку(или клик по "дополнительной" кнопке, если таймер/секундомер отключен)
  • Клик по "дополнительной кнопке" - переключить ячейку памяти радиостанций
  • Клик по "средней кнопке" - настройка громкости(текущая громкость):
    • Клик по "левой/правой кнопке" - изменить громкость.
    • Клик по "средней кнопке" - выход к часам(радио останется включенным).
    • Клик по "дополнительной кнопке" - вернуться к радио.
  • Клик по "левой/правой кнопке" - изменить текущую частоту
  • Удержать "дополнительной кнопку" - настройка ячеек памяти радиостанций(запись в ячейке : номер ячейки):
    • Клик по "левой/правой кнопке" - выбрать номер ячейки.
    • Клик по "дополнительной кнопке" - сохранить текущую частоту в выбранную ячейку.
    • Удержать "дополнительной кнопку" - удалить данные из выбранной ячейки.
  • Удержать "среднюю кнопку" - выход к часам(радио выключится)
  • Удержать "левую/правую кнопку" - авто поиск станций вниз/вверх

Управление кнопками В РЕЖИМЕ ЧАСОВ:
  • Клик по "правой" кнопке отображает текущую дату, затем клик по "правой" кнопке переключает дату/год.
  • Клик по "средней" кнопке отображает текущий режим секундных точек, затем:
    • Клик по "правой" кнопке - переключает режим анимации смены минут(0 - выкл, 1 - случайная анимация, 2 - плавное угасание и появление , 3 - перемотка по порядку числа, 4 - перемотка по порядку катодов в лампе, 5 - поезд, 6 - резинка, 7 - ворота, 8 - волна, 9 - блики, 10 - испарение | 11 - игровой автомат)
    • Удержание "правой" кнопки во время отображения режима анимации смены минут(если нет дополнительной кнопки) - переводит в режим установки анимации смены секунд, выбор анимации осуществляется "правой" кнопкой.
    • Клик по "левой" кнопке переключает режим подсветки -
      • Для обычных светодиодов: (0 - выкл | 1 - статичная | 2 - динамичная(дыхание))
      • Для адресных светодиодов: (0 - выкл | 1 - статичная | 2 - дыхание | 3 - дыхание со сменой цвета при затухании | 4 - бегущий огонь | 5 - бегущий огонь со сменой цвета | 6 - бегущий огонь с радугой | 7 - бегущий огонь с конфетти | 8 - волна | 9 - волна со сменой цвета | 10 - волна с радугой | 11 - волна с конфетти | 12 - плавная смена цвета | 13 - радуга | 14 - конфетти)
    • Удержание "левой" кнопки во время отображения режима подсветки(для адресных светодиодов) - переводит в режим установки цвета, выбор цвета осуществляется "левой" кнопкой(войти можно только в режимах поддерживающих смену цвета - статичная, дыхание, бегущий огонь, волна)
    • Клик по "средней" кнопке:
      • NEON_DOT 0..1 - (0 - выкл | 1 - статичная | 2 - мигает один раз в секунду | 3 - мигает два раза в секунду | 4 - динамичная(плавно мигает)), (для точек в индикаторах)(5 - мигающая | 6 - бегущая | 7 - змейка | 8 - резинка | 9 - одинарный маятник(только для 6-ти ламп или если используются левые и правые точки) | 10 - двойной маятник(только для 6-ти ламп и если используются левые и правые точки))
      • NEON_DOT 2 - (0 - выкл | 1 - статичная | 2 - мигает один раз в секунду | 3 - мигает два раза в секунду | 4 - динамичная(плавно мигает) | 5 - маятник(мигает один раз в секунду) | 6 - маятник(плавно мигает)), (для точек в индикаторах)(7 - мигающая | 8 - бегущая | 9 - змейка | 10 - резинка | 11 - одинарный маятник(только для 6-ти ламп или если используются левые и правые точки) | 12 - двойной маятник(только для 6-ти ламп и если используются левые и правые точки))
      • NEON_DOT 3 - (0 - выкл | 1 - статичная | 2 - мигает один раз в секунду | 3 - мигает два раза в секунду | 4 - мигающая | 5 - бегущая | 6 - змейка | 7 - резинка | 8 - одинарный маятник(только для 6-ти ламп или если используются левые и правые точки) | 9 - двойной маятник(только для 6-ти ламп и если используются левые и правые точки))
    • Клик по "дополнительной" кнопке - переключает режим анимации смены секунд(0 - выкл, 1 - плавное угасание и появление , 2 - перемотка по порядку числа, 3 - перемотка по порядку катодов в лампе)
  • Клик по "левой" кнопке отображает текущую температуру, затем клик по "левой" кнопке переключает температуру/давление/влажность.
  • Клик по "правой" кнопке- переключает режим точек:
    • NEON_DOT 0..1 - (0 - выкл | 1 - статичная | 2 - мигает один раз в секунду | 3 - мигает два раза в секунду | 4 - динамичная(плавно мигает)), (для точек в индикаторах)(5 - мигающая | 6 - бегущая | 7 - змейка | 8 - резинка | 9 - одинарный маятник(только для 6-ти ламп или если используются левые и правые точки) | 10 - двойной маятник(только для 6-ти ламп и если используются левые и правые точки))
    • NEON_DOT 2 - (0 - выкл | 1 - статичная | 2 - мигает один раз в секунду | 3 - мигает два раза в секунду | 4 - динамичная(плавно мигает) | 5 - маятник(мигает один раз в секунду) | 6 - маятник(плавно мигает)), (для точек в индикаторах)(7 - мигающая | 8 - бегущая | 9 - змейка | 10 - резинка | 11 - одинарный маятник(только для 6-ти ламп или если используются левые и правые точки) | 12 - двойной маятник(только для 6-ти ламп и если используются левые и правые точки))
    • NEON_DOT 3 - (0 - выкл | 1 - статичная | 2 - мигает один раз в секунду | 3 - мигает два раза в секунду | 4 - мигающая | 5 - бегущая | 6 - змейка | 7 - резинка | 8 - одинарный маятник(только для 6-ти ламп или если используются левые и правые точки) | 9 - двойной маятник(только для 6-ти ламп и если используются левые и правые точки))
  • Клик по "средней" кнопке - переключает режим анимации смены минут(0 - выкл, 1 - случайная анимация, 2 - плавное угасание и появление , 3 - перемотка по порядку числа, 4 - перемотка по порядку катодов в лампе, 5 - поезд, 6 - резинка, 7 - ворота, 8 - волна, 9 - блики, 10 - испарение | 11 - игровой автомат)
  • Удержание "средней" кнопки - переключает режим анимации смены секунд(0 - выкл, 1 - плавное угасание и появление , 2 - перемотка по порядку числа, 3 - перемотка по порядку катодов в лампе)
  • Клик по "левой" кнопке переключает режим подсветки -
    • Для обычных светодиодов: (0 - выкл | 1 - статичная | 2 - динамичная(дыхание))
    • Для адресных светодиодов: (0 - выкл | 1 - статичная | 2 - дыхание | 3 - дыхание со сменой цвета при затухании | 4 - бегущий огонь | 5 - бегущий огонь со сменой цвета | 6 - бегущий огонь с радугой | 7 - бегущий огонь с конфетти | 8 - волна | 9 - волна со сменой цвета | 10 - волна с радугой | 11 - волна с конфетти | 12 - плавная смена цвета | 13 - радуга | 14 - конфетти)
Если есть вопросы/проблемы, или вы нашли баг, пишите в ЛС или ниже в теме.
Для тех кто хочет участвовать в тестировании прошивки можно скачать бета версию тут.

Огромное спасибо psyx86 за тестирование, видео-обзоры и идеи для прошивки! Так-же есть базовая заготовка платы часов от psyx86 и плата-модуль для замены оптопар на транзисторы.
 
Изменено:

amezit

★✩✩✩✩✩✩
22 Мар 2021
19
11
Уважаемые гуру, прошу утонить, возможно ли адаптировать прошивку из этой ветки к шестиламповой плате на ИН12 от аdm503 (https://community.alexgyver.ru/threads/chasy-na-gri-v2-variant-adm503.5417/)? Родная прошивка NixieClock_PE_v2.0.19 (https://github.com/adm503/NixieClock) работала без нареканий. Нужны часы и подсветка на адресных светодиодах. Самостоятельная попытка переназначить аноды, успехом не увенчалась (горят одновременно несколько цифр в пятой лампе).
Спасибо.
 

Вложения

vlastan

★✩✩✩✩✩✩
13 Июн 2020
56
27
@amezit,у меня "Ладушки" прекрасно работают с данной прошивкой, только адресных светодиодов там нет, как впрочем и на "Ковид" версии, у amd503 задействованы RGB светодиоды. Или Вы отдельно хотите прикрутить адресные?
 

amezit

★✩✩✩✩✩✩
22 Мар 2021
19
11
@vlastan, да адресные, эффекты на них откровенно подкупают)), как и функционал этой прошивки.
А Ладушки с Ковидом разнятся по схемотехники (клавиатурой, задействованными пинами да и количеством ламп), поэтому имеем, что имеем((
 

vlastan

★✩✩✩✩✩✩
13 Июн 2020
56
27
@amezit, у Вас приведена схема "ковида" с RGB светодиодами. Посмотрел ту, что с адресными....получается так:
А1 - 8
А2 - 3
А3 - 4
А4 - 13
А5 - 0
А6 - 7
неонки(секунды) - 10
В принципе проблем не вижу.
 

Sergo_ST

★★★★★★✩
15 Мар 2020
1,093
884
@amezit, Какие у вас установлены лампы и на каком пине Din адресных светодиодов?

@Palpalych, Через меню отладки попробуйте поднять максимальное значение шим, если не поможет, попробуйте зайти в режим коррекции напряжения ВВ, если напряжение получается только уменьшить, а при увеличении никакой реакции - значит достигнут придел нагрузки на преобразователь.
 
Изменено:
  • Лойс +1
Реакции: Palpalych

amezit

★✩✩✩✩✩✩
22 Мар 2021
19
11
@Sergo_ST, ИН-12, D11.

@vlastan,да, именно так и сделал, но видимо что то не учёл, и в результате, светятся несколько цифр в одной лампе (десятки минут).
 

amezit

★✩✩✩✩✩✩
22 Мар 2021
19
11
@Sergo_ST, часы запустились и радуют глаз своей безупречной работой! Огромное спасибо вам как за саму прошивку, так и за адаптацию ее к КОВИДу!
 
  • Лойс +1
Реакции: Sergo_ST

Palpalych

★★★★★✩✩
24 Дек 2019
766
408
Ну вот мой первый мод (при всем уважении автору). Для тех, кто использует подсветку на WS
Ранее работал с библиотекой FastLED, и заметил, что для вычисления цвета используется свой алгоритм "Радуга", который позволяет добиться более сочных цветов. Подробнее здесь.
Я адаптировал этот модуль для этих часов. Более того, ввел специальный мод для отображения белого цвета. Выглядит тоже очень стильно! Выбирается при значении цвета светодиода = 255. Правда, чтобы включить этот цвет нужно будет ввести изменение в режим настроек, добавив 26 цвет. (Чуть позже постараюсь поправить)
Вот, код. Нужно будет в скетче просто-напросто переписать функцию
void showLeds(void)
New version of void showLeds():
#define LEDS_ENGINE 1
#if LEDS_ENGINE == 0
void showLeds(void)
{
  uint8_t ledBuff[LAMP_NUM * 3]; //массив светодиодов
  for (uint8_t f = 0; f < LAMP_NUM; f++) {
    uint8_t pallet = (float)(ledColor[f] % 85) * ((float)ledBright[f] / 85.0);
    switch (ledColor[f] / 85) {
      case 0:
        ledBuff[f * 3] = pallet;
        ledBuff[f * 3 + 1] = ledBright[f] - pallet;
        ledBuff[f * 3 + 2] = 0;
        break;
      case 1:
        ledBuff[f * 3] = ledBright[f] - pallet;
        ledBuff[f * 3 + 1] = 0;
        ledBuff[f * 3 + 2] = pallet;
        break;
      case 2:
        ledBuff[f * 3] = 0;
        ledBuff[f * 3 + 1] = pallet;
        ledBuff[f * 3 + 2] = ledBright[f] - pallet;
        break;
      case 3:
        pallet = ledBright[f] / 3;
        ledBuff[f * 3] = pallet;
        ledBuff[f * 3 + 1] = pallet;
        ledBuff[f * 3 + 2] = pallet;
        break;
    }
  }
  ledWrite(ledBuff, sizeof(ledBuff));
}
#else
typedef uint8_t fract8;
uint8_t scale8( uint8_t i, fract8 scale) {
  return (((uint16_t)i) * (1+(uint16_t)(scale))) >> 8;
}
#define K255 255
#define K171 171
#define K170 170
#define K85  85
const uint8_t Y1 = 1; //Level Y1 is a moderate boost, the default.
const uint8_t Y2 = 0; //Level Y2 is a strong boost.
void showLeds(void)
{
  uint8_t ledBuff[LAMP_NUM * 3]; //массив светодиодов
  for (uint8_t f = 0; f < LAMP_NUM; f++) {
    uint8_t offset = ledColor[f] & 0x1F; // 0..31
    uint8_t offset8 = offset;
    offset8 <<= 3;
    uint8_t third = scale8(offset8, (256 / 3)); // max = 85
    if( (ledColor[f] == 255) ) { // white color
      ledBuff[f * 3 + 1] = K255;  //r
      ledBuff[f * 3] = K255;      //g
      ledBuff[f * 3 + 2] = K255;  //b
    } else {
      if( ! (ledColor[f] & 0x80) ) {
        // 0XX
        if( ! (ledColor[f] & 0x40) ) {
          // 00X
          //section 0-1
          if( ! (ledColor[f] & 0x20) ) {
            // 000
            //case 0: // R -> O
            ledBuff[f * 3 + 1] = K255 - third;  //r
            ledBuff[f * 3] = third;             //g
            ledBuff[f * 3 + 2] = 0;             //b
          } else {
            // 001
            //case 1: // O -> Y
            if( Y1 ) {
              ledBuff[f * 3 + 1] = K171;      //r
              ledBuff[f * 3] = K85 + third ;  //g
              ledBuff[f * 3 + 2] = 0;         //b
            }
            if( Y2 ) {
              //uint8_t twothirds = (third << 1);
              uint8_t twothirds = scale8(offset8, ((256 * 2) / 3)); // max=170
              ledBuff[f * 3 + 1] = K170 + third;  //r
              ledBuff[f * 3] = K85 + twothirds;   //g
              ledBuff[f * 3 + 2] = 0;             //b
            }
          }
        } else {
          //01X
          // section 2-3
          if( !  (ledColor[f] & 0x20) ) {
            // 010
            //case 2: // Y -> G
            if( Y1 ) {
              //uint8_t twothirds = (third << 1);
              uint8_t twothirds = scale8(offset8, ((256 * 2) / 3)); // max=170
              ledBuff[f * 3 + 1] = K171 - twothirds;  //r
              ledBuff[f * 3] = K170 + third;          //g
              ledBuff[f * 3 + 2] = 0;                 //b
            }
            if( Y2 ) {
              ledBuff[f * 3 + 1] = K255 - offset8; //r
              ledBuff[f * 3] = K255;              //g
              ledBuff[f * 3 + 2] = 0;             //b
            }
          } else {
            // 011
            // case 3: // G -> A
            ledBuff[f * 3 + 1] = 0;         //r
            ledBuff[f * 3] = K255 - third;  //g
            ledBuff[f * 3 + 2] = third;     //b
          }
        }
      } else {
        // section 4-7
        // 1XX
        if( ! (ledColor[f] & 0x40) ) {
          // 10X
          if( ! ( ledColor[f] & 0x20) ) {
            // 100
            //case 4: // A -> B
            //uint8_t twothirds = (third << 1);
            uint8_t twothirds = scale8(offset8, ((256 * 2) / 3)); // max=170
            ledBuff[f * 3 + 1] = 0;                 //r
            ledBuff[f * 3] = K171 - twothirds;      //g K170?
            ledBuff[f * 3 + 2] = K85  + twothirds;  //b
          } else {
            // 101
            //case 5: // B -> P
            ledBuff[f * 3 + 1] = third;         //r
            ledBuff[f * 3] = 0;                 //g
            ledBuff[f * 3 + 2] = K255 - third;  //b
            }
        } else {
          if( !  (ledColor[f] & 0x20)  ) {
            // 110
            //case 6: // P -- K
            ledBuff[f * 3 + 1] = K85 + third;   //r
            ledBuff[f * 3] = 0;                 //g
            ledBuff[f * 3 + 2] = K171 - third;  //b
          } else {
            // 111
            //case 7: // K -> R
            ledBuff[f * 3 + 1] = K170 + third;  //r
            ledBuff[f * 3] = 0;                 //g
            ledBuff[f * 3 + 2] = K85 - third;   //b
          }
        }
      }
    }
    ledBuff[f * 3 + 1] = scale8(ledBuff[f * 3 + 1], ledBright[f]);  //r
    ledBuff[f * 3] = scale8(ledBuff[f * 3], ledBright[f]);          //g
    ledBuff[f * 3 + 2] = scale8(ledBuff[f * 3 + 2], ledBright[f]);  //b
  }
  ledWrite(ledBuff, sizeof(ledBuff));
}
#endif

}

UPD: поправил код. Установил возможность быстрого переключения движка отрисовки светодиодов по цветам.
 
Изменено:

Palpalych

★★★★★✩✩
24 Дек 2019
766
408
@Sergo_ST, С белой подсветкой круто! А вот у меня возникло предложение как ее можно еще использовать - Возможно ли сделать так, что в ночные часы, нажимая дополнительную кнопку включался ночник? Таймер то нафиг не нужен, а вот это - полезное дело! Яркости должно вполне хватать.
 

Sergo_ST

★★★★★★✩
15 Мар 2020
1,093
884
@Palpalych, Возможно, почему нет. Нужно удалить вызов подпрограммы таймера и вместо неё добавить своё действие. Для блокировки/разблокировки подсветки есть отдельные процедуры - backlAnimDisable()/backlAnimEnable(), для проверки день/ночь тоже - checkHourStrart(uint8_t _start, uint8_t _end).
 

Palpalych

★★★★★✩✩
24 Дек 2019
766
408
Раздел анимации WS. Конфетти... Каждая 10-я конфетка теперь белая.
C++:
        case BACKL_CONFETTI: { //рандомный цвет
            _timer_ms[TMR_BACKL] = BACKL_MODE_10_TIME; //установили таймер
            setLedHue(random(0, LAMP_NUM), random(0, 11) ? random(0, 256) : 255, WHITE_ON); //установили цвет
          }
 
Изменено:

Palpalych

★★★★★✩✩
24 Дек 2019
766
408
Экспериментальный мод показа температуры с соответствующим цветом подсветки.
Нужно добавить несколько строчек в процедуру autoShowTemp
Есть 3 варианта цветовой шкалы.

C++:
//--------------------------------Автоматический показ температуры----------------------------------------
void autoShowTemp(void) //автоматический показ температуры
{
  if (mainSettings.autoTempTime && !_timer_sec[TMR_TEMP] && RTC.s > 7 && RTC.s < 55) {
    _timer_sec[TMR_TEMP] = mainSettings.autoTempTime; //устанавливаем таймер
// ----- vvvvvvvvvvv ------
#if BACKL_TYPE == 2
    setLedHue(constrain((float)(500 - (sens.temp / 10 + mainSettings.tempCorrect)) / 3, 0, 255), WHITE_OFF); //pp-edited -25...+50
    //setLedHue(constrain((float)(500 - (sens.temp / 10 + mainSettings.tempCorrect)) / 2, 0, 255), WHITE_OFF); //pp-edited -0...+50
    //setLedHue(constrain((float)(500 - (sens.temp / 10 + mainSettings.tempCorrect)) / 4, 0, 255), WHITE_OFF); //pp-edited -50...+50
#endif
// ----- ^^^^^^^^^^ ------
    uint8_t pos = LAMP_NUM; //текущее положение анимации
    boolean drv = 0; //направление анимации

Пока оставил так. По хорошему, нужно завернуть эту строчку в функцию. И расставить в более корректные места, чтобы не конфликтовало с другой анимацией.
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,319
1,319
Москва
@Palpalych,я себе делал такой вариант. Надо задавать узкий диапазон, скажем 21-26 градусов, что бы было какое то отличие. И эффект статично выглядит. Я им не пользуюсь в общем :D
 

Palpalych

★★★★★✩✩
24 Дек 2019
766
408
@Старик Похабыч, да, я пока играюсь, не окончательное решение. Изначально думал что хорошо бы было отличать отрицательную температуру от положительной, ну а потом перешел на градиент. Имеет смысл, думаю, когда статическая подсветка а не динамическая вво время показа, но, пока не понял полностью всего алгоритма управления подсветкой.
 

Palpalych

★★★★★✩✩
24 Дек 2019
766
408
Вот, кому интересно. Удалось корректно подкрасить фон в зависимости от температуры в момент ее показа.
Диапазон -24...+40.
шкала получается такая (примерно):
+40 и выше - красный
+32 -оранжевый
+25 - желтый
+21 - желто-зеленый
+15 - зеленый
+7 - лазурный
0 - синий
-10 - фиолетовый
Если что, всегда можно пересчитать на другие диапазоны.

Мод автоматического показа температуры:
#define BACKL_TEMP_SHOW 1          //индикация подсветки для температуры (0 - не используется | 1 - используется)

//--------------------------------Автоматический показ температуры----------------------------------------
void autoShowTemp(void) //автоматический показ температуры
{
  if (mainSettings.autoTempTime && !_timer_sec[TMR_TEMP] && RTC.s > 7 && RTC.s < 55) {
    _timer_sec[TMR_TEMP] = mainSettings.autoTempTime; //устанавливаем таймер
#if BACKL_TYPE == 2 && BACKL_TEMP_SHOW
    uint8_t _backl = backlMaxBright; //pp-edited
    backlMaxBright = 0;
    uint8_t _hue = constrain(((float)400 - (sens.temp / 10 + mainSettings.tempCorrect)) / 2.5, 0, 255);   //-24...+40
    //uint8_t _hue = constrain(((float)500 - (sens.temp / 10 + mainSettings.tempCorrect)) / 2, 0, 255);   // -0...+50
    //uint8_t _hue = constrain(((float)500 - (sens.temp / 10 + mainSettings.tempCorrect)) / 4, 0, 255);   //-50...+40
    setLedHue(_hue, WHITE_OFF);
    setLedBright(_backl);
    showLeds();
#endif
    uint8_t pos = LAMP_NUM; //текущее положение анимации
    boolean drv = 0; //направление анимации

    if (!_timer_ms[TMR_SENS]) { //если таймаут нового запроса вышел
      updateTemp(); //обновить показания температуры
      _timer_ms[TMR_SENS] = TEMP_UPDATE_TIME; //установили таймаут
    }

#if DOTS_PORT_ENABLE
    dotSetBright(0); //выключаем точки
#else
    dotSetBright(dotMaxBright); //включаем точки
#endif

    for (uint8_t mode = 0; mode < 3; mode++) {
      switch (mode) {
        case 1:
          if (!sens.hum) {
            if (!sens.press) return; //выходим
            else mode = 2; //отображаем давление
          }
#if DOTS_PORT_ENABLE
          indiClrDots(); //выключаем разделительные точки
#else
          dotSetBright(0); //выключаем точки
#endif
          break;
        case 2: if (!sens.press) return; break; //выходим
      }

      while (1) { //анимация перехода
        dataUpdate(); //обработка данных
        if (buttonState()) return; //возврат если нажата кнопка
        if (!_timer_ms[TMR_ANIM]) { //если таймер истек
          _timer_ms[TMR_ANIM] = AUTO_TEMP_ANIM_TIME; //устанавливаем таймер
          indiClr(); //очистка индикаторов
          switch (mode) {
            case 0:
              indiPrintNum(sens.temp / 10 + mainSettings.tempCorrect, pos, 3, ' '); //вывод температуры
#if DOTS_PORT_ENABLE
              indiClrDots(); //выключаем разделительные точки
              indiSetDots(pos + 2); //включаем разделителную точку
#endif
              break;
            case 1: indiPrintNum(sens.hum, pos, 4, ' '); break; //вывод влажности
            case 2: indiPrintNum(sens.press, pos, 4, ' '); break; //вывод давления
          }
          if (!drv) {
            if (pos > 0) pos--;
            else {
              drv = 1;
              _timer_ms[TMR_ANIM] = AUTO_TEMP_PAUSE_TIME; //устанавливаем таймер
            }
          }
          else {
            if (pos < LAMP_NUM) pos++;
            else {
              drv = 0;
#if BACKL_TYPE == 2 && BACKL_TEMP_SHOW
              setLedHue(fastSettings.backlColor, WHITE_ON);  //pp-edited
              backlMaxBright = _backl;
#endif
              break;
            }
          }
        }
      }
    }
  }
}
 
Изменено:
  • Лойс +1
Реакции: Sher

Sergo_ST

★★★★★★✩
15 Мар 2020
1,093
884
@Palpalych, Отрицательных значений температуры нету программно, нет смысла учитывать их. И не нужно запоминать текущую максимальную яркость, для блокировки подсветки я привел выше две процедуры. Нужно учесть что выйти можно и по нажатию на кнопку, соответственно возвращать управление нужно ещё и в этом месте. Так-же подсветка бывает выключенной или статичной, в этом случае при возврате управления нужно ещё вручную изменить состояние диодов на соответствующее режиму.
 

Palpalych

★★★★★✩✩
24 Дек 2019
766
408
@Sergo_ST, Спасибо. Понял Поправлю. Касательно температур - чисто математически растянул шкалу таким образом, чтобы температуры более-менее соответствовали цвету. Ну, и, конечно, красно-фиолетовый цвет не рассматривал как отрицательные 24 )))

UPD:Поправил код.


Мод подсветки температуры v0.2:
#define BACKL_TEMP_SHOW 1          //индикация подсветки для температуры (0 - не используется | 1 - используется)

//--------------------------------Автоматический показ температуры----------------------------------------
void autoShowTemp(void) //автоматический показ температуры
{
  if (mainSettings.autoTempTime && !_timer_sec[TMR_TEMP] && RTC.s > 7 && RTC.s < 55) {
    _timer_sec[TMR_TEMP] = mainSettings.autoTempTime; //устанавливаем таймер
    uint8_t pos = LAMP_NUM; //текущее положение анимации
    boolean drv = 0; //направление анимации

    if (!_timer_ms[TMR_SENS]) { //если таймаут нового запроса вышел
      updateTemp(); //обновить показания температуры
      _timer_ms[TMR_SENS] = TEMP_UPDATE_TIME; //установили таймаут
    }
#if BACKL_TYPE == 2 && BACKL_TEMP_SHOW
    backlAnimDisable();
    uint8_t _hue = constrain(((float)400 - (sens.temp / 10 + mainSettings.tempCorrect)) / 2.5, 0, 160);   //0(-24)...+40
    setLedHue(_hue, WHITE_OFF);
    setLedBright(backlMaxBright);
    showLeds();
#endif

#if DOTS_PORT_ENABLE
    dotSetBright(0); //выключаем точки
#else
    dotSetBright(dotMaxBright); //включаем точки
#endif

    for (uint8_t mode = 0; mode < 3; mode++) {
      switch (mode) {
        case 1:
          if (!sens.hum) {
            if (!sens.press) return; //выходим
            else mode = 2; //отображаем давление
          }
#if DOTS_PORT_ENABLE
          indiClrDots(); //выключаем разделительные точки
#else
          dotSetBright(0); //выключаем точки
#endif
          break;
        case 2: if (!sens.press) return; break; //выходим
      }

      while (1) { //анимация перехода
        dataUpdate(); //обработка данных
        if (buttonState()) { backlAnimEnable(); return; } //возврат если нажата кнопка
        if (!_timer_ms[TMR_ANIM]) { //если таймер истек
          _timer_ms[TMR_ANIM] = AUTO_TEMP_ANIM_TIME; //устанавливаем таймер
          indiClr(); //очистка индикаторов
          switch (mode) {
            case 0:
              indiPrintNum(sens.temp / 10 + mainSettings.tempCorrect, pos, 3, ' '); //вывод температуры
#if DOTS_PORT_ENABLE
              indiClrDots(); //выключаем разделительные точки
              indiSetDots(pos + 2); //включаем разделителную точку
#endif
              break;
            case 1: indiPrintNum(sens.hum, pos, 4, ' '); break; //вывод влажности
            case 2: indiPrintNum(sens.press, pos, 4, ' '); break; //вывод давления
          }
          if (!drv) {
            if (pos > 0) pos--;
            else {
              drv = 1;
              _timer_ms[TMR_ANIM] = AUTO_TEMP_PAUSE_TIME; //устанавливаем таймер
            }
          }
          else {
            if (pos < LAMP_NUM) pos++;
            else {
              drv = 0;
#if BACKL_TYPE == 2 && BACKL_TEMP_SHOW
              setLedHue(fastSettings.backlColor, WHITE_ON);  //pp-edited
              backlAnimEnable();
#endif
              break;
            }
          }
        }
      }
    }
  }
}
 
Изменено:

Palpalych

★★★★★✩✩
24 Дек 2019
766
408
Лайфхак как подключить точки индикаторов. Проще это сделать на 4-ламповых часах - в них присутствуют свободные порты, которые использовались для коммутации анодов секундных ламп. Для владельцев часов с платами от @psyx86 - еще проще, не придется колхозить, и сделать все можно гораздо аккуратнее. Схема распаивается на месте незадействованной оптопары.

Первое - это нужно проверить на индикаторной плате - соединены ли все катоды линией связи. Потом, как правило, в межплатном 3-штырковом разъеме неоновых точек, 2 контакта (4-ламповой схемы) не задействованы. Проверьте, чтобы они не были закорочены на массу! Нужно будет соединить шину точек с этим контактом. Если будет навесной монтаж - то можно, как раз перенести сюда ограничивающее сопротивление.

Если берется плата-переходник замены оптопар - то просто не напаиваются часть элементов которые зачеркнуты на схеме. Коллектор транзистора нужно соединить напрямую к резистору R17 перемычкой.
Если делается навесным монтажем, то на место оптопары напаивается только транзистор и резистор базы. (Резистор коллектора переносим на плату индикаторов, как говорил выше). Транзисторы берем такие, как говорили ранее здесь. Я же взял транзистор 13001 - выпаял из какой-то негодной энергосберегающей лампы.

Главное! Схема не стандартная для монтажа, и важно не напутать при монтаже. Несколько раз проверьте, чтобы высокое анодное напряжение не подавалось на эти элементы, иначе можно все сжечь!
 

Вложения

psyx86

★★★★✩✩✩
31 Янв 2020
469
257
@Palpalych, еще не забыть сопротивление от 10К (зависит от типа индикатора) добавить между колектором и катодом точек.
UPD Добавил схему.
Сопротивление 10К* не обязательное
 

Вложения

Изменено:
  • Лойс +1
Реакции: Palpalych

ALEX__M

✩✩✩✩✩✩✩
4 Окт 2022
23
9
Знающие люди подскажите. Будет ли в этом проекте работать RDA5807FP и как правильно подключить управление питанием (1 ножку) УНЧ 8002 к управляющему Pin ардуино?
 

psyx86

★★★★✩✩✩
31 Янв 2020
469
257
@ALEX__M, голая микросхема rda точно не будет работать, а с обвязкой из паспорта должно.
По усилителю, в паспорте есть принципиальная схема где как раз указан пин SHD кажется. Но не вижу смысла его использовать, потребления в простое минимальное, шумы отсутсвуют при отсутствии звука.
 

Вложения