Простой термостат на ардуино

Термостат с таймером

Задача

Разработать термостат с таймером для йогуртницы или других применений: термостат держит температуру только на протяжении заданного времени, всё остальное время (режим ожидания) – реле выключено

  • Релейное регулирование с гистерезисом
  • Бесшумное управление – используем нагрузку постоянного тока и МОСФЕТ модуль
  • Рабочий цикл по таймеру (включили-регулируем-выключили)
  • Управление энкодером
  • Вывод на 7-сегментный дисплей
    • Двоеточие мигает, если рабочий цикл запущен
  • Звуковая индикация окончания рабочего цикла

Базовые уроки

Компоненты не из набора

  • В моём проекте контроллера йогуртницы используется блок питания на 12V и нагревательный кабель

Подключение

  • Энкодер: любые цифровые пины
  • Зуммер: любой цифровой пин через ограничительный резистор 100 Ом
  • Дисплей: любые цифровые пины
  • Мосфет модуль: любой цифровой пин
  • Термистор: любой аналоговый пин
  • Внешнее питание 12V: пин Vin

Библиотеки

  • EncButton – энкодер с кнопкой
  • GyverTM1637 – дисплей
  • GyverNTC – термистор

Программа

Инициализация

Компонентов много, так что для удобства задефайним все пины константами, и только потом подключим все библиотеки и создадим объекты:

Нам понадобится несколько глобальных переменных (для простоты программы), обозначим флаги и переменные режимов:

  • Нужен флаг, отвечающий за рабочий цикл: запущен таймер термостата, или нет. Соответственно реле управляется только при поднятом флаге, как и счёт оставшегося времени. Назовём его state : 0 – режим ожидания, 1 – “рабочий цикл”, когда идёт обратный отсчёт
  • Хочу выводить на дисплей оставшееся время, заданную температуру и текущую температуру датчика – имеем три режима отображения, пусть будет переменная mode
  • Понадобится переменная таймера tmr . Таймер мы сбросим при запуске рабочего цикла
  • Нам нужно хранить оставшиеся минуты рабочего цикла (они же – настроенное время работы), целевую температуру и текущее значение с датчика. Назовём всё соответственно:

В блоке setup() сделаем нужные пины выходами, запустим и обновим дисплей:

Обновление дисплея

Здесь updDisp() – функция, которую я создаю для удобства, т.к. она будет вызываться и в других местах программы. Взглянем на неё поближе:

Вывод на дисплей зависит от текущего режима отображения mode :

  • При 0 мы выводим время при помощи displayClock(часы, минуты) . Я не просто так храню время в минутах, так удобнее с ним работать: проверять таймер и менять значение энкодером. Из общих минут можно получить часы, просто разделив на 60. При целочисленном делении дробная часть отсекается, то есть округление идёт вниз и мы всегда получим целые часы. Для получения минут – берём остаток от деления на 60, и всё! Что касается строчки if (!state) disp.point(1); – я хочу чтобы двоеточие на дисплее горело постоянно, если рабочий цикл не запущен. Поэтому принудительно включаем. В ждущем режиме мы просто выводим настроенные минуты mins , а во время работы таймера – сколько времени осталось до конца. Это можно реализовать разными способами, я выбрал самый простой (это всё-таки урок, а не погоня за оптимальным кодом): считаем оставшиеся минуты, вычитая прошедшее с момента запуска таймера время из заданных минут. И заданные минуты мы всё ещё сможем менять, то есть заставить таймер сработать чуть раньше или позже – пусть это будет фишкой
  • При 1 выводим значение установленной температуры temp , а также выводим букву t в левое знакоместо дисплея. Выключаем двоеточие, если находимся в режиме ожидания
  • При 2 выводим значение с датчика sens , а также букву S

Main loop

Главный цикл программы выглядит вот так, в нём несколько функций, мы их рассмотрим ниже:

Управление

Управление энкодером организуем следующим образом:

  • Поворот энкодера: изменение текущего значения на дисплее: градусы на 1, время – на 10 минут. При любом повороте нам нужно обновить дисплей
  • Удержание кнопки: запуск рабочего цикла:
    • Поднимаем флаг рабочего режима state = 1
    • А также сбрасываем таймер обратного отсчёта
  • Клик по кнопке: переключение режимов отображения (фактически закольцованное изменение переменной mode от 0 до 2). Также обновляем дисплей

