Началась эта история еще осенью, когда мне вдруг потребовалось небольшое помещение в доме, в котором поддерживалась бы стабильная температура +7 градусов. Ну, почти как серверная, только еще прохладнее.
Зимой это было несложно: поставить термодатчик и обогреватель, который бы включался, когда температура падает. А вот что делать летом? Очевидно, нужна холодильная установка!

Посмотрев на цены на промышленные холодильные установки - подумал, а что если сделать это самому? Нужно всего лишь взять простой ...

Не, простой кондиционер не получается. Оконный - нужно устанавливать в какое-нибудь окно, которого нет. Напольный, с трубой вывода воздуха - можно, но у него особенность: если с одной стороны он воздух выдувает - значит, с другой всасывает, то есть в помещение всегда будет идти поток теплого воздуха снаружи, а это плохо для охлаждения.
Оставалась сплит-система, но это казалось ужасно сложно и непросто.

Однако, если хорошенько поискать информацию - выяснилось, что на самом деле это не так уж и сложно.
По сути, имеем два блока: внешний и внутренний, соединенных между собой трассой из двух медных трубок, по которым бегает фреон.
Воздух, кстати, не бегает: удивительно, но среди офисных жителей довольно распространено мнение, что можно "включить сплит на обдув" чтобы "был свежий воздух". Не будет там никакого свежего воздуха, неоткуда ему взяться.

Внутренний блок, фактически - горизонтальный вентилятор, который гоняет воздух через трубки испарителя.
Он может быть красивым или уродливым, тихим или шумным, с наворотами вроде озонатора и ионизатора - но это всего лишь навороченный вентилятор.
Ах да, еще в нем находится плата управления внешним блоком.

А вот внешний блок, который выглядит "просто как вентилятор" - это как раз самая важная часть сплит-системы: там находится компрессор, который собственно говоря и заставляет всю эту систему холодить.
В простых системах он работает в режиме on|off, в сложных - его мощность управляется инвертором из внутреннего блока.

В общем решил использовать сплит, потому что если всё получится - будет холодильная комната, а если не получится - сейчас потренируюсь, а потом мне есть куда просто сплит поставить.
Был найден недорогой комплект, как раз on|off - потому что дальше потребовалось делать к нему собственную систему управления.
Трассы для сплитов продаются уже готовыми комплектами (спойлер: это НЕ луший вариант, но самый простой).
Оставалось всё это смонтировать.

Установка сплит-системы:

Не буду пытаться описать процесс лучше, чем описано у Каганова, просто в качестве "записки на память": что, как и какие инструменты нужны.

Внутренний блок устанавливается внутри помещения, внешний, внезапно, снаружи.
Соединены они двумя медными трубками, жидкостной (потоньше) и газовой (потолще). Соответственно, трубки необходимо как-то провести сквозь стену, вместе с кабелем питания внешнего блока и (если надо) шлангом вывода конденсата из внутреннего блока.
В бытовом случае тут особых сложностей нет: длина трассы около 5 метров, разница уровней внешнего и внутреннего блоков невелика, достаточно обеспечить уклон шланга для вывода конденсата, потому что вверх вода сама не течет.

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

В готовых комплектах трасс трубки уже развальцованы (и вот тут-то могут быть проблемы - плохая вальцовка потом может давать неплотность).
Настоящие установщики кондиционеров могут обрезать трубку труборезом (специальное устройство), и развальцевать вальцовкой - это тоже всё продается. Главное - максимально чисто и ровно.

Трубки из мягкой меди, и они неплохо гнутся. Настолько неплохо, что их можно случайно сплющить, поэтому для гибки труб нужен трубогиб. Их существует несколько разных видов: пружинные, рычажные, арбалетные - про всё это есть видео на Ютубе.
Я использовал рычажный, работает вполне приемлемо.

К внутреннему блоку эти трубки подключаются без особых нюансов, главное - ничего не передавить и не поломать.
У внешнего блока они подключаются к соответствующим портам - разьемам сбоку. Перепутать сложно, там гайки разного диаметра.

А вот дальше начинается шаманство:

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

Первое, что нужно сделать после сборки трассы - ваккуумировать ее. Для этого понадобится вакуумный насос, и манометрический коллектор - такая характерного вида штука с двумя манометрами, синим и красным, и тремя шлангами (можно обойтись и попроще - но такой удобней при заправке потом). Разумеется, это всё тоже продается.

Зачем ваккуумирование: не ради ваккуума, а для того чтобы убрать из трубок остатки воздуха вместе с парами влаги в нем. Чем меньше останется воздуха - тем меньше паров.

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

