Как всё началось
Я уже несколько лет строю дом своими руками. Отопление в нём хочу сделать на тепловом насосе. Готовые решения стоят как крыло самолёта, поэтому давно зреет идея: взять обычный наружный блок кондиционера (без инвертора, «старт‑стоп»), убрать его родную автоматику и поставить свой контроллер на 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:
Старт. Плата не знает положения вентиля, поэтому гонит его в «закрыто» с запасом в 20 шагов на упор. В журнале появляется «ЭРВ закрыт, положение 0».
Перед пуском. В варианте вода‑вода, пока насосы гоняют воду, вентиль открыт широко (
eevPre, по умолчанию на весь ход): давления выравниваются, и компрессору легче стартовать. В воздушном варианте вентиль перед пуском встаёт сразу на стартовое положение.После пуска компрессора вентиль стоит на стартовом положении (220 шагов).
Через
tEevсекунд включается скоростной ПИ‑регулятор. Каждые 5 секунд:
шаг = Kp·(ошибка − прошлая ошибка) + Ki·ошибка·5 с, где ошибка = перегрев − цель.
Границы хода (66–480 шагов), Kp, Ki и цель — в панели.
Для реального ЭРВ понадобится драйвер: ULN2003/ULN2803 для униполярного (5 проводов, 12 В), L298N или DRV8833 для биполярного. Порядок обмоток и число шагов на полный ход берите из паспорта. В симуляторе двигатель подключён к плате напрямую, для проверки логики этого хватает.
Автомат состояний
Пять состояний: стоп → запуск насосов → работа → выбег насосов → авария.
Пуск (вода‑вода):
включается насос скважины;
через 2 секунды насос тёплого пола;
ждём проток по обоим контурам (не дождались: авария);
выдерживаем
tPumpBeforeсекунд, ЭРВ уже открыт;включаем компрессор.
В воздушном варианте пуск короче: насос пола, проток, выдержка, компрессор и вместе с ним вентилятор блока.
Стоп идёт обратным порядком: сначала компрессор (не раньше, чем через 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 секунд после пуска или прошлой оттайки, оттайка не начинается.
Ход оттайки:
компрессор останавливается, ЭРВ открывается на максимум, давления выравниваются;
через
tValveсекунд переключается клапан (нагнетание идёт в змеевик), ещё через 3 секунды включается компрессор, вентилятор молчит;оттайка заканчивается, когда змеевик прогрелся до +10 °C, или вышло время
defrostMax, или подача тёплого пола остыла ниже порога. Оттайка забирает тепло у воды, и лучше её прервать, чем заморозить конденсатор;компрессор останавливается, пауза, клапан возвращается, компрессор и вентилятор включаются снова.
Три оттайки подряд, закончившиеся по времени, а не по теплу, — это авария «лёд не тает»: сломан клапан, датчик стоит не там или не хватает фреона. Пауза на выравнивание — главное, что защищает компрессор: без неё он запускается против давления и выбивает защиту.
Защита воды от замерзания
Пока установка стоит, а вода в контуре остыла ниже 5 °C, включается насос тёплого пола и гоняет воду, пока она не согреется на 3 градуса. Это не заменяет антифриз и обогрев наружных труб, но спасает от глупой поломки при выключенной установке. Для уличной части контура применяйте незамерзающую жидкость.
Веб‑панель
Панель сделана на библиотеке GyverLibs/Settings:
«Сейчас»: состояние, авария, светодиоды реле, проток (и ход оттайки в воздушном варианте);
«Управление»: включение, режим, цель (в воздушном с поправкой на погоду), фреон, сброс аварии и аварийный стоп;
«Температуры»: все датчики;
«Фреон и ЭРВ»: давления, кипение, конденсация, перегрев, положение вентиля;
дальше: оттайка (в воздушном), защиты, задержки, ЭРВ, датчики давления, адреса датчиков и журнал.
Настройки хранятся в NVS и переживают выключение.

Как это выглядит внутри симулятора
Коротко о том, как устроен PinPort:
Схема хранится текстом, её можно положить в git.
Прошивка собирается настоящим arduino‑cli в одноразовом контейнере без сети, а исполняется интерпретатором в Web Worker. Сервер в работе схемы не участвует.
Есть двухканальный осциллограф, логический анализатор, замеры тока, напряжения и мощности в каждой ветке, тепловая карта проводов.
Wi‑Fi эмулируется на уровне сокетов: веб‑сервер и HTTP‑запросы работают без интернета.
Ошибки компилятора переведены на русский, а разбор схемы находит перепутанные SDA и SCL до запуска.
Для этого проекта пришлось научить симулятор гибридным схемам, где в одной цепи живут плата контроллера, 12 В и 230 В. Реле и контактор замыкают силовые цепи, а двигатели, автоматы и лампа ведут себя как в схеме на 230 В.
Чего симулятор не умеет
Главное ограничение: температуры и давления в модели не связаны друг с другом. Тепло от компрессора к воде и к змеевику модель не переносит. Значения задаются руками: свойствами деталей и ручками потенциометров.
Поэтому регулятор ЭРВ виден в работе (поднимите температуру всасывания: вентиль откроется), оттайка тоже (охладите змеевик: она начнётся, нагрейте: закончится), но их результат на температуры не влияет. Настроить Kp, Ki и пороги оттайки по такому симулятору нельзя. Он проверяет логику: последовательность пуска, оттайку, защиты, реакцию на обрывы и аварии, веб‑панель. Термодинамику придётся настраивать уже на железе.
Что попробовать
Тепловой насос вода‑вода:
Нажмите «Запустить». Плата найдёт датчики на трёх линиях (4, 3 и 4 в мониторе порта) и найдёт ноль ЭРВ. Сценарий сам переведёт ползунки протока
fcиfhв положение «течёт». Без сценария сделайте это мышью, иначе установка не запустится.Нажмите кнопку на схеме: включится насос скважины, через 2 секунды насос пола, затем компрессор. На схеме сработают реле и контактор.
Откройте веб‑интерфейс, смените фреон на R22 и посмотрите, как пересчитаются температуры кипения.
Поднимите температуру датчика
tf1(“Всасывание”): вырастет перегрев, и через несколько секунд ЭРВ откроется.Переведите ползунок
fcвлево: через 3 секунды компрессор остановится, реле аварии замкнётся, в панели появится «нет протока скважины». Верните ползунок и долгим нажатием кнопки сбросьте аварию.Покрутите ручку
phвыше 80%: сработает защита по высокому давлению.phиplниже 5%: обрыв датчика.
Тепловой насос воздух‑вода:
Нажмите «Запустить». Плата найдёт по три датчика на каждой линии и найдёт ноль ЭРВ. Сценарий переведёт ползунок протока
flв положение «течёт».Нажмите кнопку на схеме: включится насос пола и катушка клапана, через несколько секунд компрессор и вентилятор блока (реле
k1иk2, контактор).Нажмите на деталь
to(“улица”) и задайте +1 °C, затем наte(змеевик) задайте −8 °C. Через несколько секунд начнётся оттайка: компрессор встанет, клапан переключится (катушка погаснет), вентилятор замолчит, компрессор пойдёт на горячий газ.Поднимите
teдо +12 °C: оттайка закончится, всё вернётся.Переведите ползунок
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 · вода‑вода · воздух‑вода