Регулирование

Здесь всё просто: взводим таймер на 1 секунду, по нему опрашиваем термистор. Мы задаём температуру в целых числах, поэтому для более корректной работы лучше математически округлить значение перед присваиванием к переменной temp .

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

Таймеры и индикация

Два раза в секунду хотим мигать двоеточием, а также обновлять дисплей (там ведь тикает время и меняются показания датчика). “Мигать” очень просто – заводим себе переменную-флажок, и каждый вызов просто его инвертируем и передаём в функцию управления двоеточием

Далее проверяем таймер рабочего цикла, не вышло ли время. Если вышло – пищим пять раз при помощи функции tone() , а затем переходим в ждущий режим, обнулив state . Всё!

Полный код программы

Возможные доработки

  • Использовать более точный датчик температуры ds18b20
  • Использовать более хитрый алгоритм релейного управления
  • Использовать реле вместо мосфет-модуля для контроля сетевого нагревательного элемента
  • Использовать ПИД регулятор, так как мосфет-модуль и ШИМ сигнал позволяют это сделать

Видео

Источник

arduinoLab

Применение термостата с ПИД управлением не ограничено птицеводством, КО , проект может использоваться пивоварами для поддержания температуры сусла, винокурами в перегонных аппаратах, может просто греть воду в бойлере до приятной температуры, после небольших изменений, в самодельных паяльных станциях, муфельных печах, кароче везде где требуется контроль температуры с высокой точность. Принцип работы и отличие от банального термостата с гистерезисом показан в видео:

Ниже схемы подключения и исходные коды проекта.

О датчиках температуры:

Исходные коды проекта написаны нескольких типов датчиков:

  • TMP102 — датчик температуры с интерфейсом I2C, подробнее про работу с датчиком написано тут. Возможно датчик потребует корректировку температуры.
  • LM35 — не дорогой и распространенный, достаточно точный аналоговый датчик температуры, подробнее про него тут.
  • MCP9808 — высокоточный датчик температуры с интерфейсом I2C. Оптимальный выбор.

Имея навыки программирования ардуино, изменить код под другие датчики температуры труда не составит.

О ЖКИ индикаторе:

Решил не усложнять и взял стандартный текстовый экран WH1602A, про подключение подобных экранов к ардуино уже написано тут. Подключается напрямую, без переходников на I2C. Указанные в проекте номера выходов для подключения ЖКИ совпадают с китайским LCD Keypad Shield, я его использовал на стадии отладки.

Органы управления:

Настройка температуры терморегулятора осуществляется с помощью энкодера, удобно использовать модуль KY-040 по китайской номенклатуре 🙂

О реле:

В регуляторе крайне не рекомендуется использовать электромеханические реле, от частого переключения они выйдут из строя, особенно это относится к китайским релейным модулям за пару долларов.

Правильным решением будет использование твердотельного реле, либо модуль с симистором (что по сути является одним и тем же) на необходимый ток. Например SSR-25DA на 25А, если мощность нагревателя в районе нескольких киловатт, OMRON G3MB 202P держит до 2А или 440Вт.

У меня они в наличии не оказались, пришлось закупить в местном магазине радиодеталей оптосимистор MOC3063 для гальванической развязки и «детекции нуля» с симистором BT137x-800 на 8А и собирать твердотельное реле на макетке. Схема взята из даташита на MOC3063.

Схема подключения:

Возможно на этой будет понятней.

Схема подключения актуальная для датчиков с интерфейсом I2C (MCP9808, TMP102), в случаи использования аналогового LM35, его выход подключается к аналоговому входу А5.

Источник

Терморегулятор вентилятора

ОПИСАНИЕ