Вакуумный насос подключаем к среднему шлангу блока манометров, краник красного закрываем, он пока не нужен, шланг синего подключаем к сервисному порту ... и обнаруживаем, что он не подходит.
Потому что стандартные размеры гаек шлангов - 1/4 дюйма, как было всегда раньше для фреонов R22, а на новых системах, где R410A - размер резьбы 5/16. Типа, чтобы не путали случайно.
Разумеется, переходники продаются...

Итак подключаем "синий" манометр через переходник (при этом ниппель нажимается пимпочкой в переходнике и открывает клапан), открываем синий кран, включаем вакуумный насос - и смотрим, как стрелка манометра падает ниже нуля.
И ждем: полчаса - час. Вакуума больше не станет, но постепенно вся возможная влага в трубках будет испарена и выведена наружу.
Потом выключаем насос, закручиваем синий кран и смотрим на стрелку: она должна оставаться на месте, в минусе.
Оставляем это всё еще на часик: за это время воздух ниокуда не должен попасть в систему. Если стрелка сдвинулась - где-то неплотность, надо перепротянуть все гайки, и повторить ваккуумирование.

Ну вот, допустим, время прошло, вакуум на месте, всё работает - надо включать фреон. В новом блоке он уже есть внутри, просто закрыты краники.
На портах внешнего блока, куда подключены трубки, есть металлические колпачки - под ними видны вентили под ключ-шестигранник. Открываем вентиль на газовой трубе - против часовой до конца, без фанатизма. Фреон из блока распространяется по системе, манометр что-то покажет.
Потом открываем вентиль на жидкостной трубе - теперь вся система открыта и готова к работе.

А вот потом надо быстро-быстро открутить от сервисного порта переходник с синим шлангом - чтобы клапан успел закрыться раньше, чем фреон под давлением вылетит из трубы.
Но лучше было бы использовать переходник с вентилем - там специальная крутилка, которая нажимает на этот клапан: с ее помощью можно сначала освободить ниппель, потом уже спокойно откручивать гайку.

Останется подключить кабель к разьемам, и можно запускать…

Но в данном случае не всё так просто.
Начать с того, что обычный бытовой кондиционер не умеет холодить ниже 16 градусов. Не то, что "не может" - а просто не рассчитан.
И поэтому повнимательнее смотрим на разъемы внутреннего и внешнего блоков.

Специально был взят простейший on|off кондиционер: в нем нет плавной регулировки мощности, тут компрессор либо работает, либо не работает.
И на внутреннем и на внешнем блоке одинаковые наборы контактов для кабеля: 1, 2N, 3, 4 (и в комплекте "трассы" идет как раз 4-проводной кабель).

Можно снять верхнюю крышку внешнего блока и посмотреть, что куда идёт - или можно вместо внешнего блока подключить к проводу что-то типа неоновых лампочек и посмотреть куда и когда подается напряжение.
В данном конкретном случае, назначение контактов следующее:
2N - это 0, нулевой провод
1 - это 220В питания компрессора
3 - 220В для переключения клапана "холодить/греть" (кондиционер хоть и самый дешевый - но умеет греть тоже)
4 - 220В питания вентилятора внешнего блока

Соответственно, если подать 220В на 1 и 4 - кондиционер "холодит", если на 1,3 и 4 - "греет".
В нормальном случае за это отвечает внутренний блок: он отслеживает температуру в помещении, сравнивает ее с заданной, включает и выключает компрессор, клапан и кулер, в зависимости от настроек и режима работы.
Но он не умеет держать температуру ниже 16! Поэтому пришлось делать свой блок управления...

Вариант №1: термореле

Как уже говорилось, если соединить 1 и 4, и подать на них 220 (относительно 0) - включается сразу компрессор и кулер, кондиционер начинает холодить. Если выключить 220 - перестает. Можно отслеживать температуру, включать и выключать. Ну, а чтобы этим было удобнее управлять - поставить ESP8266, чтобы читала температуру с датчика DS1820 и включала реле.

Но выяснилось, что при определенных условиях (низкой температуре на улице, недавнем выключении) включается компрессор как-то странно, с грохотом, как будто клинит. А если постоит сильно подольше - включается нормально.
Но у нас же микроконтроллер, и можно повесить несколько датчиков, на входных и выходных трубках!

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

Вариант №2: умное термореле

Был добавлен, как сейчас принято говорить, "период охлаждения" 3 минуты: сразу после выключения компрессора кулер работает еще 3 минуты, и выключается потом.
А если в это время поступает команда на включение компрессора - она будет исполнена только после того как этот период закончится.
Соответственно, компрессор и кулер должны включаться разными реле, заодно добавлено третье, для клапана "обогрева", вдруг понадобится.

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

Но теперь возникла другая проблема:
Обычная домашняя техника работает через систему бесперебойного питания, поэтому незначительные проблемы с электричеством мы просто не замечаем, но кондиционер работает прямо от сети, и вот она-то, оказывается, довольно часто "моргает".

Оказалось, что внутренний блок при этом "засыпает", требуется пнуть его с пульта вручную - а вот компрессор работает, пытаясь охлаждать, пока внутренний блок "спит" и обдув не работает.
Значит, нужно его как-то будить.
Лезть в схему не хотелось, поэтому было добавлено IR-управление внутренним блоком.

Вариант №3: добавляем пульт управления

Как вообще работают эти пульты с инфракрасным управлением?
Сам пульт - что-то вроде специализированного микропроцессора, который моргает инфракрасным светодиодом. Светодиод в общем такой же, как в подсветках видеокамер, главное - правильно им моргать.
А вот приемник - сложнее: часто используется специальная микросхема-фотоприемник, настроенная на стандартную частоту модуляции 38 кГц, со встроенным усилителем - она выделяет сигнал среди шумов.
Можно конечно использовать и простой фотодиод - но тогда нужно строить систему усиления и фильтрации сигналов, поэтому чаще просто используют готовое, и тогда всё сводится к передаче последовательности битов кода.

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

Сложность состояла в том, что в отличии от пультов от обычной бытовой техники, типа ТВ и DVD, у пультов кондиционеров протокол обмена сложнее: вместо отправки простого кода кнопки отправляется большой пакет данных о текущих настройках на пульте - режим, температура, режимы обдува и т.д.
Известная ардуиновская библиотека IRremote определяла лишь, что у пакета данных длина 97 или 98 бит, и всё.

К счастью, нашлась подходящая библиотека, поддерживающая именно такой протокол (хотя можно было бы просто отправлять дампы, скопированные с пульта): IRremoteESP8266.
Протокол определился как Neoclima, что позволило не просто повторять дампы от пульта, но и давать осмысленные команды.

Оставалось подключить к ESP излучающий ИК-диод, вынести его на проводе и расположить напротив внутреннего блока.

Теперь логика работы стала такой:
После подачи питания - "период охлаждения" (вдруг это "свет моргал"?): компрессор выключен, кулер работает, на внутренний блок - команда выключения.
После "периода охлаждения" - кулер выключается.
При включении "холода" - включаем компрессор и кулер, отправляем команду на включение внутреннего блока.
При выключении "холода" - выключаем компрессор, отправляем команду выключения на блок и снова начинается "период охлаждения", когда кулер работает.

...
#define IR_SEND_PIN         15

void to_sleep();
void to_cooling();
void to_warming();

// IR control =============================================
#include <IRremoteESP8266.h>
#include <IRsend.h>
#include <ir_Neoclima.h>

IRNeoclimaAc ac(IR_SEND_PIN);

// ========================================================

/ Controls ===============================================
#define PIN_COMPRESSOR  13
#define PIN_VALVE       12
#define PIN_COOLER      14

// Modes
#define M_SLEEP       0
#define M_COOLING     1
#define M_WARMING     2
#define M_WAIT        3

int state;
int wanted;
byte f_cooler;
byte f_compressor;
byte f_valve;

unsigned long wait_timer = 0;
#define WAITING_PERIOD 180000    // 3 minutes between change

void CtlSetup(){
  pinMode(PIN_COMPRESSOR,OUTPUT);
  pinMode(PIN_VALVE,OUTPUT);
  pinMode(PIN_COOLER,OUTPUT);

  state = M_COOLING;
  f_cooler = 0;
  f_compressor = 0;
  f_valve = 0;

  digitalWrite(PIN_COOLER, HIGH);
  to_sleep();
}

void CtlLoop(){
  if(state == M_WAIT && millis() > (wait_timer + WAITING_PERIOD)){
    state = M_SLEEP;
    if(wanted == M_COOLING) {
      to_cooling();
    } else
    if(wanted == M_WARMING) {
      to_warming();
    } else {
      digitalWrite(PIN_COOLER, LOW);
      f_cooler = 0;
    }
  }
  // M_SLEEP - nothing
  // M_WAIT - waiting
}

void to_sleep(){
  if(state != M_SLEEP && state != M_WAIT){
    wait_timer = millis();
    state = M_WAIT;
    wanted = M_SLEEP;
  }
  digitalWrite(PIN_COMPRESSOR, LOW);
  f_compressor = 0;
  digitalWrite(PIN_VALVE, LOW);
  f_valve = 0;

  ac.off();
  ac.send();
}

void to_cooling(){
  if(state == M_SLEEP){
    digitalWrite(PIN_VALVE, LOW);
    f_valve = 0;
    digitalWrite(PIN_COMPRESSOR, HIGH);
    f_compressor = 1;
    digitalWrite(PIN_COOLER, HIGH);
    f_cooler = 1;
    state = M_COOLING;

    ac.setPower(true);
    ac.setFan(kNeoclimaFanHigh);
    ac.setMode(kNeoclimaCool);
    ac.setTemp(16);
    ac.setSwingV(true);
    ac.setSwingH(true);
    ac.setIon(true);
    ac.setLight(false);
    ac.send();
  }else{
    wanted = M_COOLING;
  }
}

void to_warming(){
  if(state == M_SLEEP){
    digitalWrite(PIN_VALVE, HIGH);
    f_valve = 1;
    digitalWrite(PIN_COMPRESSOR, HIGH);
    f_compressor = 1;
    digitalWrite(PIN_COOLER, HIGH);
    f_cooler = 1;
    state = M_WARMING;

    ac.setPower(true);
    ac.setFan(kNeoclimaFanHigh);
    ac.setMode(kNeoclimaHeat);
    ac.setTemp(16);
    ac.setSwingV(true);
    ac.setSwingH(true);
    ac.setIon(true);
    ac.setLight(false);
    ac.send();
  }else{
    wanted = M_WARMING;
  }
}
// ========================================================

...

// MQTT processing
void msg_callback(char* topic, byte* payload, unsigned int length) {

  String str_topic = topic;

...
    if(!strncmp((char *)payload, "sleep", length)){
      to_sleep();
    }
    if(!strncmp((char *)payload, "cooling", length)){
      to_cooling();
    }
    if(!strncmp((char *)payload, "warming", length)){
      to_warming();
    }
...
}

void setup() {

  ac.begin();

  WifiSetup();

  MqttSetup();

  TimeSetup();

  CtlSetup();

}

void loop() {

  WifiLoop();

  MqttLoop();

  CtlLoop();

...

  delay(100);
}

Схема включения:

Разьем J1 - питание 220В и подключение внешнего блока, J2 - датчики DS1820, J3 - ИК-светодиод.

Кстати, про "поддельные" датчики DS1820

Не раз приходилось слышать про то, что сейчас купить настоящие DS1820 можно только в избранных магазина и дорого.
А всё остальное - китайские подделки, которые не работают.
Это и правда, и неправда одновременно.

Дело вот в чем: по самой идее 1-wire устройств, к которым относятся DS1820, все устройства подключаются к двухпроводной шине, то есть одна линия - "земля", и одна линия - данные, она же - питание (поэтому и 1-wire).
При этом питание для устройств передается за счет того, что на этой линии в покое напряжение 5В, а вот данные передаются за счет прижимания ее к "земле": в каждом чипе есть специальный транзистор который коротит сигнальную линию на "землю", передавая код данных.
В момент передачи данных питание этого чипа идет за счет внутреннего конденсатора, который заряжался пока линия была в покое - хотя в принципе у чипа есть третья нога, на которую можно просто подать постоянные 5В.

Это позволяло строить довольно длинные сети 1-wire, подключая к ним много датчиков, экономя на прокладке проводов.
Датчики оказались удобны и востребованы, но сейчас в подавляющем числе случаев они подключаются как раз по трехпроводной схеме, с питанием - да вот взять хотя бы все эти примеры "подключаем DS1820 к ардуино", не говоря уже о всяких термореле с единственным датчиком.

И вот тут видимо сыграла роль экономия: добавить несколько лишних p-n переходов на кристалле несложно, но добавить конденсатор - это уже отдельный дополнительный технологический процесс.
Производство поддельных функционально аналогичных чипов успешно освоили, но раз уж всё равно почти везде используется трехпроводная схема - можно же удешевить производство, выпустив чипы без встроенного конденсатора. И упростили.
В результате такие чипы не работают в двухпроводной схеме.

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

Для реле и ESP сделана плата

Поскольку изделие штучное и ждать не хотелось - плату сделал по фоторезистивной технологии.
К слову, вот чем хорош SMD-монтаж - нет той возни со сверлением кучи отверстий под каждый элемент. Надо добавить резисторов или транзисторов - пожалуйста, никаких проблем, это просто картинка на бумаге, а бумага всё стерпит.
Жаль, что силовые реле этого пока не умеют.

Всё закрыто в коробку и убрано с глаз подальше.
Теперь оно работает само, а в "холодильнике" - 7-8 градусов.
Ну и конечно, этим можно управлять через MQTT.

Вон та синяя линия - это температура помещения, сиреневая вверху - уличная, красная - жидкостная труба, зеленая - газовая.
Хорошо видно как при отключении компрессора температура трубок сразу прыгает вверх.