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

Sergo_ST

★★★★★★✩
15 Мар 2020
979
829
Альтернативная прошивка для различных проектов часов на ГРИ под 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.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 и плата-модуль для замены оптопар на транзисторы.
 
Изменено:

Sergo_ST

★★★★★★✩
15 Мар 2020
979
829
@poty, Возможно, мы не совсем друг друга поняли... Исходники @adm503 видел, и насколько я помню, там регулировалось напряжение скважностью шим. У нас же преобразователь работает в релейном режиме, а скважность шим регулируется линейно в зависимости от текущей яркости индикаторов.
 

poty

★★★★★★✩
19 Фев 2020
3,237
942
@Sergo_ST, не очень понял. Яркость индикаторов чем измеряется? Что такое релейный режим и чем регулировка напряжения с помощью ШИМ отличается от изменения ШИМ для изменения напряжения?
 

Sergo_ST

★★★★★★✩
15 Мар 2020
979
829
@poty, Яркость индикаторов это - скважность яркости динамической индикации, в нашем случае это диапазон от 0 до 30. В прошивке задаются два параметра скважности шим преобразователя - минимальная и максимальная(по умолчанию это 100 и 180, но в идеале для каждых часов эти параметры нужно настраивать). Далее все просто, берется сумма яркости всех индикаторов и умножается на коэффициент, прибавляем минимальное значение и на выходе получаем текущую скважность шим преобразователя.
В релейном режиме преобразователь включается или выключается в зависимости от напряжения на АЦП(по типу как работает ОС в mc34063).
Работает это так: Линейная регулировка при любом изменении яркости/активных разрядов сразу же изменяет скважность шим, а ОС ограничивает максимальное напряжение.
 
Изменено:
  • Лойс +1
Реакции: Alex_B

poty

★★★★★★✩
19 Фев 2020
3,237
942
@Sergo_ST, Вы меня, конечно, извините, я с большим уважением отношусь к методам программирования, используемым Вами, как и с полученными результатами, но то, что Вы написали - совершенная бессмыслица. Скважность - это отношение периода импульсов к их длительности, характеристика импульсных систем. Что такое, по Вашему, скважность яркости? У Вас яркость - импульсная величина? При динамической индикации яркость, как среднее количество света, излучаемого индикаторами, обратно пропорциональна скважности напряжения, которое подаётся на аноды и обратно пропорциональна количеству разрядов. У Вас 30 предопределённых длительностей импульсов, за счёт которых изменяется яркость индикаторов в различных эффектах, включая ночной режим.
Теперь про "релейный режим", как он описан Вами. Начнём с измерения. Преобразователь работает на частоте около 30кГц (период - 33мкс), при этом, на обозначенных Вами значениях 100 и 180 (и это не скважность, это - заполнение или duty) длительность импульса равна 13-24мкс. Т.е., в течение 13-24мкс происходит накачка конденсатора (и напряжение на нём повышается), в течение 6-20мкс происходит разряд (и напряжение, соответственно, понижается). Я Вам хотел показать размах этой пилы: в зависимости от нагрузки разность пик-пик варьируется от 1 до 3В. Если мы ориентируемся на точность 10бит, то это в лучшем случае период измерений 100мкс, как Вы понимаете, ещё нужно сделать некоторое количество обработок, чтобы применить полученное значение. Итак, вопросы: в какое конкретно "значение" внутри этой пилы попадает любое случайное измерение? И сколько пройдёт циклов, пока Вы получите результат измерения (и за которое напряжение может реально измениться на величину бОльшую, нежели измеренная разность) и примените его к изменению скважности?
И, самое главное, чем это отличается от того, что мы измеряем напряжение и используем его для изменения ШИМ преобразователя, как в прошивке @adm503?
Не стоит кивать на MC34063. Волею случая я закончил курсы по драйверам импульсных источников питания, поверьте, что алгоритм там значительно отличается в положительную сторону от того, что Вы сможете воспроизвести на Ардуино.
 
  • Лойс +1
Реакции: Sergo_ST

SergejEU

