IRremote: скачать библиотеку и запустить пример на 4.x
Пульт от телевизора и полсотни строк кода — со стороны самый дешёвый проект года. Я скопировал скетч из статьи десятилетней давности, нажал проверку — красное: IRrecv does not name a type. Статья была ни при чём: библиотека IRremote сменила поколение, а вместе с ней устарел весь код эпохи 2.x, и сломался он не у авторов, а у читателей. Дальше по нарастающей: в менеджере библиотек ищутся две IRremote с почти одинаковыми именами, на форумах советуют держать старую версию рядом с новой, а половина скетчей из интернета не собирается молча. Ниже — как пройти весь этот маршрут по порядку, не наступая на грабли, которые уже наступлены за вас.
Эта страница про установку и первый запуск: два способа скачать — менеджер библиотек и ZIP с GitHub, чем версия 4.x отличается от 2.x и как выглядит минимальный приёмник на новом API: пятнадцать строк, печатающие адрес и команду любой нажатой кнопки. Плюс честная развилка для ESP32 и ESP8266, где живут две разные библиотеки. Проводку приёмника здесь не разбираю — она в уроке про VS1838B, а кнопки до прихода пульта из набора проверяются в симуляторе с виртуальным пультом.
Скачать за минуту: менеджер библиотек, а не архивы с форумов
IRremote ставится штатно, как любая другая библиотека: Инструменты → Управлять библиотеками (Ctrl+Shift+I), в поиске — IRremote. Процедура с горячими клавишами и выбором версии разобрана в уроке про менеджер библиотек. Развилка одна, на ней ошибаются чаще всего: в результатах минимум две строки, и нужна «IRremote by shirriff, z3t0, ArminJo» — проект под поддержкой Armin Joachimsmeyer, лицензия MIT, актуальные версии 4.x. Строкой ниже будет IRremoteESP8266 — это самостоятельный форк для ESP-плат, о нём отдельный разговор ниже. Берите последнюю из четвёртой линии: библиотека модульная, неиспользуемые протоколы и передатчик вырезаются на этапе компиляции, и скетч с одним приёмником NEC не тащит за собой чужой код.
Проверка установки занимает тридцать секунд: Файл → Примеры → IRremote → SimpleReceiver, загрузка на плату по порядку первой загрузки — и при нажатии кнопки пульта в мониторе сыплется паспорт посылки. Пример нашёлся и собрался — библиотека жива, и дальше правду можно искать не на форумах, а в папке examples у себя на диске.
| Способ | Когда брать | Цена способа |
|---|---|---|
| Менеджер библиотек IDE | базовый путь: интернет есть, обновления и версии в один клик | нужен доступ к сети — в офисных и школьных сетях часто закрыт |
| ZIP из релизов GitHub (репозиторий ArminJo/Arduino-IRremote) | менеджер недоступен, нужна точная версия по номеру | обновления руками: скачал новый архив — заменил папку в libraries |
| Старые зеркала с 2.x | чужой скетч под 2.x, который жалко править | замороженное API, старые баги, откат всё равно кончается миграцией |
Про обратную дорогу — отдельно. Понижать версию ради старого скетча я пробовал: скетч собирается, но вместе с ним возвращаются старые баги и теряется поддержка новых плат, а переезд всё равно предстоит — уже вдвое дороже. Пять строк миграции дешевле любого отката; ниже покажу, какие именно.
Какая версия правильная: 4.x, а не 2.x
У библиотеки простая линия истории: первым её написал Ken Shirriff, позже поддержка перешла к Armin Joachimsmeyer, к четвёртой версии проект переписали. Смена поколений видна в словаре кода. 2.x — IRrecv, irrecv.decode(&results), results.value: сырые 32 бита посылки, где адрес и команда сидят в одном слове, и новички сравнивают его целиком — ловя команды чужих пультов. 4.x — готовые синглтоны IrReceiver и IrSender и разобранная структура decodedIRData: command — команда кнопки, address — адрес пульта, protocol — имя протокола, flags — служебные биты вроде признака повтора NEC. Адрес заодно решает классическую беду «пульт соседей дёргает мою подсветку»: сравнение одного байта отфильтровывает чужие пульты начисто.
Числам верить, но с датой. Четвёртая линия живая — в ченджлоге перечислены новые возможности вплоть до 4.6; зато у 4.5.0 там же отмечено, что на ESP-платформах версия не работала. Отсюда правило без исключений: на Uno и Nano берите последнюю 4.x, на ESP32 и ESP8266 — либо самую свежую, либо отдельную библиотеку для ESP, о ней ниже.
| Линия | Словарь кода | Статус |
|---|---|---|
| 2.x | IRremote.h; IRrecv irrecv(2), irrecv.decode(&results), results.value | заморожена; живёт в статьях 2012-2017 и на зеркалах |
| 3.x | разбор уже по decodedIRData, старые вызовы ещё принимались | переходная; встречается в скетчах начала двадцатых |
| 4.x | IRremote.hpp; IrReceiver и IrSender, decodedIRData.command и .address | актуальная; обновляется, ченджлог доходит до 4.6 |
Первый пример: минимальный приёмник на новом API
Код-проверка после установки — приёмник на пине 2: OUT модуля VS1838B туда, питание 5 В, земля — распиновка приёмника в отдельном уроке. Флаг ENABLE_LED_FEEDBACK заставляет встроенный диод платы мигать на каждую принятую посылку: дешёвая, но самая полезная индикация, потому что по ней видно, когда дело не дошло даже до кода — сигнал просто не приходит.
#include <IRremote.hpp> // именно .hpp: .h остался для скетчей эпохи 2.x const int IR_PIN = 2; // OUT приёмника VS1838B / TSOP4838 void setup() { Serial.begin(9600); IrReceiver.begin(IR_PIN, ENABLE_LED_FEEDBACK); // диод платы мигает на посылку Serial.println("Zhmite knopku pulta");} void loop() { if (IrReceiver.decode()) { Serial.print("prot="); Serial.print(IrReceiver.decodedIRData.protocol); Serial.print(" addr=0x"); Serial.print(IrReceiver.decodedIRData.address, HEX); Serial.print(" cmd=0x"); Serial.println(IrReceiver.decodedIRData.command, HEX); IrReceiver.resume(); // без этой строки - одна посылка и тишина }}Что смотреть в мониторе: адрес у пульта из набора один на все кнопки, команда — своя у каждой. Дальше поле command уходит в switch, а адрес держится фильтром от чужих пультов: механика чтения кнопок разобрана в уроке про приём кодов, кадр NEC байт за байтом — в уроке про биты адреса и команды, а если нужен паспорт именно вашего пульта, быстрее всего готовый сканер кодов с таблицей.
Скетч из статьи не собирается: пять строк миграции
Симптом классический: IRrecv does not name a type, decode_results was not declared — и поисковик уже предлагает «irremote скачать старую версию». Библиотека стоит; не стоит старый API, и это чинится переписыванием пяти строк. Откатывать версию не советую по причинам выше; держать две версии рядом, как рекомендуют в некоторых ветках форумов, тоже: под одним именем библиотеки IDE всё равно подхватит одну, и вы правите код не той версии.
/* Было (2.x), из статьи 2016 года: #include <IRremote.h> IRrecv irrecv(RECV_PIN); irrecv.enableIRIn(); if (irrecv.decode(&results)) { if (results.value == 0xFF02FD) { digitalWrite(13, HIGH); } irrecv.resume(); }*/ /* Стало (4.x) — то же самое: */#include <IRremote.hpp> if (IrReceiver.decode()) { // &results больше не нужен if (IrReceiver.decodedIRData.command == 0x02) { // results.value -> command digitalWrite(LED_BUILTIN, HIGH); } IrReceiver.resume();}ESP32 и ESP8266: вторая библиотека с похожим именем
IRremoteESP8266 в менеджере — не «та же библиотека для ESP», а самостоятельный форк со своим проектом и своим словарём, тяготеющим к старому API: IRrecv и decode_results, константа kIrLed на передачу. Версии у него свои (линия 2.8.x), и архив на порядки тяжелее: релиз 2.8.6 — zip на шесть с лишним мегабайт, основная IRremote легче в разы. Для Uno и Nano форк не нужен. На ESP32 выбор простой: свежая 4.x основной библиотеки собирается под ESP — берите её для новых скетчей; если же код уже написан под форк, разумнее поставить форк, чем переучивать скетч. Обе ветки разобраны в уроке про пульты на ESP32 и ESP8266.
После установки: два пина, один таймер и грабли
Полная таблица переезда строка за строкой — в уроке про миграцию на 4.x; для скетчей с форумов, где старый код переплетён с логикой проекта, есть разбор переезда форумных скетчей. Про заголовок .h: он остался ради совместимости и может даже собраться, но библиотека сама напечатает в мониторе подсказку, что код выглядит как из второй версии. Жизнь на старом .h кончается ровно там же, где началась, — на поиске следующего сбоя.
Три грабли, на которые я наступал лично. Первая: IRremote.h вместо .hpp — собирается, но тянет устаревшие определения и печатает подсказку про старый код. Вторая: две копии библиотеки в папке libraries — ручная рядом с менеджерской; компилятор молча берёт одну из них, и вы правите код не той версии. Третья: забытый IrReceiver.resume() — приёмник отработал одну посылку и замолчал; симптомы на новом API те же, что и на старом, лечение разобрано в уроке про неблокирующий loop с resume.
- в менеджере ищу IRremote by shirriff, z3t0, ArminJo — мейнтейнер Armin Joachimsmeyer, лицензия MIT
- ставлю последнюю 4.x; на ESP32/ESP8266 — либо свежая основная, либо форк IRremoteESP8266, но не обе разом
- проверка установки: Примеры → IRremote → SimpleReceiver собирается, пульт печатает addr и cmd
- в своих скетчах пишу IRremote.hpp и ставлю IrReceiver.resume() после каждого decode()
- передатчик на Uno — пин 3, таймер 2: tone() и Servo развожу с ним заранее, а не после конфликта