Как всё началось

Я уже несколько лет строю дом своими руками. Отопление в нём хочу сделать на тепловом насосе. Готовые решения стоят как крыло самолёта, поэтому давно зреет идея: взять обычный наружный блок кондиционера (без инвертора, «старт‑стоп»), убрать его родную автоматику и поставить свой контроллер на ESP32. Комплектующие для этого я собираю понемногу.

Сразу оговорка: это пока только виртуальная сборка. К реальной я ещё не приступал и когда приступлю, не знаю. Дом строится, деньги и время уходят в первую очередь на него. Всё описанное ниже работает в симуляторе, а не в подвале на живом компрессоре.

Логичный первый шаг: написать прошивку и проверить логику. Проверять на настоящем компрессоре, который не прощает ошибок, не хотелось. Захотел что‑то вроде Wokwi, но чтобы там можно было собрать ещё и силовую часть: реле, контактор, автомат, компрессор на 230 В. Такого я не нашёл и написал сам. Так проект про тепловой насос превратился в проект про симулятор: PinPort, онлайн‑симулятор ESP32, Arduino и цепей 12 и 230 В. Тепловой насос стал его самым сложным примером и хорошим тестом на прочность.

Часть кода написана вместе с нейросетью (вайбкодинг), и я этого не скрываю.

Два варианта тепловых насосов

Оба открываются в браузере:

Основа у них общая: наружный блок кондиционера, ESP32, ЭРВ на шаговом двигателе, пять состояний автомата, ПИ‑регулирование перегрева, веб‑панель. Различия такие:

Вода‑вода

Воздух‑вода

Источник тепла

Скважина

Уличный воздух

Датчики DS18B20

11 на трёх линиях

6 на двух линиях

Датчики протока

2 (скважина и пол)

1 (пол)

Насосы

2

1

Реле

компрессор, насос скважины, насос пола, авария

компрессор, вентилятор блока, насос пола, четырёхходовой клапан

Особенности

защита от промерзания испарителя

оттайка, погодозависимая цель, защита воды от замерзания

Соединений на схеме

78

61

Сначала общая часть на примере вода‑вода, потом то, что добавляет воздух.

Принцип работы

Источник тепла «кипятит» фреон в испарителе (в воздушном варианте это змеевик наружного блока). Компрессор сжимает пар, в конденсаторе фреон отдаёт тепло воде тёплого пола. Электронный расширительный вентиль (ЭРВ) на шаговом двигателе дросселирует жидкость обратно к испарителю. Контроллер решает, когда пускать и останавливать установку, и следит, чтобы она не убила себя.

Что на схеме (вода‑вода)

ESP32 DevKit v1 и вокруг неё:

  • 11 датчиков DS18B20 на трёх линиях 1-Wire;

  • 2 датчика давления фреона (на схеме потенциометры);

  • ЭРВ на шаговом двигателе;

  • 4 реле: компрессор, насос скважины, насос пола, авария;

  • 2 датчика протока и кнопка «пуск / сброс»;

  • силовая часть 230 В: ввод, два автомата, контактор, однофазные двигатели компрессора и двух насосов, лампа аварии.

Задействовано 18 выводов платы, всего 78 соединений.

общая схема теплового насоса вода-вода
общая схема теплового насоса вода‑вода

Датчики температуры

DS18B20 отвечают по одному проводу, и на один вывод их вешают параллельно: у каждого свой 64-битный адрес. В варианте вода‑вода три линии:

Вывод

Линия

Датчики

D4

Фреон

всасывание, нагнетание, жидкость после конденсатора, вход испарителя после ЭРВ

D5

Скважина

вход и выход испарителя, улица

D23

Тёплый пол

обратка, подача, помещение, корпус компрессора

На каждую линию нужен один резистор 4,7 кОм между DATA и 3V3. Датчик на трубе крепят хомутом с термопастой и закрывают теплоизоляцией, иначе он меряет воздух в подвале.

Скетч не полагается на порядок опроса. У каждой роли есть поле с адресом датчика. На реальной сборке адреса вписываются по одному: подержал датчик в руке, увидел в списке линии, какой «потеплел». В симуляторе адреса заданы свойством детали на схеме.

Давление, кипение и перегрев