★★✩✩✩✩✩
16 Сен 2020
120
73
@poty, Я хочу внести некоторую ясность. Автоматическая регулировка напряжения это отдельная тема, особенно, цифровая. На приведенной картинке видно как можно эмулировать аналоговое напряжение U(t) с помощью импульсного. Даны варианты - U1,U2,U3.. Ваше виденье - это управление с помощью duty cycle - U2, у автора - U3 - пакетное или, как он говорит, релейное. У этого выбора есть свой резон. По крайней мере я его могу понять. Управление через duty - U2 не линейное особенно для больших значений duty из-за насыщения дросселя и это бы усложнило алгоритм управления. Управление пакетами линейно, что упрощает алгоритм и повышает время реакции МК. img12.jpg
Вопрос был в уровне пульсаций ВВ. Я смотрел на шине 170V через делитель щупа 1:10. Пульсации присутствуют, но они не особо заметны. Ими можно смело пренебречь. Гораздо интересней реакция управления на смену режимов (анимация, показ температуры). По моим наблюдениям происходит некоторое перерегулирование системы с затуханием колебаний с максимальной амплитудой +-3V. На глаз эти краткие выбросы не особо заметни и для оптронов никакой опастности не несут. замерял на аналоговом аппарате Hameg HM312
 
  • Лойс +1
Реакции: Sergo_ST, Alex_B и psyx86

psyx86

★★★★✩✩✩
31 Янв 2020
417
237
, самое главное, чем это отличается от того, что мы измеряем напряжение и используем его для изменения ШИМ преобразователя, как в прошивке @adm503?
Много букв как всегда характерно для поти ( админы извеняюсь).
Вы тестировали скет альтернативной прошивки? У нас ушел не одна неделя добиться Vrms 0.1-0.2В и не важно в какой части "пилы" производился замер ( пила там и не пила далеко)
На практике это лучше всего узнать. Конечные пользователи не все имеют арсинал приборов и знаний, а ориентируются на визуальное восприятие. Лично я использую обе прошивки (adm503) и видно как ОС не справляется с 2мя китайскими неонками и 4 ИН14 ( условия одинаковые для всех).
 
  • Лойс +1
Реакции: Sergo_ST и Alex_B

Alex_B

✩✩✩✩✩✩✩
9 Мар 2020
74
5
Неонки всегда можно притушить, снизив влияние.
 

Alex_B

✩✩✩✩✩✩✩
9 Мар 2020
74
5
подразумевается что будут использоваться левые точки(максимум точек 6, как и ламп).
Левые это для случая ИН-14, ИН-16. Для ИН-8-2 и ИН-12Б вариант- только правые.
 

psyx86

★★★★✩✩✩
31 Янв 2020
417
237
@Alex_B, у ин12Б левые, по аналогии с ними в ин14 тоже использовали пока что только левые
 
  • Лойс +1
Реакции: Alex_B

poty

★★★★★★✩
19 Фев 2020
3,237
942
1. Вопрос влияния неонок начал рассматриваться только с точки зрения дополнительного влияния точек на яркость индикаторов, в таймслот которых они попадают. Единственное, с чем я согласен с psyx86 - это влияние мало зависит от напряжения, по крайней мере, при изменении напряжения в единицах вольт. Но влияние общего анодного резистора анодным напряжением не компенсировать.
2.
Пульсации присутствуют, но они не особо заметны
Конечно, если пульсации на 170В составляют 1В, то на делителе 1:10 - уже 0,1В. Для глаза они, естественно, кажутся несущественными, но для регулировки напряжения с точностью 0,2В - это допущение значительно.
3.
правление через duty - U2 не линейное особенно для больших значений duty из-за насыщения дросселя
это вопрос выбора дросселя. Если оно нелинейно - дроссель выбран неверно.
Управление пакетами линейно
в данном случае был бы согласен, если бы частота импульсов была кратно большей. Насколько я понимаю из того, что используется та же индуктивность дросселя и тот же управляющий MOSFET - частота не изменилась (позже посмотрю в коде), значит, никакого изменения в точности/линейности не происходит. Интервал регулирования не отличается от такового в случае U2.
4.
не важно в какой части "пилы" производился замер ( пила там и не пила далеко)
пила есть. Возможно, её форма неидеальна, здесь спорить не буду, но пульсации там есть, а значит, измерения каждый раз будут отличаться в диапазоне этих пульсаций.
5.
0,1 недостижимо по теоретической точности измерений, я это в "многобуков" уже пояснил. Кроме того, если это измерялось мультиметром, то следует помнить о длительности усреднения (а оно там по любому должно быть). С чем я (повторяюсь) согласен, что разницы в регулировании в 1В и 0,2В нет и на глаз это не заметить.
6.
(adm503) и видно как ОС не справляется с 2мя китайскими неонками
Так как этот алгоритм писал я, то я точно знаю, что таких целей алгоритм не преследовал. Предполагалось, что будет автоматически (без изменения в коде) поддерживаться среднее напряжение на выходе высоковольтного преобразователя. С учётом интегрирования на нескольких отсчётах и использования штатных Ардуиновских функций аналогового чтения без прерывания, интервал регулирования варьируется от 1 до 3 мс. При условии уменьшения этого интервала реагирование на динамику будет сравнимо с реализацией @Sergo_ST . Но, повторяю, такой цели я не преследовал, так как при правильном выборе сопротивления последовательно с неонкой эффект полностью исчезает.
 
  • Лойс +1
