Официальный сайт компании Arduino по адресу arduino.cc
Реверс-инжиниринг пульта кондиционера Haier
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Всем привет!
Поставил недавно себе кондиционер фирмы Haier и решил управлять им при помощи ардуино, но столкнулся с некоторыми сложностями при расшифровке протокола пульта, уже всю голову сломал, но никак не получается понять принцип работы. Опишу свои действия по порядку:
1. Считал отсылаемые пультом импульсы при нажатии определённой кнопки и получил вот такой массив
{3050,3000, 3050,4400, 550,1600, 600,500, 600,1600, 600,500, 550,500, 600,1600, 600,500, 600,1550, 600,1600, 600,500, 600,500, 500,550, 600,500, 600,500, 550,550, 600,450, 550,550, 600,500, 600,1550, 650,1550, 550,550, 600,500, 600,1550, 600,500, 550,550, 600,500, 600,1550, 600,1600, 600,500, 600,500, 550,500, 600,1600, 600,500, 550,500, 600,500, 600,500, 550,1650, 600,1550, 600,500, 550,550, 600,1550, 600,1600, 600,500, 550,500, 600,500, 600,500, 550,550, 600,500, 550,500, 600,500, 600,500, 550,550, 600,500, 600,450, 600,500, 600,500, 550,550, 600,500, 600,450, 600,500, 600,500, 600,500, 550,550, 600,450, 600,500, 600,1600, 550,550, 600,1550, 550,550, 600,1600, 550,500, 600,500, 600}; // UNKNOWN 3F167340
2. Предположив, что если импульс больше 1000, то это 1, и, если импульс меньше 1000, то это 0. Так же отбросив первые 6 имульсов, т.к. это предположительно что-то вроде идентификатора для кондёра, я проучил 144 бита, т.е. 18 байт.
3. Далее нажимая на разные кнопки и меняя температуру мне удалось вычислить занчения нескольких байт
3 байт - температура 00000000 - 16С 00000010 - 17С 00001000 - 18С 00001010 - 19С 00100000 - 20С 00100010 - 21С 00101000 - 22С 00101010 - 23С 10000000 - 24С 10000010 - 25С 10001000 - 26С 10001010 - 27С 10100000 - 28С 10100010 - 29С 10101000 - 30С 4 байт - вкл/выкл 00000000 - выкл 00000010 - вкл 00101000 - включен 5 байт - положение шторки 00001010 - выкл 00101010 - вверх 10001010 - вниз 10101010 - вверх-вниз 11 байт - скорость вентилятора 10100000 - 1 полоска 10000000 - 2 полоски 00100000 - 3 полоски 00000000 - 4 полоски 13 байт - режим 00000000 - авто 00001000 - охлаждение 00100000 - осушение 00101000 - нагрев 10000000 - вентилятор 15 байт - sleep 00100000 - вкл 00000000 - выкл
Ещё понял, что первые два байта всегда одинаковые.
Так вот, проблема в том, что 17 и 18 байты всегда разные и я не могу найти законормерность их изменения. Вероятнее всего один из них является контрольной суммой посылки, но у меня не хватает мозгов разобраться как это работает :( Может кто сталкивался с подобной задачей, помогите разобраться пожалуйста :(
Примеры переведённых в двоичный код посылок можно посмотреть тут http://e-smoker.com.ua/arr.php я написал небольшой скриптик для удобства.
попробуй банально сложить 15 бай (или XOR)
Я пытался складывать, но похоже делал что-то не так. Ещё заметил. что при изменении температуры на включенном кондиционере 17 байт почти всегда совпадает с 3, который по моему мнению и есть значение температуры. Но это не всегда.
А почему 15 байт сложить? Без первых двух и последнего?
http://e-smoker.com.ua/Screenshot_3.png
Да, действительно сложив 17 байт (т.е. без последнего) получилась контрольная сумма. Не понятно теперь за что отвечает 17й байт :)
А, нет, совпадение просто :(
В общем разобрался. Получилось, что я изначально не правильно понял как перевести импульсы в двоичный код. На самом деле первые 4 импульса были хэдэром, потом следущие импульсы надо было расшифровывать так:
если первый импульс меньше 1000, а второй больше 1000, то это 1.
если первый и второй импульсы меньше 1000, то это 0
Таким образом у меня получилось 9 байт вместо 18 и теперь если сложить все байты кроме последнего, то получается как раз сумма последнего байта. Теперь делаю из этого библиотеку, там есть некоторые сложности, может кто-то подскажет как такое сделать, например при смене температуры второй байт посылки выглядит так
A6 - 26C
B6 - 27C
C6 - 28C
D6 - 29C
E6 - 30C
А если при этом нажать кнопку выключения, то в зависимости от текущей температуры может стать вроде такого
E0 - выкл с темп. 30С
E1 - вкл С темп. 30С
Т.е. меняется часть байта (не знаю как это правильно назвать, простите меня знающие люди за безграмотность)