Давление фреона — это его температура насыщения. В скетче лежит таблица «давление → температура» для семи хладагентов: R22, R410A, R134a, R407C, R404A, R290, R600a. Между узлами идёт интерполяция. Из неё считаются:

  • перегрев = температура на всасывании − температура кипения по низкому давлению. Цель 4–7 К. Меньше: в компрессор пойдёт жидкость. Больше: испаритель работает не на полную;

  • переохлаждение = температура конденсации по высокому давлению − температура жидкости.

Для смесей (R407C, R404A) в таблице средняя температура между кипением и конденсацией. У них есть температурный глайд 4–7 К, и перегрев по ним надо считать с оглядкой на него.

Про железо: реальные датчики давления 0,5–4,5 В на 5 В питания подключают к АЦП через делитель (10 и 20 кОм), потому что АЦП ESP32 не переносит 5 В. На схеме стоят потенциометры на 3,3 В. Коэффициент делителя, шкалы (17,5 бар на низкой стороне, 45 на высокой) и порог обрыва (меньше 0,3 В) настраиваются в панели.

ЭРВ и ПИ‑регулятор

Шаговым двигателем управляет AccelStepper:

  1. Старт. Плата не знает положения вентиля, поэтому гонит его в «закрыто» с запасом в 20 шагов на упор. В журнале появляется «ЭРВ закрыт, положение 0».

  2. Перед пуском. В варианте вода‑вода, пока насосы гоняют воду, вентиль открыт широко (eevPre, по умолчанию на весь ход): давления выравниваются, и компрессору легче стартовать. В воздушном варианте вентиль перед пуском встаёт сразу на стартовое положение.

  3. После пуска компрессора вентиль стоит на стартовом положении (220 шагов).

  4. Через tEev секунд включается скоростной ПИ‑регулятор. Каждые 5 секунд:

шаг = Kp·(ошибка − прошлая ошибка) + Ki·ошибка·5 с, где ошибка = перегрев − цель.

Границы хода (66–480 шагов), Kp, Ki и цель — в панели.

Для реального ЭРВ понадобится драйвер: ULN2003/ULN2803 для униполярного (5 проводов, 12 В), L298N или DRV8833 для биполярного. Порядок обмоток и число шагов на полный ход берите из паспорта. В симуляторе двигатель подключён к плате напрямую, для проверки логики этого хватает.

Автомат состояний

Пять состояний: стоп → запуск насосов → работа → выбег насосов → авария.

Пуск (вода‑вода):

  1. включается насос скважины;

  2. через 2 секунды насос тёплого пола;

  3. ждём проток по обоим контурам (не дождались: авария);

  4. выдерживаем tPumpBefore секунд, ЭРВ уже открыт;

  5. включаем компрессор.

В воздушном варианте пуск короче: насос пола, проток, выдержка, компрессор и вместе с ним вентилятор блока.

Стоп идёт обратным порядком: сначала компрессор (не раньше, чем через tMinRun секунд после пуска), ЭРВ закрывается, насосы работают ещё tPumpAfter секунд, чтобы унести тепло. Между двумя пусками компрессора выдерживается пауза tMinOff.

Решение «греть» принимается в одном из режимов: «всегда» (ручной), по температуре помещения, подачи или обратки тёплого пола, с гистерезисом.

Защиты

  • низкое давление: ниже порога дольше 5 сек (не проверяется первые tGrace секунд после пуска, а в воздушном варианте ещё и во время оттайки);

  • высокое давление: выше порога дольше 1 с;

  • перегрев нагнетания: выше предела дольше 2 сек (в варианте вода‑вода проверяется ещё и корпус компрессора);

  • промерзание испарителя (вода‑вода): вода на выходе холоднее порога дольше 5 с;

  • нет протока, при пуске и во время работы;

  • пропал датчик температуры или датчик давления;

  • «лёд не тает» (воздух‑вода): три неудачные оттайки подряд.

Часть аварий устраняется сама: через tRetry секунд плата пробует снова, до трёх попыток. Счётчик сбрасывается после 10 минут работы без аварий. Аварии по нагнетанию, датчикам и неудачной оттайке остаются до ручного сброса: кнопка на панели, долгое нажатие кнопки на плате или команда reset в порт. В варианте вода‑вода реле 4 включено, пока идёт авария (к нему подключают лампу, сирену или вход котла). В воздушном варианте четвёртое реле занято клапаном, поэтому о аварии сигнализирует часто мигающий светодиод на плате.

Важно. Контроллер не должен быть единственной защитой. Для настоящего компрессора нужны реле высокого и низкого давления, включённые последовательно в цепь катушки контактора. Они отключат компрессор, даже если плата зависла или пропало питание датчика.