Реакции: Alex_B и Sergo_ST

Sergo_ST

★★★★★★✩
15 Мар 2020
979
829
@poty, Да, согласен, с подобной терминологией я слабо знаком, поэтому возможно для Вас это кажется бессмыслицей, но, в общих чертах Вы поняли суть, которую я хотел донести. Но, спасибо за разъяснения, я подчеркнул для себя все что нужно) Так-же спасибо @SergejEU, он максимально точно описал алгоритм работы, который используется на данный момент в прошивке))

По алгоритмам, в статике, вариант U2 в принципе будет удерживать вполне стабильно напряжение, но представим ситуацию что у нас мигают 2 из 4-х разрядов, сколько понадобится времени алгоритму по принципу U2 чтобы отрегулировать напряжение, если изменение 1 ед. duty происходит за 1-3мс? В то время пока алгоритм U2 будет подстраивать duty, U3 уже давным давно включит или выключит преобразователь, тем самым подняв или сбавив напряжение(да, это же не так быстро из-за инертности, но быстрее чем в U2). И даже если интервал реагирования U2 приблизить к варианту U3, все равно напряжение не будет изменяться так-же быстро как в U3. Для этого нужен более сложный алгоритм, который будет "предсказывать" на сколько единиц нужно изменить duty, чтоб напряжение на выходе опустилось или поднялось до необходимого уровня. Как Вы понимаете, это будет требовать гораздо больших вычислительных мощностей.

Но и U3 тоже не идеален, как я и говорил выше, при тестах на динамической нагрузке(при мигании разрядов) без зависимости duty шим от яркости индикаторов, пульсации составляли 1-2в, при этом была заметна просадка яркости, с зависимостью - пульсации 0.2в и без просадки яркости.
Так-же пульсации в 1-2в начинались при уменьшении интервала регулирования (менее 300мкс), но при использовании зависимости duty шим от яркости индикаторов, визуальной просадки яркости не наблюдалось. И дело явно не в точности замера АЦП или количестве усреднений, тк при любом раскладе выходит именно этот порог в 300мкс.
В статике же, при любой из выше перечисленных вариаций просадок как напряжения так и яркости не наблюдалось(напряжение не изменялось вообще).

Измерения провожу не я, не имею возможности в виду отсутствия опытного образца и необходимого оборудования для этого.
Да и, частота шим осталась неизменна - 31кГц.

Все-же, если у Вас появится желание провести более подробное тестирование, для чистоты эксперимента, могу добавить Ваш алгоритм в прошивку, будет интересно посмотреть на результаты))

@SergejEU, Этот эффект происходит из-за того, что на некоторое время перерываем работу ОС, особенно при работе с датчиками температуры(может доходить до 3мс). Решение очень простое - обрабатывать ОС в прерывании АЦП, но как то не шибко сильно хочется прыгать каждые 30мкс...
Я же правильно Вас понял, что например в момент начала анимации, кратковременно подскакивает или падает напряжение на 3в от исходного? Или же оно колеблется во время всей анимации??
 
