РЕШЕНО Ик управление кондиционером irremote

Тема в разделе "Arduino & Shields", создана пользователем gfox, 10 авг 2020.

  1. gfox

    gfox Нерд

    Добрый день, хочу управлять кондиционером с помощью ардуинки используя библиотеку IRremote.
    Модель кондиционера GREE KFR-45G/J11
    Пульт простой, без часов. На определенный режим передает определенную команду, команды не меняются.
    Что сделал я: с помощью ардуинки и ик датчика считал команду, с помощью другой ардуинки и ик светодиода отправил команду. Первая ардуинка понимает и принимает сигнал, но кондиционер не воспринимает ее.
    Что думаю: скорее всего команда состоит не из 32 бит, а есть еще биты, которые позволяют кондиционеру понять, что команда предназначена ему. Как это понять и отправить правильную команду я не знаю.
    Подскажите пожалуйста.
    Ниже приведен дамп с IRremote
    1. С пульта (команда выключить и включить)
    Encoding : NEC

    Code : 0x8490000A / 2224029706 / (32 bits)

    Timing[73]:

    +8950, -4400 + 700, -1600 + 650, - 550 + 650, - 550

    + 650, - 500 + 650, - 500 + 700, -1600 + 700, - 500

    + 700, - 500 + 650, -1600 + 700, - 500 + 650, - 500

    + 700, -1600 + 700, - 500 + 650, - 500 + 700, - 500

    + 650, - 500 + 700, - 500 + 700, - 500 + 650, - 500

    + 700, - 500 + 650, - 550 + 650, - 500 + 700, - 500

    + 650, - 550 + 650, - 500 + 650, - 500 + 700, - 500

    + 700, - 500 + 650, -1650 + 650, - 500 + 700, -1600

    + 700, - 450 + 700, - 500 + 650, -1650 + 650, - 550

    + 650

    Pronto Hex: 0000 006D 0025 0000 0158 00A9 001B 003E 0019 0015 0019 0015 0019 0013 0019 0013 001B 003E 001B 0013 001B 0013 0019 003E 001B 0013 0019 0013 001B 003E 001B 0013 0019 0013 001B 0013 0019 0013 001B 0013 001B 0013 0019 0013 001B 0013 0019 0015 0019 0013 001B 0013 0019 0015 0019 0013 0019 0013 001B 0013 001B 0013 0019 003F 0019 0013 001B 003E 001B 0011 001B 0013 0019 003F 0019 0015 0019 0806

    unsigned int rawData[73] = {8950,4400, 700,1600, 650,550, 650,550, 650,500, 650,500, 700,1600, 700,500, 700,500, 650,1600, 700,500, 650,500, 700,1600, 700,500, 650,500, 700,500, 650,500, 700,500, 700,500, 650,500, 700,500, 650,550, 650,500, 700,500, 650,550, 650,500, 650,500, 700,500, 700,500, 650,1650, 650,500, 700,1600, 700,450, 700,500, 650,1650, 650,550, 650}; // NEC 8490000A / 2224029706 /

    unsigned int data = 0x8490000A;


    Encoding : NEC

    Code : 0x9490000A / 2492465162 / (32 bits)

    Timing[73]:

    +9000, -4400 + 700, -1600 + 650, - 500 + 700, - 500

    + 700, -1600 + 700, - 500 + 650, -1600 + 700, - 500

    + 700, - 500 + 650, -1600 + 700, - 500 + 650, - 500

    + 700, -1600 + 700, - 500 + 650, - 500 + 700, - 500

    + 650, - 550 + 650, - 500 + 700, - 500 + 650, - 500

    + 700, - 500 + 650, - 550 + 650, - 500 + 700, - 500

    + 650, - 550 + 650, - 500 + 650, - 500 + 700, - 500

    + 700, - 500 + 650, -1650 + 650, - 500 + 700, -1600

    + 700, - 450 + 700, - 500 + 700, -1600 + 700, - 500

    + 650

    Pronto Hex: 0000 006D 0025 0000 015A 00A9 001B 003E 0019 0013 001B 0013 001B 003E 001B 0013 0019 003E 001B 0013 001B 0013 0019 003E 001B 0013 0019 0013 001B 003E 001B 0013 0019 0013 001B 0013 0019 0015 0019 0013 001B 0013 0019 0013 001B 0013 0019 0015 0019 0013 001B 0013 0019 0015 0019 0013 0019 0013 001B 0013 001B 0013 0019 003F 0019 0013 001B 003E 001B 0011 001B 0013 001B 003E 001B 0013 0019 0806

    unsigned int rawData[73] = {9000,4400, 700,1600, 650,500, 700,500, 700,1600, 700,500, 650,1600, 700,500, 700,500, 650,1600, 700,500, 650,500, 700,1600, 700,500, 650,500, 700,500, 650,550, 650,500, 700,500, 650,500, 700,500, 650,550, 650,500, 700,500, 650,550, 650,500, 650,500, 700,500, 700,500, 650,1650, 650,500, 700,1600, 700,450, 700,500, 700,1600, 700,500, 650}; // NEC 9490000A / 2492465162 /

    unsigned int data = 0x9490000A;

    С ардуинки:
    Encoding : NEC

    Code : 0x8490000A / 2224029706 / (32 bits)

    Timing[67]:

    +9000, -4450 + 550, -1550 + 600, - 550 + 550, - 550

    + 550, - 550 + 600, - 550 + 550, -1550 + 550, - 600

    + 550, - 500 + 600, -1550 + 600, - 550 + 550, - 550

    + 600, -1500 + 600, - 550 + 550, - 600 + 550, - 550

    + 550, - 550 + 550, - 550 + 600, - 500 + 600, - 550

    + 550, - 550 + 600, - 500 + 600, - 500 + 600, - 500

    + 600, - 550 + 550, - 500 + 600, - 550 + 600, - 500

    + 550, - 550 + 600, -1500 + 650, - 500 + 600, -1550

    + 600, - 500 + 600

    Pronto Hex: 0000 006D 0022 0000 015A 00AB 0015 003C 0017 0015 0015 0015 0015 0015 0017 0015 0015 003C 0015 0017 0015 0013 0017 003C 0017 0015 0015 0015 0017 003A 0017 0015 0015 0017 0015 0015 0015 0015 0015 0015 0017 0013 0017 0015 0015 0015 0017 0013 0017 0013 0017 0013 0017 0015 0015 0013 0017 0015 0017 0013 0015 0015 0017 003A 0019 0013 0017 003C 0017 0013 0017 0806

    unsigned int rawData[67] = {9000,4450, 550,1550, 600,550, 550,550, 550,550, 600,550, 550,1550, 550,600, 550,500, 600,1550, 600,550, 550,550, 600,1500, 600,550, 550,600, 550,550, 550,550, 550,550, 600,500, 600,550, 550,550, 600,500, 600,500, 600,500, 600,550, 550,500, 600,550, 600,500, 550,550, 600,1500, 650,500, 600,1550, 600,500, 600}; // NEC 8490000A / 2224029706 /

    unsigned int data = 0x8490000A;


    Encoding : NEC

    Code : 0x9490000A / 2492465162 / (32 bits)

    Timing[67]:

    +8950, -4400 + 600, -1550 + 600, - 550 + 550, - 550

    + 550, -1650 + 500, - 500 + 600, -1600 + 550, - 550

    + 600, - 500 + 600, -1550 + 550, - 600 + 550, - 500

    + 600, -1550 + 600, - 550 + 550, - 550 + 550, - 550

    + 550, - 550 + 550, - 600 + 550, - 500 + 600, - 550

    + 550, - 550 + 600, - 500 + 600, - 550 + 550, - 500

    + 600, - 550 + 550, - 550 + 600, - 500 + 600, - 500

    + 600, - 500 + 600, -1550 + 600, - 500 + 600, -1600

    + 550, - 550 + 550

    Pronto Hex: 0000 006D 0022 0000 0158 00A9 0017 003C 0017 0015 0015 0015 0015 003F 0013 0013 0017 003E 0015 0015 0017 0013 0017 003C 0015 0017 0015 0013 0017 003C 0017 0015 0015 0015 0015 0015 0015 0015 0015 0017 0015 0013 0017 0015 0015 0015 0017 0013 0017 0015 0015 0013 0017 0015 0015 0015 0017 0013 0017 0013 0017 0013 0017 003C 0017 0013 0017 003E 0015 0015 0015 0806

    unsigned int rawData[67] = {8950,4400, 600,1550, 600,550, 550,550, 550,1650, 500,500, 600,1600, 550,550, 600,500, 600,1550, 550,600, 550,500, 600,1550, 600,550, 550,550, 550,550, 550,550, 550,600, 550,500, 600,550, 550,550, 600,500, 600,550, 550,500, 600,550, 550,550, 600,500, 600,500, 600,500, 600,1550, 600,500, 600,1600, 550,550, 550}; // NEC 9490000A / 2492465162 /

    unsigned int data = 0x9490000A;
    Видно, что коды NEC одинаковы, 0x8490000A и 0x9490000A, однако размер массива таймигов отличается. Пробовал передавать в формате Raw, но также не получается.
     
  2. parovoZZ

    parovoZZ Гуру

    Разбираешь пульт и интегрируешь его к дурине.
     
  3. gfox

    gfox Нерд

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

    P.S. во избежание вопросов, я хочу засунуть туда не ардуину, а ATtiny85, чтобы спокойно работать на 3В. Ее и библиотеку я подружил, но пока проблема с протоколом передачи данных и самой библиотекой.
     
  4. parovoZZ

    parovoZZ Гуру

    Подключить TSOP к тиньке и считать полный код. Запустить считывание по прерыванию от пина, остановить считывание когда состояние пина не меняется какое-то время. Так бы делал я. Как там принято у ардуинщиков - не знаю.
     
  5. gfox

    gfox Нерд

    Разобрался, в конце пульт добавляет 010
    Модифицировал функцию посылки в для NEC IRremout:
    Код (C++):
    void IRsend::sendNEC(unsigned long data, int nbits)
    {
        enableIROut(38);
        mark(NEC_HDR_MARK);
        space(NEC_HDR_SPACE);
        for (int i = 0; i < nbits; i++) {
            if (data & TOPBIT) {
                mark(NEC_BIT_MARK);
                space(NEC_ONE_SPACE);
            }
            else {
                mark(NEC_BIT_MARK);
                space(NEC_ZERO_SPACE);
            }
            data <<= 1;
        }
        //======0,1,0 Для GREE========
        mark(NEC_BIT_MARK);
        space(NEC_ZERO_SPACE);
        mark(NEC_BIT_MARK);
        space(NEC_ONE_SPACE);
        mark(NEC_BIT_MARK);
        space(NEC_ZERO_SPACE);
        //===========GREE=============

        mark(NEC_BIT_MARK);
        space(0);
    }
    Это модификация для ATtiny85.
    Более подробно для работы с кондиционерами GREE можно почитать на китайском https://blog.csdn.net/yannanxiu/article/details/48174649, это уже ~64 битная посылка, собственно у меня попроще. Есть и её реализация для ардуинки с поддержкой GREE https://github.com/AbelHu/Arduino-IRremote. Мне же достаточно было внести небольшие изменения, как видно из кода, просто добавляется в конце 010, а первая часть в формате NEC.
     
    arkadyf нравится это.