Библиотека IRremote
Приём и отправка команд ИК-пультов: 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.