Воздух‑вода: что добавляется

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

Схема и датчики

Четыре реле (модуль AC‑DC‑ESP32-Relay‑x4): компрессор через контактор, вентилятор блока, насос тёплого пола, катушка четырёхходового клапана. На схеме катушка показана лампой на 20 Вт. Задействовано 16 выводов платы.

Шесть DS18B20 на двух линиях:

Вывод

Линия

Датчики

D4

Фреон

всасывание, нагнетание, змеевик наружного блока

D5

Вода и воздух

обратка, подача, улица

Датчик змеевика прижимают к трубе в середине змеевика, а не к коллектору: от него зависит, когда начнётся и закончится оттайка.

общая схема теплового насоса воздух-вода
общая схема теплового насоса воздух‑вода

Погодозависимая цель

Цель по температуре подачи поднимается на wcSlope градусов на каждый градус мороза. Пример: цель 30 °C при 0 °C и коэффициент 0,4 К/К дают 34 °C при −10 °C. Если на улице холоднее заданного предела (по умолчанию −20 °C), блок не запускается: у большинства наружных блоков это нижняя граница рабочего диапазона.

Четырёхходовой клапан

Катушка стоит в положении «нагрев» только пока идёт пуск и работа. За положение отвечает константа VALVE_HEAT_ON: у одних блоков катушка под напряжением в нагреве, у других в охлаждении. Выбирать по схеме своего блока.

Оттайка

Иней на змеевике — не авария, а рабочее состояние: он растёт, теплообмен падает. Скетч считает змеевик обмёрзшим, если он холоднее порога (−3 °C) и холоднее уличного воздуха на 8 К и больше, и так держится минуту (в симуляторе 3 секунды). Раньше, чем через defrostEvery секунд после пуска или прошлой оттайки, оттайка не начинается.

Ход оттайки:

  1. компрессор останавливается, ЭРВ открывается на максимум, давления выравниваются;

  2. через tValve секунд переключается клапан (нагнетание идёт в змеевик), ещё через 3 секунды включается компрессор, вентилятор молчит;

  3. оттайка заканчивается, когда змеевик прогрелся до +10 °C, или вышло время defrostMax, или подача тёплого пола остыла ниже порога. Оттайка забирает тепло у воды, и лучше её прервать, чем заморозить конденсатор;

  4. компрессор останавливается, пауза, клапан возвращается, компрессор и вентилятор включаются снова.

Три оттайки подряд, закончившиеся по времени, а не по теплу, — это авария «лёд не тает»: сломан клапан, датчик стоит не там или не хватает фреона. Пауза на выравнивание — главное, что защищает компрессор: без неё он запускается против давления и выбивает защиту.

Защита воды от замерзания

Пока установка стоит, а вода в контуре остыла ниже 5 °C, включается насос тёплого пола и гоняет воду, пока она не согреется на 3 градуса. Это не заменяет антифриз и обогрев наружных труб, но спасает от глупой поломки при выключенной установке. Для уличной части контура применяйте незамерзающую жидкость.

Веб‑панель

Панель сделана на библиотеке GyverLibs/Settings:

  • «Сейчас»: состояние, авария, светодиоды реле, проток (и ход оттайки в воздушном варианте);

  • «Управление»: включение, режим, цель (в воздушном с поправкой на погоду), фреон, сброс аварии и аварийный стоп;

  • «Температуры»: все датчики;

  • «Фреон и ЭРВ»: давления, кипение, конденсация, перегрев, положение вентиля;

  • дальше: оттайка (в воздушном), защиты, задержки, ЭРВ, датчики давления, адреса датчиков и журнал.

Настройки хранятся в NVS и переживают выключение.

Библиотека Web-UI Алекса Гайвера (Settings)
Библиотека Web‑UI Алекса Гайвера (Settings)

Как это выглядит внутри симулятора

Коротко о том, как устроен PinPort:

  • Схема хранится текстом, её можно положить в git.

  • Прошивка собирается настоящим arduino‑cli в одноразовом контейнере без сети, а исполняется интерпретатором в Web Worker. Сервер в работе схемы не участвует.

  • Есть двухканальный осциллограф, логический анализатор, замеры тока, напряжения и мощности в каждой ветке, тепловая карта проводов.

  • Wi‑Fi эмулируется на уровне сокетов: веб‑сервер и HTTP‑запросы работают без интернета.

  • Ошибки компилятора переведены на русский, а разбор схемы находит перепутанные SDA и SCL до запуска.

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

