Прием/передача ИК-сигнала кондиционеру (by Arduino)

Тема в разделе "Arduino & Shields", создана пользователем Alexy.Def, 15 ноя 2019.

  1. Alexy.Def

    Alexy.Def Нуб

    Доброго времени суток. Задача стоит следующая: заменить заводской пульт ДУ от кондиционера на плату Arduino с датчиком ИК, т.е. Arduino будет в определенное время, к примеру, включать нужный режим и необходимую температуру. Большое количество статей читал, проверял различными способами, но библиотеку использовал одну - IRremote.

    Кондиционер:
    Gree GWH09QB-K6DNB2C/I.
    Платы микроконтроллеров: Arduino UNO, Arduino Nano ATmega328p, Arduino Nano ATmega168.
    Датчики: прием ИК-сигнала и передача ИК-сигнала брал Troyka-модулями на амперке.
    Среда разработки: Arduino IDE 1.8.9.
    Использовал библиотеку: IRremote (и примеры, идущие в комплекте).

    На одном из видео в интернете, используя библиотеку IRremote, автору ролика удавалось считать сигнал в RAW. Попробовал и я, вроде считал (брал относительно простые кнопки - ВКЛ/ВЫКЛ):
    Код (C++):
    Decoded NEC: 3879460A (32 bits)
    Raw (74): 8950 -4400 700 -500 700 -500 700 -1550 700 -1600 700 -1550 750 -500 700 -450 750 -450 750 -450 700 -1600 700 -1550 750 -1550 750 -1550 700 -500 700 -500 700 -1550 750 -450 750 -1550 700 -500 700 -500 700 -500 700 -1500 800 -1550 700 -500 700 -500 700 -500 700 -500 700 -450 750 -1550 700 -500 700 -1600 700 -500 700 -450 750 -1550 700 -500 700
    Далее перенес эту последовательность сигналов в скетч, который будет отправлять этот набор кондиционеру. Убрал все минусы и расставил запятые между сигналами:
    Код (C++):
    unsigned int irSignal[] = {8950, 4400, 700, 500, 700, 500, 700, 1550, 700, 1600, 700, 1550, 750, 500, 700, 450, 750, 450, 750, 450, 700, 1600, 700, 1550, 750, 1550, 750, 1550, 700, 500, 700, 500, 700, 1550, 750, 450, 750, 1550, 700, 500, 700, 500, 700, 500, 700, 1500, 800, 1550, 700, 500, 700, 500, 700, 500, 700, 500, 700, 450, 750, 1550, 700, 500, 700, 1600, 700, 500, 700, 450, 750, 1550, 700, 500, 700};
    Пытался отправить, но ничего не выходило. Убирал первый сигнал ("8950"), и второй потом ("4400"), ничего не помогало.
    Далее я заметил, что почти каждый раз при нажатии на пульте ДУ кнопок ВКЛ/ВЫКЛ, значения могут меняться (вот пример):
    Код (C++):
    3879460A
    Decoded NEC: 3879460A (32 bits)
    Raw (74): 8950 -4400 700 -500 700 -500 700 -1550 700 -1600 700 -1550 750 -500 700 -450 750 -450 750 -450 700 -1600 700 -1550 750 -1550 750 -1550 700 -500 700 -500 700 -1550 750 -450 750 -1550 700 -500 700 -500 700 -500 700 -1500 800 -1550 700 -500 700 -500 700 -500 700 -500 700 -450 750 -1550 700 -500 700 -1600 700 -500 700 -450 750 -1550 700 -500 700
    2879440A
    Decoded NEC: 2879440A (32 bits)
    Raw (74): 8950 -4400 650 -550 650 -550 600 -1650 650 -550 650 -1650 650 -550 650 -550 600 -600 600 -600 600 -1650 650 -1650 650 -1650 600 -1650 650 -550 700 -500 700 -1600 650 -550 650 -1600 700 -500 700 -500 700 -500 700 -1600 650 -550 650 -500 700 -500 700 -500 700 -500 700 -500 700 -1550 700 -550 650 -1600 700 -500 700 -500 700 -1600 650 -550 650
    3879460A
    Decoded NEC: 3879460A (32 bits)
    Raw (74): 8950 -4400 650 -600 600 -550 650 -1650 650 -1600 700 -1600 650 -550 650 -550 650 -550 650 -550 650 -1600 700 -1600 650 -1600 700 -1600 700 -550 600 -600 600 -1650 650 -550 650 -1600 700 -550 650 -550 600 -600 600 -1650 650 -1600 700 -550 600 -600 600 -600 600 -550 650 -550 650 -1650 650 -550 650 -1600 650 -600 600 -550 700 -1600 650 -550 650
    2879440A
    Decoded NEC: 2879440A (32 bits)
    Raw (74): 8950 -4400 700 -500 650 -550 700 -1550 700 -500 700 -1600 700 -500 650 -550 650 -550 650 -550 650 -1600 700 -1600 650 -1600 750 -1550 700 -500 700 -500 700 -1550 700 -500 700 -1600 700 -500 700 -500 700 -500 700 -1550 700 -500 750 -450 750 -450 700 -500 700 -500 700 -500 700 -1550 700 -500 700 -1600 700 -500 700 -500 700 -1550 750 -450 700
     
    Здесь изображены 4 нажатия на пульте ДУ:
    ВЫКЛ
    ВКЛ
    ВЫКЛ
    ВКЛ

    Мне на данный момент непонятно, почему так происходит, ведь параметры температуры, скорость, направления я не менял. Я решил проверить: "А что я пытаюсь отправить с датчика на кондиционер?".
    Взял 2 ардуинки, залил одной скетч отправки моего сигнала, другой приема сигнала, поставил их напротив. Что получилось: отправлял я одну команду (которая в моем вопросе стоит первой в самом начале), прогнал ее 4 раза, но приемник принимает немного отличающиеся друг от друга сигналы.
    Почему так происходит?
    Мне непонятна кодировка команд, которые должен узнавать кондиционер, мне непонятно, почему один и тот же сигнал при передаче отображается у принимающей стороны с отличиями. Может, я делаю что-то не так? Может, модули датчиков не соответствуют требованиям? Может, необходимо использовать другую библиотеку (хотя вроде длина сигнала равна 74)? Если кто-то сталкивался с похожего рода проблемой, или знает какую-то особенность, прошу подсказать. Буду благодарен.
     
  2. parovoZZ

    parovoZZ Гуру

    У пультов кондиционеров без разницы, на какую кнопку нажимать - в посылке он передаёт все значения параметров - температура, режим обдува, режим работы, таймер и прочее. Поэтому меняем какой-то параметр и сравниваем посылки меж собой.
     
    offigate нравится это.
  3. Watashi

    Watashi Гуру

    У вас распознается код от пульта как NEC.. поэтому вам надо отправлять точно так же как нэк. А коды RAW это временные отрезки между уровнями высоким и низким.
    https://radiohlam.ru/nec/
     
    Последнее редактирование: 15 ноя 2019
  4. Alexy.Def

    Alexy.Def Нуб

    Так в одном случае при отправке команды, к примеру, на повышение температуры с 20 до 21 градуса
    Я не менял никакие параметры, я проверял только на кнопках "ВКЛ"/"ВЫКЛ", при включенном кондее нажал на кнопку питания 4 раза, то есть передал команды "ВЫКЛ-ВКЛ-ВЫКЛ-ВКЛ", и вроде две команды ВЫКЛ должны давать одинаковые посылки, но нет, они в некоторых местах отличаются. То же самое и с командой ВКЛ. Вроде параметры не менялись, а посылки отличаются.

    Спасибо за статью. Да, было бы проще взять этот 32-битный пакет и отправить его кондиционеру, но используя пример скетча "IRrecvDemo" в библиотеке "IRremote", в результате нажатия кнопки на пульте ДУ от кондея выходят 2 строчки (каждая по 32 бита). Только иногда эти 2 потока выходят такими (в данный момент под рукой нет оборудования, значения выдуманные):
    Код (C++):
    324B89C5
    4E3144A6
    Но чаще выходят вот такие 2 потока (значения 1-ой строчки так же выдуманы, во 2-ой всегда стоят F-ки):
    Код (C++):
    341A685B
    FFFFFFFF
    То есть 2 пакета отсылаются. Если рассматривать пакеты, отправляемые телевизорам, или проекторам, там все довольно просто. Одна строчка с 32-битным пакетом. Легко отсылается, все работает. А в случае с кондиционером имею 2 строчки. Допустим, получил я их, хочу попробовать отослать кондиционеру, как это сделать? Как отослать 1 строчку - понимаю, а как 2 - не совсем. Их отправлять с каким-то интервалом между собой или как? Как записать код отправки 2 пакетов?
    Я пробовал отправлять пакеты один за одним без delay(), потом пробовал с каким-то интервалом delay(), наверное, это не совсем правильно.
    Фрагмент кода для извлечения пакетов с пульта ДУ в шестнадцатеричной системе из примера скетча "IRrecvDemo":
    Код (C++):
    void loop() {
      if (irrecv.decode(&results)) {
        Serial.println(results.value, HEX);
        irrecv.resume(); // Receive the next value
      }
      delay(100);
    }
     
  5. parovoZZ

    parovoZZ Гуру

    На пульте есть часы? Скорее всего, передаются ещё и синхросигналы.
     
  6. Alexy.Def

    Alexy.Def Нуб

    Часы есть, да.
    FobMpfRIuS0.jpg
    Отключить их, наверное, не получится. Как работать тогда в моем случае? Какие-нибудь пояснения, может, находили?
     
  7. Watashi

    Watashi Гуру

    Думаю что у пульта более сложная система команд, простые команды типа вкл-выкл не требуют передачи дополнительных параметров и там второе слово FF, а команды типа "установить температуру Т" скорее всего требуют передачи второго слова и думаю та не будет FF . Исходя из этих предпосылок вам нужно вычислить систему команд пульта.
     
  8. offigate

    offigate Нерд

    Совершенно верно. Покопавшись в своих старых файлах, нашел коды для кондиционера General Electric. Большая буква - импульс (т.е. пачка импульсов) определенной длительности, маленькая буква - пауза.Считаны коды Вкл/Выкл для нескольких заданных температур, причем кондиционеру задается режим "Авто"

    Код (C++):
    <Device>
      <Name>AirCond</Name>
      <Manufacturer>
        <Name>General Electric</Name>
        <Variant>
          <Name>General Electric</Name>
          <Protocol>GE AirCond</Protocol>
          <IRCommand>
            <Name> Power On (20C Auto) </Name>
            <Frames>
              <Frame>
                <Name>i</Name>
                <IRCode>CcAbAaAbAbAaAaAbAaAaAbAaAaAbAbAaAbAaAaAaAbAbAbAbAbAbAbAbAaAaAaAaAaAaAaAbAaAbAaAaAaAbAbAaAbAaAbAbAbAdCcAbAaAbAbAaAaAbAaAaAbAaAaAbAbAaAbAaAaAaAbAbAbAbAbAbAbAbAaAaAaAaAaAaAaAbAaAbAaAaAaAbAbAaAbAaAbAbAbA</IRCode>
              </Frame>
            </Frames>
          </IRCommand>
          <IRCommand>
            <Name> Power Off (20C Auto) </Name>
            <Frames>
              <Frame>
                <Name>i</Name>
                <IRCode>CcAbAaAbAbAaAaAbAaAaAbAaAaAbAbAaAbAaAbAbAbAbAaAbAbAbAaAaAaAaAbAaAaAbAbAbAaAaAaAaAaAaAaAaAbAbAbAbAbAdCcAbAaAbAbAaAaAbAaAaAbAaAaAbAbAaAbAaAbAbAbAbAaAbAbAbAaAaAaAaAbAaAaAbAbAbAaAaAaAaAaAaAaAaAbAbAbAbAbA</IRCode>
              </Frame>
            </Frames>
          </IRCommand>
          <IRCommand>
            <Name> Power On (21C Auto) </Name>
            <Frames>
              <Frame>
                <Name>i</Name>
                <IRCode>CcAbAaAbAbAaAaAbAaAaAbAaAaAbAbAaAbAaAaAaAbAbAbAbAbAbAbAbAaAaAaAaAaAaAbAbAaAbAaAaAaAbAaAaAbAaAbAbAbAdCcAbAaAbAbAaAaAbAaAaAbAaAaAbAbAaAbAaAaAaAbAbAbAbAbAbAbAbAaAaAaAaAaAaAbAbAaAbAaAaAaAbAaAaAbAaAbAbAbA</IRCode>
              </Frame>
            </Frames>
          </IRCommand>
          <IRCommand>
            <Name> Power Off (21C Auto) </Name>
            <Frames>
              <Frame>
                <Name>i</Name>
                <IRCode>CcAbAaAbAbAaAaAbAaAaAbAaAaAbAbAaAbAaAbAbAbAbAaAbAbAbAaAaAaAaAbAaAaAbAbAbAaAaAaAaAaAaAaAaAbAbAbAbAbAdCcAbAaAbAbAaAaAbAaAaAbAaAaAbAbAaAbAaAbAbAbAbAaAbAbAbAaAaAaAaAbAaAaAbAbAbAaAaAaAaAaAaAaAaAbAbAbAbAbA</IRCode>
              </Frame>
            </Frames>
          </IRCommand>
          <IRCommand>
            <Name> Power On (22C Auto) </Name>
            <Frames>
              <Frame>
                <Name>i</Name>
                <IRCode>CcAbAaAbAbAaAaAbAaAaAbAaAaAbAbAaAbAaAaAaAbAbAbAbAbAbAbAbAaAaAaAaAaAaAbAbAbAbAaAaAaAbAaAaAaAaAbAbAbAdCcAbAaAbAbAaAaAbAaAaAbAaAaAbAbAaAbAaAaAaAbAbAbAbAbAbAbAbAaAaAaAaAaAaAbAbAbAbAaAaAaAbAaAaAaAaAbAbAbA</IRCode>
              </Frame>
            </Frames>
          </IRCommand>
          <IRCommand>
            <Name> Power Off (22C Auto) </Name>
            <Frames>
              <Frame>
                <Name>i</Name>
                <IRCode>CcAbAaAbAbAaAaAbAaAaAbAaAaAbAbAaAbAaAbAbAbAbAaAbAbAbAaAaAaAaAbAaAaAbAbAbAaAaAaAaAaAaAaAaAbAbAbAbAbAdCcAbAaAbAbAaAaAbAaAaAbAaAaAbAbAaAbAaAbAbAbAbAaAbAbAbAaAaAaAaAbAaAaAbAbAbAaAaAaAaAaAaAaAaAbAbAbAbAbA</IRCode>
              </Frame>
            </Frames>
          </IRCommand>
          <IRCommand>
            <Name> Power On (23C Auto) </Name>
            <Frames>
              <Frame>
                <Name>i</Name>
                <IRCode>CcAbAaAbAbAaAaAbAaAaAbAaAaAbAbAaAbAaAaAaAbAbAbAbAbAbAbAbAaAaAaAaAaAaAbAaAbAbAaAaAaAbAaAbAaAaAbAbAbAdCcAbAaAbAbAaAaAbAaAaAbAaAaAbAbAaAbAaAaAaAbAbAbAbAbAbAbAbAaAaAaAaAaAaAbAaAbAbAaAaAaAbAaAbAaAaAbAbAbA</IRCode>
              </Frame>
            </Frames>
          </IRCommand>
          <IRCommand>
            <Name> Power Off (23C Auto) </Name>
            <Frames>
              <Frame>
                <Name>i</Name>
                <IRCode>CcAbAaAbAbAaAaAbAaAaAbAaAaAbAbAaAbAaAbAbAbAbAaAbAbAbAaAaAaAaAbAaAaAbAbAbAaAaAaAaAaAaAaAaAbAbAbAbAbAdCcAbAaAbAbAaAaAbAaAaAbAaAaAbAbAaAbAaAbAbAbAbAaAbAbAbAaAaAaAaAbAaAaAbAbAbAaAaAaAaAaAaAaAaAbAbAbAbAbA</IRCode>
              </Frame>
            </Frames>
          </IRCommand>
          <IRCommand>
            <Name> Power On (24C Auto) </Name>
            <Frames>
              <Frame>
                <Name>i</Name>
                <IRCode>CcAbAaAbAbAaAaAbAaAaAbAaAaAbAbAaAbAaAaAaAbAbAbAbAbAbAbAbAaAaAaAaAaAaAbAaAaAbAaAaAaAbAaAbAbAaAbAbAbAdCcAbAaAbAbAaAaAbAaAaAbAaAaAbAbAaAbAaAaAaAbAbAbAbAbAbAbAbAaAaAaAaAaAaAbAaAaAbAaAaAaAbAaAbAbAaAbAbAbA</IRCode>
              </Frame>
            </Frames>
          </IRCommand>
          <IRCommand>
            <Name> Power Off (24C Auto) </Name>
            <Frames>
              <Frame>
                <Name>i</Name>
                <IRCode>CcAbAaAbAbAaAaAbAaAaAbAaAaAbAbAaAbAaAbAbAbAbAaAbAbAbAaAaAaAaAbAaAaAbAbAbAaAaAaAaAaAaAaAaAbAbAbAbAbAdCcAbAaAbAbAaAaAbAaAaAbAaAaAbAbAaAbAaAbAbAbAbAaAbAbAbAaAaAaAaAbAaAaAbAbAbAaAaAaAaAaAaAaAaAbAbAbAbAbA</IRCode>
              </Frame>
            </Frames>
          </IRCommand>
          <IRCommand>
            <Name> Power On (25C Auto) </Name>
            <Frames>
              <Frame>
                <Name>i</Name>
                <IRCode>CcAbAaAbAbAaAaAbAaAaAbAaAaAbAbAaAbAaAaAaAbAbAbAbAbAbAbAbAaAaAaAaAaAbAbAaAaAbAaAaAaAaAaAbAbAaAbAbAbAdCcAbAaAbAbAaAaAbAaAaAbAaAaAbAbAaAbAaAaAaAbAbAbAbAbAbAbAbAaAaAaAaAaAbAbAaAaAbAaAaAaAaAaAbAbAaAbAbAbA</IRCode>
              </Frame>
            </Frames>
          </IRCommand>
          <IRCommand>
            <Name> Power Off (25C Auto) </Name>
            <Frames>
              <Frame>
                <Name>i</Name>
                <IRCode>CcAbAaAbAbAaAaAbAaAaAbAaAaAbAbAaAbAaAbAbAbAbAaAbAbAbAaAaAaAaAbAaAaAbAbAbAaAaAaAaAaAaAaAaAbAbAbAbAbAdCcAbAaAbAbAaAaAbAaAaAbAaAaAbAbAaAbAaAbAbAbAbAaAbAbAbAaAaAaAaAbAaAaAbAbAbAaAaAaAaAaAaAaAaAbAbAbAbAbA</IRCode>
              </Frame>
            </Frames>
          </IRCommand>
        </Variant>
      </Manufacturer>
    </Device>
     
     
  9. Alexy.Def

    Alexy.Def Нуб

    Так и есть, в моей последовательности, которую кидал выше, есть импульс и есть пауза, они чередуются так же, как у Вас. Отправляю, но не принимает кондиционер..
     
  10. gfox

    gfox Нерд

    Актуально ли, но решил вопрос со старым кондиционером GREE тут.