Изменено:
  • Лойс +1
Реакции: Alex_B и psyx86

SergejEU

★★✩✩✩✩✩
16 Сен 2020
120
73
в момент начала анимации, кратковременно подскакивает или падает напряжение на 3в от исходного? Или же оно колеблется во время всей анимации?
нет, только в начале анимации происходит скачок +-3V.

На всякий случай привожу осциллограмму работы авто регулировки напряжения в рабочем режиме. Почти все параметры в настройках по дефолту. По оси ординат одна большая клетка = 0,5V; по оси абцисс одна клетка соответствует интервалу 5 ms. Сигнал на выходе ВВ преобразователя +170В состоит из большой пилы (коммутация ламп ~70 Hz) и наложеной на нее маленькой пилы - собственно сама регулировка.
DSCI0254.JPG
всё тоже самое, только без нагрузки (панель с лампами снята)
DSCI0259.JPG
 
Изменено:

poty

★★★★★★✩
19 Фев 2020
3,237
942
мигают 2 из 4-х разрядов, сколько понадобится времени алгоритму по принципу U2 чтобы отрегулировать напряжение, если изменение 1 ед. duty происходит за 1-3мс?
Тот алгоритм, что работает 1-3мс, не предназначен для компенсации динамических изменений, я ещё раз об этом напоминаю.
если интервал реагирования U2 приблизить к варианту U3, все равно напряжение не будет изменяться так-же быстро как в U3
Почему? При равенстве частот U3 не имеет преимуществ перед U2 в скорости регулирования. Скорее - наоборот. Объясняется это очень просто: U3 - частный случай U2 (при равенстве частот). Т.е., если в алгоритме U2 уменьшать duty до 0 каждый раз, когда измерено превышение напряжения, то импульс будет пропущен ровно также, как для U3. Аналогично: при наличии недостатка напряжения - восстанавливать duty до постоянного значения. U2 будет выигрывать если изменения в напряжении невелики. Интервал регулирования 300мкс допускает изменение около 50мВ в ту или другую сторону, при наличии устоявшегося режима с U2 можно полностью погасить эти колебания. Оценить "передаточный коэффициент" напряжение/duty весьма легко, он практически линеен.
Основная проблема - в фазе измерений. Так как измерение на аналоговом входе не может быть синхронизировано с импульсом (пилой) высоковольтного напряжения, возникает погрешность.
По поводу изменения "моего" алгоритма - как будет время попробую сделать.
 
  • Лойс +1
Реакции: Sergo_ST и Alex_B

poty

★★★★★★✩
19 Фев 2020
3,237
942
@SergejEU, ну, можно сказать и так. Функция состоит из одного коэффициента. Да и тот эффективен в широких пределах, если частоту измерений повысить.
"Рабочий режим" на первом фото - это в какой момент? (Устоявшийся, начало/продолжение эффекта ...)
Жаль, что в теме про отличную прошивку создали довольно большое обсуждение. :-( С себя вину также не складываю.
 
  • Лойс +1
Реакции: pepino

SergejEU

★★✩✩✩✩✩
16 Сен 2020
120
73
"Рабочий режим" на первом фото - это в какой момент? (Устоявшийся, начало/продолжение эффекта ...)
первая осциллограмма изображает почти стационарной режим. По пульсациям, просадкам напряжения можно заметить, что 3-я лампа потребляет больше тока чем другие. Так оно и есть, она более изношена.

На счет передаточной функции. Если допустить ее линейность, то тогда должны быть два независимых параметра. Один из них так называемый свободный коэффициент. Допустим, свободный коэффициент равен нулю, что согласуется со здравым смыслом: нет водящего сигнала, тогда у нас на выходе должен быть 0V. Но тогда возникает вопрос, в теории САУ передаточная функция для реальных физических процессов должна выглядеть как правильная (степень числителя строго меньше степени знаменателя) дробно рациональная функция. То есть оригинал передаточной функции должен действовать как дифференциальной оператор. В противном случае мы стационарного режима в системе не достигнем.
 
  • Лойс +1
Реакции: Sergo_ST

poty

★★★★★★✩
19 Фев 2020
3,237
942
@SergejEU, о стационарном режиме стоит говорить только тогда, когда он есть. В нашем случае это не может быть непрерывной функцией, потому что измерения производятся дискретно и воздействия - тоже дискретны. Более того, результат воздействия имеет фазовый сдвиг (задержку) и изменяющуюся инерционность, а воздействия - нелинейны (имеется в виду, что напряжение при наличии импульса растёт быстрее, чем падает при разряде).
Если все эти компоненты учитывать правильно, формула передаточной функции не влезет в память Ардуино, а производительности не хватит, чтобы ее вовремя посчитать.
К счастью, нам не нужно добиваться точного регулирования, так как отклонение результата на короткий промежуток времени не видны. Поэтому можно ограничиться линейной аппроксимацией воздействий. Коэффициенты можно посчитать из устоявшегося режима, а можно ориентироваться на недорегулирование (использовать консервативные прикидки) - это увеличит время сходимости, конечно, но можно же потом потюнить это дело.
 
  • Лойс +1
Реакции: Sergo_ST и SergejEU

Alex_B

✩✩✩✩✩✩✩
9 Мар 2020
74
5
В 07 пункте задавал яркость подсветки день/ночь. Первые 2 регистра ночь - регулируется. Никак не смог переключиться на регулировку дня. Поможете? Прошивка 1.5.9
 
Изменено:

Sergo_ST

★★★★★★✩
15 Мар 2020
979
829
@poty, Хмм... Есть над чем поразмышлять, спасибо))

