ELECTRONICS

Библиотека IRremote

менеджер: IRremoteArmin Joachimsmeyer и сообществоверсия 4.7.1

Приём и отправка команд ИК-пультов: NEC, Sony, Samsung и десятки других протоколов.

Библиотека принимает сигнал с приёмника вроде VS1838B, распознаёт протокол и отдаёт адрес и команду кнопки. В обратную сторону она умеет управлять ИК-светодиодом и притворяться пультом. Начиная с версии 3 интерфейс изменился полностью: объекты IrReceiver и IrSender вместо IRrecv и results, и старые примеры из интернета не компилируются.

Обратите внимание на расширение: подключается IRremote.hpp, а не .h — так библиотека собирается в одном файле скетча, а не в каждом.

Установка и подключение

В менеджере библиотек ищите IRremote автора Armin Joachimsmeyer и сообщество. Если менеджер предложит поставить зависимости — соглашайтесь. Как открыть менеджер и что делать, если библиотека не находится, — в общей статье про библиотеки.

#include <IRremote.hpp>

Создание объекта — обычно до setup():

#define IR_PIN 2
IrReceiver.begin(IR_PIN, ENABLE_LED_FEEDBACK);   // в setup(); объект IrReceiver уже есть

Методы

Только то, что нужно в обычном скетче. Сигнатуры сверены с версией 4.7.1.

IrReceiver.begin(uint8_t pin, bool ledFeedback)
Запустить приём на выводе. Второй параметр — мигать встроенным светодиодом при приёме.
IrReceiver.decode()
true, если принята и разобрана посылка. Проверять в loop().
IrReceiver.decodedIRData.command
Код кнопки — то, по чему различают кнопки пульта.
IrReceiver.decodedIRData.address
Адрес устройства — у всех кнопок одного пульта одинаковый.
IrReceiver.decodedIRData.protocol
Протокол: NEC, SONY, SAMSUNG… UNKNOWN — не распознан.
IrReceiver.decodedIRData.flags & IRDATA_FLAGS_IS_REPEAT
Признак повтора при удержании кнопки — чтобы не считать его новым нажатием.
IrReceiver.printIRResultShort(&Serial)
Напечатать протокол, адрес и команду одной строкой — для разведки пульта.
IrReceiver.resume()
Разрешить приём следующей посылки. Обязательно после decode().
IrSender.begin(uint8_t pin)
Настроить отправку через ИК-светодиод на выводе.
IrSender.sendNEC(uint16_t address, uint16_t command, uint8_t repeats)
Отправить команду по протоколу NEC; есть аналоги для других протоколов.

Пример

#include <IRremote.hpp>

#define IR_PIN 2

void setup() {
  Serial.begin(9600);
  IrReceiver.begin(IR_PIN, ENABLE_LED_FEEDBACK);
}

void loop() {
  if (IrReceiver.decode()) {
    if (!(IrReceiver.decodedIRData.flags & IRDATA_FLAGS_IS_REPEAT)) {
      IrReceiver.printIRResultShort(&Serial);   // протокол, адрес, команда
      switch (IrReceiver.decodedIRData.command) {
        case 0x45: Serial.println("Кнопка 1"); break;   // коды — от вашего пульта
        case 0x46: Serial.println("Кнопка 2"); break;
      }
    }
    IrReceiver.resume();
  }
}

Сначала запустите скетч и понажимайте пульт: коды кнопок появятся в мониторе. Их и подставляют в switch.

На чём попадаются

Пример из старой статьи не компилируется

Версия 3+ сломала совместимость. IRrecv, results.value, irrecv.enableIRIn() больше нет — используйте IrReceiver и decodedIRData.

Каждое нажатие приходит несколько раз

Пульт шлёт повторы, пока кнопка удерживается. Отсеивайте по флагу IRDATA_FLAGS_IS_REPEAT.

Протокол UNKNOWN

Пульт с редким протоколом или помехи от лампы. Проверьте decodedIRData.decodedRawData — сырое значение стабильно для одной кнопки, и его можно использовать напрямую.

Не работает вместе с Servo или tone()

Конфликт таймеров. В IRremote можно выбрать другой таймер через define перед include — см. файл IRTimer.hpp.

Где используется на сайте

Что дальше