Всем привет!
Недавно я опубликовал свою первую статью про восстановление легендарного компьютера: «Воскрешение „Пентагона-128“ из пепла и безвейтовый контроллер клавиатуры и джойстиков на ATmega8 своими руками». Честно скажу, то, как её встретили — лайки, добавления в закладки и первые подписки на меня — очень сильно воодушевило. По свежим следам и на этой волне вдохновения я сразу же решился опубликовать ещё одну свою разработку. На этот раз — девайс полностью самостоятельный, а все схемы, платы и файлы прошивок я отдаю в открытый доступ.
Сразу оговорюсь: к Спектруму это устройство отношения не имеет. Это универсальный контроллер климата, разработанный мной довольно давно. Он успешно и активно эксплуатируется в реальных условиях уже более 10 лет (причем не только мной), так что жесткое «альфа- и бета-тестирование» временем прибор прошел на отлично.
Устройство можно одинаково успешно применять в двух разных сценариях:
-
Для бойлеров систем отопления (где критически важно контролировать температуру жидкого теплоносителя).
-
Для электрических обогревателей и конвекторов с сухим ТЭНом (где нужно защитить прибор от перегрева).
Архитектура и аппаратная реализация
Весь проект построен на базе одного-единственного микроконтроллера ATtiny2313.
Периферия и интерфейс устройства:
-
«Мозг»: ATtiny2313.
-
Индикация: 7-сегментный светодиодный LED-дисплей на три знакоместа. Поддерживается индикация отрицательной температуры для датчика воздуха. При этом знак «минус» не привязан к левому разряду жестко, а сдвигается вплотную к числу (например, на экране отобразится -1 или -10 без отрыва знака от цифры).
-
Органы управления: инкрементальный энкодер с кнопкой на валу.
-
Сенсоры: два цифровых датчика температуры DS18B20.
-
Управление нагрузкой: симистор (выбор пал на него, так как он работает абсолютно бесшумно :), но при желании его можно заменить на обычное реле). Симистор, кстати, ни в схеме ни на плате не указан, предполагается что он стоит отдельно на радиаторе и подключается к плате проводами через разъемы, как и нагрузка.
Ну и начинаем хвастаться: фраза «всё реализовано на одной ATtiny2313» означает именно всё. Контроллер в одиночку опрашивает оба цифровых датчика, обрабатывает сигналы энкодера с кнопкой, управляет симистором и осуществляет динамическую индикацию на экран напрямую — без промежуточных сдвиговых регистров или дешифраторов.
Для начала определимся с ролями наших датчиков:
-
Датчик 1 (Д1) — контролирует температуру жидкого теплоносителя или крепится непосредственно к сухому ТЭНу обогревателя.
-
Датчик 2 (Д2) — измеряет температуру воздуха в помещении.
Главный алгоритм: Логика работы «И / ИЛИ»
Чтобы обеспечить максимальную безопасность и энергоэффективность, алгоритм завязан на логические условия И (для старта) и ИЛИ (для остановки).
-
Включение нагрева (Логическое И): Нагрузка запустится только тогда, когда температура на ОБОИХ датчиках одновременно упадет ниже их индивидуальных установок с учетом гистерезиса.
-
Выключение нагрева (Логическое ИЛИ): Нагрев полностью прекратится, как только ХОТЯ БЫ ОДИН из датчиков достигнет своей заданной уставки.
Теперь немного о безопасности. Устройство контролирует нагреватели, так что понятно, что неисправный или отвалившийся датчик может привести к тому, что в лучшем случае сгорит нагреватель — в худшем закипит теплоноситель, поэтому постоянно контролируется физическое присутствие датчиков на шине 1-Wire. Если происходит обрыв линии или сенсор перестает отвечать, устройство мгновенно обесточивает силовую нагрузку, а на 7-сегментный дисплей выводится аварийный код:
-
Er1 — обрыв или неисправность Датчика 1 (Теплоноситель / ТЭН).
-
Er2 — обрыв или неисправность Датчика 2 (Воздух).
-
Er3 — одновременный обрыв обоих датчиков.
Пользовательский интерфейс и меню
Теперь разберем, как устроена навигация и логика работы с экраном.
Основной режим работы
-
Старт: При включении на экране на 3 секунды загорается заданная уставка для датчика 2 (воздух). После этого дисплей переключается на отображение текущей температуры с этого же датчика.
-
Просмотр уставки: Короткое нажатие на кнопку энкодера в процессе работы снова выводит значение уставки датчика 2 на 3 секунды, а затем возвращает экран к текущей температуре.
-
Изменение уставки: Поворот энкодера в любую сторону сразу переключает экран в режим корректировки уставки датчика 2. Как только перестаём крутить ручку, устройство ждет 3 секунды и возвращается к показу текущей температуры воздуха.
-
Защита памяти: Новое значение уставки записывается в EEPROM не мгновенно, а только через 3 секунды после окончания активности. Это сделано намеренно, чтобы сберечь ограниченный ресурс циклов перезаписи ячеек EEPROM при прокрутке энкодера.
Сервисное (инженерное) меню
Для глубокой настройки системы предусмотрен сервисный режим. Чтобы войти в него, зажмите кнопку энкодера более чем на 3 секунды. На экране появятся прочерки —, а силовая нагрузка в целях безопасности полностью отключится. Как только вы отпустите кнопку, устройство перейдет в меню настроек.
Здесь мы можем циклически переключать четыре параметра короткими нажатиями на кнопку энкодера:
-
П-1 — Верхнее ограничение для уставки датчика 2 (Воздух). (Диапазон: от 0 до 45 °C).
-
П-2 — Гистерезис датчика 2 (Воздух). (Диапазон: от 1 до 10 °C).
-
П-3 — Уставка температуры для датчика 1 (Теплоноситель / ТЭН). (Диапазон: от 10 до 127 °C).
-
П-4 — Гистерезис датчика 1 (Теплоноситель / ТЭН). (Диапазон: от 1 до 20 °C).
Как менять значения: Выбираем нужный пункт. При повороте энкодера имя параметра (П-1 – П-4) сменяется его числовым значением. Через 3 секунды бездействия дисплей вернется к имени параметра.
Выход из сервисного меню: Зажмите кнопку энкодера на 3 секунды. Прибор вернется в основной режим, а настройки зафиксируются в EEPROM.
Схемотехника и универсальность индикации
В репозитории доступна схема под дисплей с Общим Катодом (ОК), но предусмотрена легкая адаптация под Общий Анод (ОА):
-
Меняем транзисторы на p-n-p и переключаем их эмиттеры на VCC.
-
В проекте, в файле Define_Dyn_Indik.asm, комментим следующую строку:
#define COM_CAT, и наоборот раскомментируем: #defineCOM_AN, и всё, больше ничего не требуется.
Кстати, заодно на плате разведен разъем IDC-10 (ISP) для прошивки (вообще то это сделано для отладки, при написании кода, но остался артефактом, его, как сами понимаете можно и не распаивать)
🔌 Опыт отладки и адаптация под современные импульсные БП
В оригинальной первой версии устройства, созданной более 10 лет назад, питание было собрано на классическом малогабаритном трансформаторе и понижающей микросхеме MC34063. С этим решением, при включении, напряжение поднималось достаточно плавно, прибор работал абсолютно стабильно.
Однако при переходе на компактные современные модули типа Hi-Link (HLK-PM01) (5В, 3 Вт) на живом железе внезапно проявились два плавающих бага: прибор мог намертво зависнуть на стартовой заставке или уйти в циклические сбросы через случайные промежутки времени (при этом от USB-программатора всё работало идеально).
На основе этого опыта я категорически не рекомендую использовать данные модули питания (Hi-Link) в их «голом» виде без дополнительной обвязки. Практическая эксплуатация показала, что они слишком «шумные» в плане высокочастотных помех на старте.
Физика процесса и доработка кода:
Импульсные обратноходовые БП вроде Hi-Link при старте и под динамической нагрузкой генерируют в линию питания жесткие наносекундные высокочастотные (ВЧ) иголки-выбросы. Обычные электролиты (даже на 1000 мкФ) из-за собственной внутренней индуктивности их не сглаживают. Эти иголки ложно взводили аппаратные флаги совпадения таймеров в регистре TIFR и внешних линий в GIFR во время паузы cli, полностью ломая стартовую фазу флагового автомата.
Для решения проблемы и возможности безопасного использования таких БП было сделано следующее:
-
Программная доработка: Перед sei добавлена принудительная очистка регистров TIFR и GIFR, устраняющая ложные срабатывания от ВЧ-помех.
-
Аппаратная доработка: В оригинальной ревизии печатной платы сглаживающий дроссель отсутствует, поэтому при сборке на базе импульсных БП крайне рекомендуется самостоятельно установить последовательный SMD-дроссель (22–47 мкГн, маркировка 220/470) в разрыв питания +5В (после электролита 1000 мкФ, но до блокировочной керамики 0.1 мкФ у ног микроконтроллера), создав полноценный LC-фильтр от высокочастотных выбросов.
⚙ Конфигурация фьюзов и отладка «холодного старта»
Для стабильной работы на частоте 8.0 МГц (внутренний RC-генератор) ставим:
-
Ext. Fuse: 0xFF
-
High Fuse: 0x99 (активен BOD 4.3V и защита EEPROM EESAVE).
-
Low Fuse: 0xE4 (задержка старта 64 мс для надежного включения).
💾 ВАЖНО: Прошивка EEPROM
Сильно желательно прошить файл Thermostat.eep (5 байт), так как функция автоинициализации в коде отсутствует. Без этого устройство все равно запустится, просто считает из EEPROM либо мусор, либо 0xFF. что прям сильно не рядом с возможными уставками, но тем не менее, если перейти в инженерное меню, то можно уставки все равно выставить на нужные значения, так что это не прям чтобы критично.
📁 Исходный код и репозиторий
Проект (автор: vic80) реализован на модульном ассемблере. Подробности, файлы прошивок (.hex, .eep), схемы и Gerber-файлы находятся в репозитории:
👉 Ссылка на GitHub: https://github.com/vic80-designs/vic80_attiny2313-2x18b20-thermostat
⚠️ Дисклеймер
Проект предоставляется «As Is». Автор не несет ответственности за использование устройства. При распространении или модификации указание автора (vic80) обязательно.
Жду ваших отзывов и предложений!
ссылка на оригинал статьи https://habr.com/ru/articles/1051308/