ерморегулятор вентилятора на базе микроконтроллера AVR. Возможности:

  • Оптимизирован под ATmega328 (Arduino NANO) и ATtiny85 (Digispark)
  • Выход PWM 20 кГц
  • Датчик: NTC термистор (с полной настройкой) или ds18b20
  • Управление кнопкой
    • 1x клик: вкл/выкл
    • 2x клик: задать минимальную температуру
    • 3x клик: задать максимальную температуру
    • 4x клик – сброс на “стандартные” MIN_TEMP и MAX_TEMP
  • Плавное включение/выключение/регулирование
  • Сигнализация о перегреве
  • Линейный закон скорости от температуры

ВИДЕО

КОМПОНЕНТЫ

Каталоги ссылок на Алиэкспресс на этом сайте:

Стараюсь оставлять ссылки только на проверенные крупные магазины, из которых заказываю сам. Также по первые ссылки ведут по возможности на минимальное количество магазинов, чтобы минимально платить за доставку. Если какие-то ссылки не работают, можно поискать аналогичную железку в каталоге Ардуино модулей . Также проект можно попробовать собрать из компонентов моего набора GyverKIT .

Источник

Еще один термостат на Arduino, но с OpenTherm

Читая первую часть заголовка многие из вас, наверняка, подумали – еще один термостат на многострадальной Arduino. И… Это правда – да, это очередной термостат для очередного котла, очередного дома, но правда это только отчасти – в статье я не хочу концентрироваться на самом устройстве – их (статей) действительно предостаточно. Несомненно, я опишу термостат, но больше хотел бы рассказать о том, как я связывал сам микроконтроллер с котлом. Итак, кому интересно – прошу…

Как все начиналось

Прежде всего хочу сказать, что я нисколько не программист и с настоящим микроконтроллером дела до этого не имел. Мое первое знакомство с МК AVR (да и вообще с МК) было еще в старшей школе, когда мне захотелось узнать, как же все-таки работает эта загадочная штука. Я прочел несколько статей и с тех пор в памяти у меня остались лишь отрывки, которые можно было описать всего двумя словами – DDR и PORT – на этом мои познания и обрывались. Потом был универ, 5-й курс – «Программирование микроконтроллеров» где мы все познакомились с MSC51 в виртуальной среде. Тут уже были и прерывания, и таймеры, и все остальное. Ну, вот с таким багажом знаний я и пришел к проблеме. Закончим на этой автобиографической ноте и перейдем к более интересной части.

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

Решалась эта проблема очень просто – датчиком OTC (Outside Temperature Compensation), который подключается к котлу и позволяет ему автоматически подстраивать температуру теплоносителя в зависимости от уличной температуры. Проблема, казалось бы, решена, но чтение сервис-мануала на котел (Ferolli Domiproject C24D) быстро растоптало мою надежду – подключение датчика внешней температуры в данной модели не предусмотрено. Все? Все. И вот, наверное, можно было бы закончить, но летом в котле в грозу до сих пор непонятным мне способом сгорает плата управления, и разговаривая с сервис-мэном (плату в последствии отремонтировали) я спросил, возможно ли подключение OTC на мой котел? Он ответил, что подключают, используя внешние термостаты. Это отложилось у меня в памяти, но я не особо на этом концентрировался до наступления холодов, а дальше всё таже проблема.

Листая все ту же сервисную инструкцию, но уже с целью посмотреть, как же подключается термостат, я заметил, что на те же клеммы подключается «OpenTherm регулятор». Тут-же я понял – вот ОНО! Поиск в Google «OpenTherm Arduino» же меня опять огорчил – ничего особо толкового. Был монитор сообщений, но это не то – мне и слушать, то нечего – нужен именно термостат.

Тут я наткнулся на статью habrahabr.ru/post/214257, окончание которой меня огорчило – автору без осциллографа так и не удалось связать котел с микроконтроллером. И тут уж если у человека знакомого с МК не вышло, то, что пробовать мне?! В интернете было найдено полное описание протокола Opentherm v2.2, что еще больше охлаждало мой пыл – физический уровень протокола был несколько замудренный – токовая петля в которой данные от котла передаются уровнем тока (5-7мА – низкий уровень, 17-23мА — высокий), а от термостата котлу уровнем напряжения ( Скетч

Формулу вычисления требуемой температуры теплоносителя долго крутил-выводил, пока она, в результате, не оказалась ПИ регулятором. В настройки добавил изменение коэффициентов и индикацию интегральной составляющей. До самого ПИ регулятора, для вычисления требуемой температуры я взял формулу из первой статьи, но без интегральной составляющей температура либо не соответствовала требуемой, либо, при большом пропорциональном коэффициенте не соответствовала требуемой и прыгала туда-сюда. Но чтение Хабра быстро дало мне ссылку с описанием ПИД-регулятора, который и был реализован.

Вообще я сделал два режима работы:

1) Прямое управление CH Setpoint – в результате получилось ни что иное как выносная передняя панель котла(ну плюс еще показывает температуры снаружи/внутри и влажность).
2) Собственно термостат с OTC.

Возможно, еще добавлю отключение датчика ОТС и настройку наклона кривой (коэффициент при (settings.indoor_target_temp-ext_temp)), но пока не вижу в этом смысла.

Пару слов добавлю о размещении датчика OTC. Сверлить дыры в окнах и стенах не хотелось, и, обдумывая эту проблему, взгляд случайно упал на старый шлейф MIDI разъема. Недолго думая я припаял провод датчика и загерметизировал место соединения термоклеем (т.к. оно будет находиться на улице). Сам датчик я разместил в тени за внешним блоком кондиционера, чтоб его не нагревали прямые солнечные лучи.



Энергосбережение

Те, кто пролистали код чуть внимательнее, наверное, заметили неизвестную библиотеку Power. Собственно на нее я возлагал надежды по снижению энергопотребления всего устройства. Смысл в том, чтобы вместо delay(1000) в главном цикле, отправлять МК в сон на 1с. Проблема в том, что режим сна нужен специфический, с работающим Timer2 для отправки/приема OpenTherm сообщений, как вы помните, они происходят асинхронно. Но увы, Proteus не очень хорошо работает со Sleep, и отладить эту часть я не смог. Сон работает, показания millis() корректируются (для этого я реализовал замер точности watchdog-таймера), но ОТ перестает работать. Именно с этой целью я и хотел приобрести Pro Mini (с последующим удалением стабилизатора и светодиодов) – меньше плата+ возможна работа на 3.3В, что дает надежду на питания прямиком от ОТ интерфейса. Привожу код библиотеки Power, для тех, кому интересно:

В процессе написания статьи, я значительно переписал код и переделал управление – поставил энкодер с кнопкой, добавил ему ручку, сделал аппаратный фильтр дребезга по классической схеме:

Стало значительно лучше – энкодер перестал проскакивать такты и добавлять лишние значения. Да и новая панель управления стала поудобнее, и должна ровно встать в корпус:

Дело осталось за самым малым – сделать корпус и повесить на место, но в этом и кроется самая большая проблема. Оказывается стоимость корпусов, отпечатанных на 3D-принтере, вплотную приближается к стоимости всего термостата, что совсем не радует мою ручную жабу, стоимость готовых радиолюбительских корпусов тоже не сильно адекватная для куска пластмассы. Наверное придется поступить, как подсказал друг:

— А ты знаешь, какие корпуса испокон веков лучше всего подходили для радиолюбительских поделок?
— Никакие?
— Тоже, конечно, вариант, но вообще – мыльницы.

Немного фото термостата во время испытаний и показаний в разных режимах на главном экране:



Ссылки

P.S. Ну и, естественно, прошу строго не судить – я не писатель — ошибки проверил, как мог. А результатом просто решил поделиться с публикой, т.к. больше рабочих библиотек, реализующих протокол OpenTherm, я в интернете не нашел.
P.P.S. В личку поступило много вопросов по поводу распиновки платы сопряжения, действительно не заметил своей оплошности. Итак, сверху вниз — +5В, TX (от контроллера к котлу), RX (от котла к контроллеру) — резистор 1,5к, GND.
Касательно проверки платы сопряжения:

Плату сопряжения проверить не сложно — подключаете к котлу, подаете питание. Вывод RX не используете(если есть лог. анализатор то будет проще потом) вывод TX (после R3) на +5В. На контактах к котлу должно быть около 20В. после этого вывод R3 на землю — должно быть меньше 7В (около 5ти). Это значит, что плата на передачу работает нормально. На прием можно проверить только после прошивки МК.

Источник

Adblock
detector