Чего симулятор не умеет

Главное ограничение: температуры и давления в модели не связаны друг с другом. Тепло от компрессора к воде и к змеевику модель не переносит. Значения задаются руками: свойствами деталей и ручками потенциометров.

Поэтому регулятор ЭРВ виден в работе (поднимите температуру всасывания: вентиль откроется), оттайка тоже (охладите змеевик: она начнётся, нагрейте: закончится), но их результат на температуры не влияет. Настроить Kp, Ki и пороги оттайки по такому симулятору нельзя. Он проверяет логику: последовательность пуска, оттайку, защиты, реакцию на обрывы и аварии, веб‑панель. Термодинамику придётся настраивать уже на железе.

Что попробовать

Тепловой насос вода‑вода:

  1. Нажмите «Запустить». Плата найдёт датчики на трёх линиях (4, 3 и 4 в мониторе порта) и найдёт ноль ЭРВ. Сценарий сам переведёт ползунки протока fc и fh в положение «течёт». Без сценария сделайте это мышью, иначе установка не запустится.

  2. Нажмите кнопку на схеме: включится насос скважины, через 2 секунды насос пола, затем компрессор. На схеме сработают реле и контактор.

  3. Откройте веб‑интерфейс, смените фреон на R22 и посмотрите, как пересчитаются температуры кипения.

  4. Поднимите температуру датчика tf1 (“Всасывание”): вырастет перегрев, и через несколько секунд ЭРВ откроется.

  5. Переведите ползунок fc влево: через 3 секунды компрессор остановится, реле аварии замкнётся, в панели появится «нет протока скважины». Верните ползунок и долгим нажатием кнопки сбросьте аварию.

  6. Покрутите ручку ph выше 80%: сработает защита по высокому давлению. ph и pl ниже 5%: обрыв датчика.

Тепловой насос воздух‑вода:

  1. Нажмите «Запустить». Плата найдёт по три датчика на каждой линии и найдёт ноль ЭРВ. Сценарий переведёт ползунок протока fl в положение «течёт».

  2. Нажмите кнопку на схеме: включится насос пола и катушка клапана, через несколько секунд компрессор и вентилятор блока (реле k1 и k2, контактор).

  3. Нажмите на деталь to (“улица”) и задайте +1 °C, затем на te (змеевик) задайте −8 °C. Через несколько секунд начнётся оттайка: компрессор встанет, клапан переключится (катушка погаснет), вентилятор замолчит, компрессор пойдёт на горячий газ.

  4. Поднимите te до +12 °C: оттайка закончится, всё вернётся.

  5. Переведите ползунок fl влево: через 3 секунды компрессор остановится, в журнале появится «нет протока тёплого пола». Верните ползунок и долгим нажатием кнопки сбросьте аварию.

Что заменить при сборке на железе

  • поменять SIM_DEMO на 0: вернутся реальные задержки (пауза 5 минут, выбег 1 минута, оттайка до 10 минут в воздушном варианте);

  • поставить драйвер ЭРВ и датчики давления с делителем;

  • реле: модуль AC‑DC‑ESP32-Relay‑x4 с выводами 25, 26, 32, 33. Если реле включаются низким уровнем, поменять RELAY_ON;

  • в воздушном варианте выбрать VALVE_HEAT_ON по схеме своего блока. Если у вентилятора блока свой контроллер, его можно оставить на родной плате и убрать реле 2;

  • контактор компрессора и его защиту по мощности подобрать по паспорту блока. В симуляторе это контактор на катушку 230 В и автомат C16.

Скетчи занимают 964 (вода‑вода) и 1028 (воздух‑вода) строк. Используются библиотеки WiFi, Preferences, LittleFS, OneWire, DallasTemperature, AccelStepper и Settings. На сервере сборки они уже установлены.

Итого

Реальный тепловой насос пока остаётся планом. Зато есть:

  • проверенная в симуляторе логика управления для двух схем, с защитами и оттайкой;

  • инструмент, в котором можно собрать и обкатать такую схему без риска сжечь компрессор;

  • повод дойти до реальной сборки, когда дом позволит.

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

Буду рад критике, особенно от тех, кто уже делал контроллеры для тепловых насосов: где логика защит слабая, что забыл, как бы вы делали регулирование перегрева и критерии оттайки.

Проект: pinport.ru · вода‑вода · воздух‑вода