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

Sergo_ST

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

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

Видео-обзор прошивки:
Для настройки прошивки под другую разводку плат, отличающуюся от "Часов на ГРИ 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 режимов разделительных точек).
  • Возможность создания собственных мелодий будильника.
  • Система контроля основных параметров часов(Ошибки).
  • Меню отладки(Для опытных пользователей).
  • Программирование кнопок ИК пульта из меню отладки.
  • Веб-интерфейс для настройки и мониторинга.
  • Обновление прошивки часов через веб интерфейс.
  • Добавить возможность выбора перехода на зимнее/летнее время в часах.
  • Добавить возможность воспроизводить музыку.
  • Добавить поддержку декатрона вместо секундных неонок.
  • Добавить поддержку статической индикации.

Так-же не забудьте выбрать свою плату в "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. Настраиваем фьюзы(установив загрузчик для "Arduino UNO" или выставить вручную по картинке в папке загрузчика).
  2. Записываем кастомный загрузчик который идёт с прошивкой(i2c_bootloader_v2.hex).
  3. Загружаем прошивку в есп(по UART).
  4. Компилируем прошивку часов(нужно выбрать плату "Arduino UNO").
  5. Экспортируем прошивку часов в hex(скетч -> экспорт бинарного файла).
  6. Заходим в веб интерфейс, вкладка "Обновление", загружаем файл прошивки часов(который без подписи "with_bootloader")(поддерживаемые расширения файла - .hex).
  7. Зажимаем кнопку ресет на мк часов(нужно только при первой загрузке прошивки или при нештатной ситуации).
  8. Ждём появления окна о начале загрузки прошивки(появится надпись "Подключение...").
  9. Отпускаем кнопку ресет на мк часов(появится надпись "Загрузка...").
  10. Ждём окончания загрузки(появится надпись "Загрузка прошивки завершена").
web1.pngweb2.pngweb3.pngweb4.pngweb5.pngweb6.pngweb7.pngweb8.pngweb8_1.pngweb9.pngtemp8.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
54
25
@amezit,у меня "Ладушки" прекрасно работают с данной прошивкой, только адресных светодиодов там нет, как впрочем и на "Ковид" версии, у amd503 задействованы RGB светодиоды. Или Вы отдельно хотите прикрутить адресные?
 

amezit

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

vlastan

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

Sergo_ST

★★★★★★✩
15 Мар 2020
980
830
@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
405
Ну вот мой первый мод (при всем уважении автору). Для тех, кто использует подсветку на 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
405
@Sergo_ST, С белой подсветкой круто! А вот у меня возникло предложение как ее можно еще использовать - Возможно ли сделать так, что в ночные часы, нажимая дополнительную кнопку включался ночник? Таймер то нафиг не нужен, а вот это - полезное дело! Яркости должно вполне хватать.
 

Sergo_ST

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

Palpalych

★★★★★✩✩
24 Дек 2019
766
405
Раздел анимации 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
405
Экспериментальный мод показа температуры с соответствующим цветом подсветки.
Нужно добавить несколько строчек в процедуру 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,267
1,303
Москва
@Palpalych,я себе делал такой вариант. Надо задавать узкий диапазон, скажем 21-26 градусов, что бы было какое то отличие. И эффект статично выглядит. Я им не пользуюсь в общем :D
 

Palpalych

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

Palpalych

★★★★★✩✩
24 Дек 2019
766
405
Вот, кому интересно. Удалось корректно подкрасить фон в зависимости от температуры в момент ее показа.
Диапазон -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
980
830
@Palpalych, Отрицательных значений температуры нету программно, нет смысла учитывать их. И не нужно запоминать текущую максимальную яркость, для блокировки подсветки я привел выше две процедуры. Нужно учесть что выйти можно и по нажатию на кнопку, соответственно возвращать управление нужно ещё и в этом месте. Так-же подсветка бывает выключенной или статичной, в этом случае при возврате управления нужно ещё вручную изменить состояние диодов на соответствующее режиму.
 

Palpalych

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

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

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

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

Вложения

psyx86

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

Вложения

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

ALEX__M

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

psyx86

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

Вложения