@SergejEU, А у Вас секундная точка выбрана в прошивке неоновая или светодиодная?? Какая яркость индикаторов была установлена в момент замера??

@Alex_B, Переход по разрядам осуществляется удержанием левой или правой кнопкой(в зависимости какие разряды нужно выбрать). У Вас все удержание кнопок отрабатывают?
 
Изменено:

SergejEU

★★✩✩✩✩✩
16 Сен 2020
120
73
@Sergo_ST, здесь параметры из userConfig
userConfig.h:
//Основные настройки перефирии
#define BACKL_WS2812B 0           //использовать адресные светодиоды подсветки вместо обычных(0 - обычные светодиоды | 1 - светодиоды WS2812B)
#define BACKL_MODE 0              //режим подсветки на обычных светодиодах(0 - хардверный шим(только D11) | 1 - софтверный шим(любой пин))
#define BOARD_TYPE 2              //тип платы часов(0 - IN-12 (индикаторы стоят правильно) | 1 - IN-12 turned (индикаторы перевёрнуты) | 2 - IN-14 (обычная и neon dot) | 3 - другие индикаторы(4 лампы) | 4 - другие индикаторы(6 ламп))
#define NEON_DOT 1                //использовать неоновую лампу в качестве секундных точек(0 - точка светодиодная | 1 - точка неоновая лампа)
#define LAMP_NUM 4                //количесвто используемых ламп в часах(4 или 6)
,,,
//Настройки яркости индикаторов
#define DEFAULT_INDI_BRIGHT 25     //яркость цифр дневная по умолчанию(0..30)
#define DEFAULT_INDI_BRIGHT_N 5    //яркость цифр ночная по умолчанию(0..30)
 

Alex_B

✩✩✩✩✩✩✩
9 Мар 2020
74
5
У Вас все удержание кнопок отрабатывают?
Да, все получилось, странно я вроде пробовал удерживать, видимо не додержал. А так - да, работают все удержания нормально в итоге.
 

mr.nikon

★✩✩✩✩✩✩
5 Янв 2020
70
12
Доброго времени суток. Какие пины в планах задействовать для мп3 модуля? Возможно планируется управление с пульта?

Немного в дополнение в к предыдущему посту. Если не использовать пин сотового HV будет ли работать регулировка яркости?
 

Sergo_ST

★★★★★★✩
15 Мар 2020
979
829
@mr.nikon, Будут нужны любые два свободных цифровых пина(но лучше на всякий случай один из пинов выбрать D1). Нет, пульт не планируется.
Что такое "пин сотового HV"? Яркость зависит от времени установленного в настройках.

@Sher, Нет, пока не планировалось. Может в будущем.
 
Изменено: