. ИК-контроллер бытового кондиционера или реверс-инжиниринг пульта ДУ
ИК-контроллер бытового кондиционера или реверс-инжиниринг пульта ДУ

ИК-контроллер бытового кондиционера или реверс-инжиниринг пульта ДУ

Приветствую, уважаемые хабрачитатели! В этой, первой для меня, статье я хотел поделиться своими исследованиями и наработками. Имея в своей квартире кондиционер я ощущал необходимость управлять им когда меня нет дома. Возвращаясь с дачи или просто с работы и, включив кондиционер, приходится ждать некоторое время пока не спадет жара. А хочется приходить в уже легкую прохладу. «Вот бы можно было удаленно включить кондишн. » — подумал я.

Итак, у меня имеется сплит-система Panasonic CS-XE9DKE. Идея управлять кондиционером сводилась к созданию «своего» ИК-пульта. Назовем его «ИК-контроллер». А уж управлять самим контроллером — это задача десятая. И это зависит от конкретного места применения. Мне, например, было бы удобнее управлять с домашнего сервера через WizFi200(только вот достать его за приемлемые деньги проблематично). Моим родителям — с помощью отправки SMS(на SIM900) на номер контроллера. Возможны и другие варианты. Но это не главное, о чем я хотел рассказать.

Реверс-инжиниринг

Так как же родной пульт передает команду? Имея в наличии ИК-приемник TSOP17XX я начал анализировать поток данных от пульта. Выяснилось, что пульт шлет 2 посылки с небольшой паузой. Первая — заголовок, вторая — команда. Заголовок был всегда одинаковый.

Ознакомившись с существующими системами кодирования ИК-сигналов(RC5, RC6, NEC, JVC и другие) стало ясно, что здесь применяется что-то другое, хотя принцип схож.

Сингал выглядит следующим образом: (активный уровень — низкий)

(значения бит для примера, время в мкс приблизительно)

В начале идет пилотный сигнал, за ним примерно вдвое короче второй пилотный(пауза), за ним стартовый бит длительностью примерно в 8 раз короче чем первый пилотный. Далее начинается битовый поток. Один бит кодируется длительностью паузы(высокий уровень). Если пауза одинарная — это НОЛЬ, если пауза тройная — это ЕДИНИЦА. Всего при одном нажатии кнопки пульт шлет 2 таких посылки. Первая — заголовок, вторая — команда. Пауза между посылками около 10 мс.

Таким образом заголовок содержит 64 бита, или 8 байт. Сначала идут младшие биты.

Поток данных заголовка выглядит следующим образом:

0100000000000100000001110010000000000000000000000000000001100000 Или в байтах(HEX): 02 20 E0 40 00 00 00 06

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

  • ON/OFF(включение/выключение)
  • ± (настройка температуры)
  • O2 (генератор кислорода)
  • ion (ионизатор)
  • quiet (тихий режим)
  • mode ( auto, heat, cool, dry, fan)
  • fan speed
  • swing <>(горизонтальное направление)
  • swing ^v (вертикальное направление)
  • ion
  • quiet
  • O2

Теперь вернемся к протоколу передачи. Любой команде предшествует заголовок. Байты заголовка: 02 20 E0 40 00 00 00 06 Далее идет вторая посылка с командой. Команды трех особых кнопок: ion: 02 20 E0 04 80 48 33 01 oxyg: 02 20 E0 04 80 50 33 09 quiet: 02 20 E0 04 80 81 33 3A Отмечу, что, как и в заголовке, последний байт — контрольная сумма.

А вот все остальные кнопки посылают пакет со всеми настройками сразу. И формат этого пакета следующий:

Поток бит: 0100000000000100000001110010000000000000PNF1mmm00ccccc0000000001vvvvFFFF hhhh0000nnnnnnnnnnnXfffffffffffY000010000000000010000000ttttttttttt00000ssssssss

Расшифровка полей по порядку следования: P — 1, если нажата кнопка ON/OFF. При нажатии других кнопок здесь 0. N — 1, если установлен таймер включения F — 1, если установлен таймер выключения mmm — режим(Mode). Auto — 0, heat — 4, cool — 3, dry — 2, fan — 6 ccccc — температура. От 16 до 30 vvvv — вертикальное направление. Auto — 15, 1 — под потолок, … 5 — в пол. FFFF — скорость вентилятора. Auto — 10, F1 — 3, F2 — 4, F3 — 5, F4 — 6, F5 — 7 hhhh — горизонтальное направление. Auto — 13, | | — 6, / / — 9, / | — 10, | \ — 11, \ \ — 12 nnnnnnnnnnn — время включения. Номер минуты в сутках. (например 16:00 = 960) X — 1, если нажата кнопка установки/сброса таймера fffffffffff — время выключения. Номер минуты в сутках. Y — 1, если нажата кнопка установки/сброса таймера ttttttttttt — текущее время. ssssssss — контрольная сумма посылки.

Сигналы X и Y — установлены в 1 только когда выполняется установка/сброс таймеров, т.е. когда непосредственно нажимается SET или CANCEL. Не путать с N и F! N и F — только сообщают, что таймеры включены/выключены, при этом nnnnnnnnnnn или fffffffffff могут быть «не известны»(0x600) в данный момент. Например при нажатии кнопки увеличения температуры, если в данный момент включен любой таймер, значение N/F равно 1, а nnnnnnnnnnn/fffffffffff cсодержит конкретное время только для включенного таймера(для выключенного содержит 0x600). Кондиционер сменит свой статус N/F только если соответсвующий бит X/Y равен 1. Если таймер включения не установлен, то время включения д.б. 1536 = 0x600 = 0b11000000000. С временем таймера выключения аналогично. По крайней мере так шлет родной пульт.

Разделим поток бит на байты и развернем биты:

Итого команда 19 байт.

Контроллер
  • atmega8
  • ИК-диод
  • транзистор кт361
  • резистор 470 на базу транзистора
  • резистор 220 ограничивает ток диода
  • резистор 10к на RESET

При отпускании кнопки на порту PD7 запускается таймер 1 в режиме CTC с выводом сигнала на PB1/OC1A, а так же таймер 2 с выводом на PB3/OC2 для несущей частоты, на которой и модулируется основной сигнал. Таймеры работают с предделителем 8.

Прошивка Вывод

Текущая тестовая реализация пока умеет слать заголовок и фиксированную команду. Но вот тут у меня возник вопрос — а какая должна быть у этого контроллера глубина реализации? Ведь можно контроллеру сказать «включи охлаждение на 23 градуса», а можно просто сказать «передай команду» и передать весь поток бит с уже сформированной командой. А ведь можно еще и тайминги указать. Тогда можно управлять через один контроллер-излучатель различными устройствами. Надеюсь в комментариях вы мне поможете принять решение. Планируется также подключение пары датчиков температуры для контроля температуры помещения и выходного потока воздуха из кондиционера. Это удобно для обратной связи(например оповещение по смс с текущими параметрами климата) и контроля(а включился ли кондиционер?).

📎📎📎📎📎📎📎📎📎📎