Библиотека, позволяющая отправлять и получать инфракрасные сигналы.
Доступен как библиотека Arduino «IRremote».
? Гугл переводчик
Поддерживаемые ИК-протоколы
Функции
Новые возможности версии 4.x
Новые возможности версии 3.x
Преобразование вашей программы 2.x в версию 4.x
Как преобразовать старые первые 32-битные IR-коды данных MSB в новые первые 32-битные IR-коды данных LSB
Ошибки при использовании версий 3.x для старых руководств.
Остаемся на версии 2.x
Почему *.hpp вместо *.cpp
Использование новых файлов *.hpp
Учебники
3 способа указать ИК-код
Распиновка IRReceiver
Получение ИК-кодов
Отказ от ответственности
Другие библиотеки, которые могут охватывать эти протоколы.
Протокол=PULSE_DISTANCE
Протокол = НЕИЗВЕСТНО
Как бороться с протоколами, не поддерживаемыми IRremote
декодированная структураIRData
Неоднозначные протоколы
Использование оперативной памяти различными протоколами
Обработка неизвестных протоколов
Отправка ИК-кодов
Список общедоступных баз данных IR-кодов
Отправка IRDB IR-кодов
Отправить пин-код
Миниатюрный приемник и отправитель NEC
Протокол FAST
Часто задаваемые вопросы и советы
Получение остановок после аналоговой записи() или тона() или после запуска двигателя.
Прием устанавливает флаг переполнения
Проблемы с Neopixels, FastLed и т. д.
Не работает/компилируется с другой библиотекой
Несколько экземпляров ИК-приемника и отправителя
Увеличение силы отправляемого выходного сигнала
Минимальная тактовая частота процессора
Протокол Bang & Olufsen
Примеры для этой библиотеки
Онлайн-примеры WOKWI
ИК управление автомобилем-роботом
Проблемы и обсуждения
Скомпилировать параметры/макросы для этой библиотеки
Изменение включаемых файлов (*.h) с помощью Arduino IDE
Изменение параметров компиляции с помощью Sloeber IDE
Поддерживаемые платы
Использование таймера и контакта
Несовместимость с другими библиотеками и командами Arduino, такими какtone() и AnalogWrite().
Генерация сигнала аппаратного ШИМ для отправки
Почему мы используем рабочий цикл 30% для отправки
Как мы декодируем сигналы
Диаграммы кодирования NEC
Быстрое сравнение 5 библиотек приема IR Arduino
История
Полезные ссылки
Авторы
Лицензия
Авторское право
NEC / Onkyo / Apple
Denon / Sharp
Panasonic / Kaseikyo
JVC
LG
RC5
RC6
Samsung
Sony
Universal Pulse Distance
Universal Pulse Width
Universal Pulse Distance Width
Hash
Pronto
BoseWave
Bang & Olufsen
MagiQuest
Lego
FAST
Whynter
Протоколы можно включать и выключать, определяя макросы перед строкой #include <IRremote.hpp>
как здесь:
#define DECODE_NEC//#define DECODE_DENON#include <IRremote.hpp>
Множество уроков и примеров.
Активно поддерживается.
Позволяет получать и отправлять необработанные данные синхронизации .
Поскольку версия 4.3 IrSender.begin(DISABLE_LED_FEEDBACK)
больше не будет работать , используйте вместо нее IrSender.begin(DISABLE_LED_FEEDBACK, 0)
.
Добавлен новый универсальный декодер Pulse Distance / Pulse Width / Pulse Distance Width , который охватывает многие ранее неизвестные протоколы.
Распечатка кода отправки полученной команды с помощью IrReceiver.printIRSendUsage(&Serial)
.
Тип RawData теперь 64-битный для 32-битных платформ, и поэтому decodedIRData.decodedRawData
может содержать полную информацию о кадре для большего количества протоколов, чем при 32-битном формате, как раньше.
Обратный вызов после получения команды. Он вызывает ваш код сразу после получения сообщения.
Улучшена обработка протоколов PULSE_DISTANCE
+ PULSE_WIDTH
.
Новый протокол FAST.
Автоматическая распечатка соответствующей функции отправки с помощью printIRSendUsage()
.
Вы должны заменить #define DECODE_DISTANCE
на #define DECODE_DISTANCE_WIDTH
(только если вы явно включили этот декодер).
Параметр bool hasStopBit
больше не требуется и удален, например, для функции sendPulseDistanceWidth()
.
Любой вывод можно использовать для приема, а если SEND_PWM_BY_TIMER
не определен, то и для отправки.
Светодиод обратной связи можно активировать для отправки/получения.
Для декодирования предоставляется 8/16-битное значение команды **, а также 16-битный адрес и номер протокола (вместо старого 32-битного значения).
Значения протокола соответствуют стандартам протокола .
NEC, Panasonic, Sony, Samsung и JVC сначала декодируют и отправляют LSB.
Поддерживает протокол Universal Distance , который охватывает множество ранее неизвестных протоколов.
Совместим с библиотекойtone () . См. пример ПолученияДемо.
Одновременная отправка и получение. См. пример SendAndReceive.
Поддерживает больше платформ .
Позволяет генерировать не ШИМ-сигнал для имитации активного низкого сигнала приемника для прямого подключения к существующим приемным устройствам без использования ИК-излучения.
Простая настройка протокола прямо в исходном коде .
Уменьшает объем памяти и уменьшает время декодирования.
Содержит очень маленький декодер только NEC, который не требует каких-либо ресурсов таймера .
-> Сравнение функций 5 IR-библиотек Arduino.
Начиная с версии 3.1, генерация ШИМ для отправки осуществляется программно , что позволяет сохранить аппаратный таймер и разрешить произвольные выходные контакты для отправки .
Если вы используете (старое) ядро Arduino, которое не использует флаг -flto
для компиляции, вы можете активировать строку #define SUPPRESS_ERROR_MESSAGE_FOR_BEGIN
в IRRemote.h, если во время компиляции вы получаете ложные сообщения об ошибках, касающихся Begin().
Были добавлены объекты IRreceiver и IRsender , которые можно использовать без их определения, как и хорошо известный последовательный объект Arduino.
Просто удалите строку IRrecv IrReceiver(IR_RECEIVE_PIN);
и/или IRsend IrSender;
в вашей программе и замените все вхождения IRrecv.
или irrecv.
с IrReceiver
и замените все IRsend
или irsend
на IrSender
.
Поскольку декодированные значения теперь находятся в IrReceiver.decodedIRData
, а не в results
, удалите строку decode_results results
или аналогичную.
Как и в случае с объектом Serial, вызовите IrReceiver.begin(IR_RECEIVE_PIN, ENABLE_LED_FEEDBACK)
или IrReceiver.begin(IR_RECEIVE_PIN, DISABLE_LED_FEEDBACK)
вместо IrReceiver.enableIRIn()
или irrecv.enableIRIn()
в setup().
Для отправки вызовите IrSender.begin();
в настройке().
Если IR_SEND_PIN не определен (перед строкой #include <IRremote.hpp>
), вы должны использовать, например, IrSender.begin(3, ENABLE_LED_FEEDBACK, USE_DEFAULT_FEEDBACK_LED_PIN);
Старая функция decode(decode_results *aResults)
заменена простой decode()
. Итак, если у вас есть оператор if(irrecv.decode(&results))
замените его на if (IrReceiver.decode())
.
Декодированный результат теперь находится в IrReceiver.decodedIRData
, а не в results
, поэтому замените все вхождения results.value
и results.decode_type
(и подобных) на IrReceiver.decodedIRData.decodedRawData
и IrReceiver.decodedIRData.protocol
.
Флаги переполнения, повтора и другие теперь находятся в IrReceiver.receivedIRData.flags
.
Редко используется: results.rawbuf
и results.rawlen
необходимо заменить на IrReceiver.decodedIRData.rawDataPtr->rawbuf
и IrReceiver.decodedIRData.rawDataPtr->rawlen
.
5 протоколов NEC, Panasonic, Sony, Samsung и JVC сначала были преобразованы в LSB. Функции отправки для отправки старых данных MSB были переименованы в sendNECMSB
, sendSamsungMSB()
, sendSonyMSB()
и sendJVCMSB()
. Старые функции sendSAMSUNG()
и sendSony()
MSB все еще доступны. Старая версия MSB функции sendPanasonic()
была удалена, поскольку в ней были ошибки, которые никто не распознал, и поэтому предполагалось, что она никогда не будет использоваться.
О преобразовании кодов MSB в LSB см. ниже.
#include <IRremote.h>#define RECV_PIN 2IRrecv Increcv(RECV_PIN); результаты decode_results;void setup() { ... Serial.begin(115200); // Устанавливаем последовательную связь inrecv.enableIRIn(); // Запускаем приемник}void Loop() { if (irrecv.decode(&results)) { Serial.println(results.value, HEX); ... иррекв.резюме(); // Получаем следующее значение } ... }
#include <IRremote.hpp>#define IR_RECEIVE_PIN 2void setup() { ... Serial.begin(115200); // // Устанавливаем последовательную связь IrReceiver.begin(IR_RECEIVE_PIN, ENABLE_LED_FEEDBACK); // Запускаем приемник}void Loop() { if (IrReceiver.decode()) { Serial.println(IrReceiver.decodedIRData.decodedRawData, HEX); // Печатаем "старые" необработанные данные IrReceiver.printIRResultShort(&Serial); // Выводим полные полученные данные в одну строку IrReceiver.printIRSendUsage(&Serial); // Распечатываем оператор, необходимый для отправки этих данных ... ИрПолучатель.резюме(); // Включаем получение следующего значения } ... }
Для новых декодеров NEC, Panasonic, Sony, Samsung и JVC результат IrReceiver.decodedIRData.decodedRawData
теперь имеет значение LSB-first , как следует из определения этих протоколов!
Чтобы преобразовать один в другой, вы должны поменять местами позиции байтов/полубайтов, а затем поменять местами все позиции битов каждого байта/полубайта или записать их как одну двоичную строку и перевернуть/отразить их.
Пример: 0xCB 34 01 02
0x20 10 43 BC
после обратного полубайта
0x40 80 2C D3
после реверса битов каждого полубайта
0->0 1->8 2->4 3->C 4->2 5->A 6->6 7->E 8->1 9->9 A->5 B->D C->3 D->B E->7 F->F
0xCB340102
является двоичным 1100 1011 0011 0100 0000 0001 0000 0010
.
0x40802CD3
является двоичным 0100 0000 1000 0000 0010 1100 1101 0011
.
Если вы прочитаете первую двоичную последовательность задом наперед (справа налево), вы получите вторую последовательность. Для этого вы можете использовать bitreverseOneByte()
или bitreverse32Bit()
.
Отправку старых кодов MSB без преобразования можно выполнить с помощью sendNECMSB()
, sendSonyMSB()
, sendSamsungMSB()
, sendJVCMSB()
.
Если у вас возникают ошибки при использовании старого кода руководства, включая IRremote.h
вместо IRremote.hpp
, просто попробуйте вернуться к версии 2.4.0.
Скорее всего ваш код заработает и вы не пропустите новые возможности.
Рассмотрите возможность использования исходной версии 2.4 2017 года или последней обратно совместимой версии 2.8 для вашего проекта.
Этого может быть достаточно, и он безупречно работает с 32-битными ИК-кодами.
Если это не подходит для вашего случая, будьте уверены, что 4.x, по крайней мере, пытается быть обратно совместим, поэтому ваши старые примеры все равно должны работать нормально.
Доступны только следующие декодеры:
NEC
Denon
Panasonic
JVC
LG
RC5
RC6
Samsung
Sony
Вызов irrecv.decode(&results)
использует старые декодеры MSB, как в 2.x, и устанавливает 32-битные коды в results.value
.
Никакого декодирования в более значимый (постоянный) 8/16-битный адрес и 8-битную команду.
Каждый *.cpp файл компилируется отдельно вызовом компилятора исключительно для этого cpp файла. Этими вызовами управляет система IDE/make. В Arduino IDE вызовы выполняются, когда вы нажимаете «Проверить» или «Загрузить» .
И теперь наша проблема с Arduino:
Как установить параметры компиляции для всех файлов *.cpp, особенно для используемых библиотек?
IDE, такие как Sloeber или PlatformIO, поддерживают это, позволяя указать набор параметров для каждого проекта. Они добавляют эти параметры при каждом вызове компилятора, например -DTRACE
.
Но в Arduino нет этой функции. Таким образом, обходной путь заключается не в том, чтобы компилировать все источники отдельно, а в том, чтобы объединить их в один огромный исходный файл, включив их в свой исходный код.
Это делается, например, #include "IRremote.hpp"
.
Но почему бы не #include "IRremote.cpp"
?
Попробуйте, и вы увидите массу ошибок, потому что каждая функция файла *.cpp теперь компилируется дважды: сначала путем компиляции огромного файла, а затем путем компиляции файла *.cpp отдельно, как описано выше.
Таким образом, использование расширения cpp больше невозможно, и одним из решений является использование hpp в качестве расширения, чтобы показать, что это включенный файл *.cpp.
Подойдет любое другое расширение, например cinclude , но hpp кажется здравым смыслом.
Чтобы упростить поддержку параметров компиляции, вы должны использовать оператор #include <IRremote.hpp>
вместо #include <IRremote.h>
в вашей основной программе (он же файл *.ino с setup() и циклом()).
Во всех остальных файлах вы должны использовать следующее, чтобы предотвратить ошибки компоновщика multiple definitions
:
#define USE_IRREMOTE_HPP_AS_PLAIN_INCLUDE#include <IRremote.hpp>
Убедитесь, что все макросы в вашей основной программе определены до любого #include <IRremote.hpp>
.
В противном случае следующие макросы будут обязательно переопределены значениями по умолчанию:
RAW_BUFFER_LENGTH
IR_SEND_PIN
SEND_PWM_BY_TIMER
Очень подробное введение в ИК-пульты и библиотеку IRremote от DroneBot Workshop.
Существует 3 различных способа указания конкретного IR-кода.
Время каждой метки/импульса и пространство/расстояние_между_импульсами указывается в списке или массиве. Это позволяет указать все IR-коды , но требует много памяти и совершенно не читается . Одним из формальных определений такого временного массива, включая спецификацию частоты и повторений, является формат Pronto .
Память можно сэкономить, используя более низкое временное разрешение. Для IRremote вы можете использовать разрешение 50 мкс, что вдвое снижает потребность в памяти за счет использования байтовых значений вместо значений int16. Для целей приема вы можете использовать хэш времени, предоставленный декодером decodeHash()
.
Существует 3 основные схемы кодирования, которые кодируют двоичный поток битов/шестнадцатеричное значение:
PULSE_DISTANCE
. Расстояние между импульсами определяет значение бита. Для этого всегда требуется стоп-бит! Примерами являются протоколы NEC и KASEIKYO. Ширина импульса постоянна для большинства протоколов.
PULSE_WIDTH
. Ширина импульса определяет значение бита, расстояние между импульсами постоянно. Для этого не требуется стоповый бит! Единственный известный пример — протокол SONY.
Фазовое/Манчестерское кодирование. Время перехода импульс/пауза (фаза) относительно тактового сигнала определяет значение бита. Примерами являются протоколы RC5 и RC6.
Фазовое кодирование имеет постоянную длину в битах , PULSE_DISTANCE
с постоянной шириной импульса и PULSE_WIDTH
не имеют постоянной длины в битах !
Хорошо известным примером PULSE_DISTANCE
с кодированием непостоянной ширины импульса является последовательное кодирование RS232 . Здесь непостоянная ширина импульса используется для обеспечения постоянной длины бита .
Большинство ИК-сигналов имеют специальный заголовок , помогающий настроить автоматическое усиление схемы приемника. Этот заголовок не является частью кодирования, но часто важен для специального протокола и поэтому должен быть воспроизводимым.
Имейте в виду, что существуют коды, использующие кодировку PULSE_DISTANCE
, где в комбинацию импульс/пауза помещается больше, чем двоичный 0/1. Для этого требуется более двух различных комбинаций длительности импульса или паузы. Протокол HobToHood использует такую кодировку.
Использование схем кодирования сводит спецификацию IR-кода к битовому потоку/шестнадцатеричному значению, которое по умолчанию равно LSB, и таймингам импульса/паузы заголовка, 0 и 1. Шестнадцатеричное значение вполне читаемо . Эти схемы не могут помещать в этот битовый поток какую-либо семантику, такую как адрес, команду или контрольную сумму.
Существует несколько распространенных протоколов, которые реализованы непосредственно в IRremote. Они определяют частоту, время заголовка, 0 и 1, а также другие значения, такие как контрольная сумма, расстояние повторения, кодирование повторения, переключение битов и т. д. Также указывается семантика шестнадцатеричного значения, что позволяет использовать только два параметра адреса. и команду для указания ИК-кода. Это экономит память и обеспечивает хорошую читаемость . Часто адрес также является постоянным, что еще больше снижает требования к памяти.
Учебное пособие по ИК-датчику Adafruit
В вашей программе вы проверяете полностью полученный ИК-кадр с помощью:
if (IrReceiver.decode()) {}
При этом также декодируются полученные данные.
После успешного декодирования данные IR содержатся в структуре IRData, доступной как IrReceiver.decodedIRData
.
структура IRData {протокол decode_type_t; // НЕИЗВЕСТНО, NEC, SONY, RC5, PULSE_DISTANCE, ... адрес uint16_t; // Декодированный адрес uint16_t команда; // Декодированная команда uint16_t extra; // Используется для идентификатора неизвестного поставщика Kaseikyo. Тики, используемые для декодирования протокола расстояния. uint16_t число битов; // Количество битов, полученных для данных (адрес + команда + четность) – для определения длины протокола, если возможна другая длина. флаги uint8_t; // IRDATA_FLAGS_IS_REPEAT, IRDATA_FLAGS_WAS_OVERFLOW и т. д. См. определения IRDATA_FLAGS_* IRRawDataType decodedRawData; // До 32 (64 бит для 32-битной архитектуры ЦП) декодированных необработанных данных, используемых для функций sendRaw. uint32_t decodedRawDataArray[RAW_DATA_ARRAY_SIZE]; // 32-битные декодированные необработанные данные, которые будут использоваться для функции отправки. irparams_struct *rawDataPtr; // Указатель необработанных данных синхронизации, которые необходимо декодировать. В основном буфер данных заполняется при получении ISR.};
Это список флагов, содержащихся в поле flags.
Проверьте это, например if(IrReceiver.decodedIRData.flags & IRDATA_FLAGS_IS_REPEAT)
.
Название флага | Описание |
---|---|
IRDATA_FLAGS_IS_REPEAT | Промежуток между предыдущим кадром меньше максимального интервала, ожидаемого для повтора. !!!Мы не проверяем изменение команды или адреса, так как нажать 2 разные кнопки на пульте в течение примерно 100 мс практически невозможно!!! |
IRDATA_FLAGS_IS_AUTO_REPEAT | Текущий повторный кадр — это повтор, который всегда отправляется после обычного кадра и его нельзя избежать. Указано только для протоколов DENON и LEGO. |
IRDATA_FLAGS_PARITY_FAILED | Текущий (автоповторяющийся) кадр нарушил проверку четности. |
IRDATA_FLAGS_TOGGLE_BIT | Устанавливается, если установлен бит переключения RC5 или RC6. |
IRDATA_FLAGS_EXTRA_INFO | Существует дополнительная информация, не содержащаяся в адресе и данных (например, идентификатор неизвестного поставщика Kaseikyo или в decodedRawDataArray). |
IRDATA_FLAGS_WAS_OVERFLOW | Слишком много меток и пробелов для указанного RAW_BUFFER_LENGTH . Чтобы избежать бесконечной маркировки переполнения, в этом случае irparams.rawlen устанавливается в 0. |
IRDATA_FLAGS_IS_MSB_FIRST | Это значение в основном определяется (известным) протоколом. |
авто myRawdata = IrReceiver.decodedIRData.decodedRawData;
Определения IrReceiver.decodedIRData.flags
описаны здесь.
IrReceiver.printIRResultShort(&Serial);
IrReceiver.printIRResultRawFormatted(&Serial, true);`
Необработанные данные зависят от внутреннего состояния таймера Arduino по отношению к полученному сигналу и поэтому могут каждый раз немного отличаться. (проблема с разрешением). Декодированные значения — это интерпретированные значения, которые терпимы к таким небольшим различиям!
IrReceiver.printIRSendUsage(&Serial);
Протокол NEC определяется как 8-битный адрес и 8-битная команда. Но каждое поле физического адреса и данных имеет ширину 16 бит. Дополнительные 8 бит используются для отправки инвертированного адреса или команды проверки четности.
Расширенный протокол NEC использует дополнительные 8 бит четности адреса для 16-битного адреса, тем самым отключая проверку четности для адреса.
Протокол ONKYO, в свою очередь, использует дополнительные 8 битов четности адреса и команды для 16-битного адреса и команды.
Декодер уменьшает 16-битные значения до 8-битных, если четность верна. Если четность неверна, предполагается отсутствие ошибки четности, но принимает значения как 16-битные значения без проверки четности, предполагая расширенный протокол NEC или расширенный протокол NEC.
Но теперь у нас возникает проблема, когда мы хотим получить, например, 16-битный адрес 0x00FF или 0x32CD! Декодер интерпретирует это как 8-битный адрес NEC 0x00/0x32 с правильной четностью 0xFF/0xCD и уменьшает его до 0x00/0x32.
Один из способов справиться с этим — заставить библиотеку всегда использовать интерпретацию протокола ONKYO, используя #define DECODE_ONKYO
. Другой способ — проверить, является ли IrReceiver.decodedIRData.protocol
NEC, а не ONKYO, и вручную отменить уменьшение четности.
При длительном нажатии протокол NEC не повторяет свой кадр, а отправляет специальный короткий повторный кадр. Это позволяет легко различать длинные нажатия и повторные нажатия и экономит немного энергии аккумулятора. Такое поведение совершенно уникально для NEC и производных от него протоколов, таких как LG и Samsung.
Но, конечно, существуют также системы дистанционного управления, которые используют протокол NEC, но повторяют только первый кадр при длительном нажатии вместо отправки специального короткого повторного кадра. Мы назвали его протоколом NEC2 , и он отправляется с помощью sendNEC2()
.
Но будьте осторожны, протокол NEC2 может быть обнаружен декодером библиотеки NEC только после первого кадра и при длительном нажатии!
При длительном нажатии протокол SamsungLG не повторяет свой кадр, он отправляет специальный короткий повторный кадр.
RAW_BUFFER_LENGTH
определяет длину байтового буфера , в котором сохраняются полученные данные синхронизации IR перед декодированием.
100 достаточно для стандартных протоколов до 48 бит , при этом 1 бит состоит из одной метки и пробела. Нам всегда требуются дополнительные 4 байта: 1 байт для начального пробела, 2 байта для заголовка и 1 байт для стопового бита.
48- битные протоколы — PANASONIC, KASEIKYO, SAMSUNG48, RC6.
32- битные протоколы, такие как NEC, SAMSUNG, WHYNTER, SONY(20), LG(28), требуют длины буфера 68 .
16- битные протоколы, такие как BOSEWAVE, DENON, FAST, JVC, LEGO_PF, RC5, SONY(12 или 15), требуют длины буфера 36 .
MAGIQUEST требует длину буфера 112 .
Кондиционеры часто отправляют поток данных по более длинному протоколу — до 750 бит .
Если интервал записи, определенный RECORD_GAP_MICROS
изменяется с 8 мс по умолчанию на более чем 20 мс, буфер больше не является байтом, а является буфером uint16_t, требующим вдвое больше ОЗУ.
Эта библиотека была разработана для использования в микроконтроллерах с относительно низким уровнем ресурсов и предназначалась для работы в качестве библиотеки вместе с другими приложениями, для работы которых также требуются некоторые ресурсы микроконтроллера.
Используйте пример ReceiveDemo , чтобы распечатать всю информацию о вашем ИК-протоколе.
Пример ReceiveDump дает больше информации, но имеет плохое обнаружение повторов из-за времени, необходимого для печати информации.
Если кажется, что ваш протокол не поддерживается этой библиотекой, вы можете попробовать библиотеку IRMP, которая особенно лучше поддерживает манчестерские протоколы.
Для кондиционеров вы можете попробовать библиотеку IRremoteESP8266, которая поддерживает впечатляющий набор протоколов и множество кондиционеров, а также работает на ESP32.
Raw-IR-decoder-for-Arduino — это не библиотека, а пример эскиза Arduino, который предоставляет множество методов декодирования, особенно протоколов кондиционеров . Отправку этих протоколов можно выполнить с помощью библиотеки Arduino HeatpumpIR.
Если вы получите что-то вроде этого:
PULSE_DISTANCE: HeaderMarkMicros=8900 HeaderSpaceMicros=4450 MarkMicros=550 OneSpaceMicros=1700 ZeroSpaceMicros=600 NumberOfBits=56 0x43D8613C 0x3BC3BC
тогда у вас есть код, состоящий из 56 бит , который, вероятно, от пульта кондиционера.
Вы можете отправить его с помощью sendPulseDistanceWidth()
.
uint32_t tRawData[] = { 0xB02002, 0xA010 }; IrSender.sendPulseDistance(38, 3450, 1700, 450, 1250, 450, 400, &tRawData[0], 48, false, 0, 0);
Вы можете отправить его, вызвав sendPulseDistanceWidthData()
дважды: один раз для первых 32 бит, а затем для оставшихся 24 бит.
Декодер PULSE_DISTANCE
/ PULSE_WIDTH
просто декодирует поток синхронизации в битовый поток, хранящийся в виде шестнадцатеричных значений. Эти декодеры не могут помещать в этот битовый поток какую-либо семантику, такую как адрес, команду или контрольную сумму. Но битовый поток гораздо более читаем, чем поток синхронизации. По умолчанию этот битовый поток сначала читается LSB . Если LSB не подходит для дальнейшего исследования, вы можете изменить его здесь.
Если объем ОЗУ не превышает 2 КБ, декодер принимает только длительность метки или пробела до 2500 микросекунд для экономии места в ОЗУ, в противном случае он принимает длительность до 10 мс.
Если вы видите что-то вроде Protocol=UNKNOWN Hash=0x13BD886C 35 bits received
в качестве выходных данных, например, примера ReceiveDemo, у вас либо проблема с декодированием протокола, либо неподдерживаемый протокол.
Если вы получили нечетное количество битов , возможно, в вашей схеме приемника возникли проблемы. Возможно, потому, что ИК-сигнал слишком слабый.
Если вы видите такие тайминги, как + 600,- 600 + 550,- 150 + 200,- 100 + 750,- 550
то один интервал 450 мкс был разделен на два интервала 150 и 100 мкс с сигналом всплеска/ошибки 200 мкс между ними. Возможно, из-за неисправного приемника или слабого сигнала в сочетании с другим источником света поблизости.
Если вы видите такие тайминги, как + 500,- 550 + 450,- 550 + 450,- 500 + 500,-1550
, то метки обычно короче пробелов, и поэтому MARK_EXCESS_MICROS
(указанный в вашем ino-файле) должен быть отрицательным , чтобы компенсировать это. при декодировании.
Если вы видите Protocol=UNKNOWN Hash=0x0 1 bits received
возможно, пространство после начальной отметки длиннее, чем RECORD_GAP_MICROS
. Это наблюдалось для некоторых протоколов кондиционеров LG. Попробуйте еще раз, например, используя строку #define RECORD_GAP_MICROS 12000
перед строкой #include <IRremote.hpp>
в вашем файле .ino.
Чтобы просмотреть дополнительную информацию, которая поможет вам найти причину вашего НЕИЗВЕСТНОГО протокола, вы должны включить строку //#define DEBUG
в IRremoteInt.h.
Если вы не знаете, какой протокол использует ваш ИК-передатчик, у вас есть несколько вариантов.
Просто используйте значение хеш-функции, чтобы определить, какая команда была получена. См. пример SimpleReceiverForHashCodes.
Используйте пример IRreceiveDemo или пример IRreceiveDump, чтобы вывести время IR. Затем вы можете воспроизвести/отправить это время с помощью примера SendRawDemo.
Пример IRMP AllProtocol выводит протокол и данные для одного из 40 поддерживаемых протоколов . Для отправки этих кодов можно использовать ту же библиотеку.
Если у вас есть плата Arduino большего размера (> 100 КБ программной памяти), вы можете попробовать пример IRremoteDecode библиотеки Arduino DecodeIR.
Используйте IrScrutinizer. Он может автоматически генерировать эскиз отправки для вашего протокола, экспортируя его как «Arduino Raw». Он поддерживает IRremote, старую версию IRLib и Infrared4Arduino.
Если у вас под рукой есть устройство, которое может генерировать ИК-коды, с которыми вы хотите работать (также известное как ИК-пульт), рекомендуется получать коды с помощью примера ReceiveDemo, который сообщит вам на последовательном выходе, как их отправлять.
Protocol=LG Address=0x2 Command=0x3434 Raw-Data=0x23434E 28 bits MSB first Send with: IrSender.sendLG(0x2, 0x3434, <numberOfRepeats>);
Вы обнаружите, что адрес является константой , а команды иногда разумно сгруппированы.
Если вы не уверены в количестве повторов, которые следует использовать для отправки, хорошей отправной точкой будет 3 . Если это сработает, вы можете впоследствии проверить более низкие значения.
Если вы включили DECODE_DISTANCE_WIDTH
, код, напечатанный printIRSendUsage()
различается на 8- и 32-битных платформах , поэтому лучше всего запускать принимающую программу на той же платформе, что и отправляющую программу.
Все функции отправки поддерживают отправку повторов, если это целесообразно. Повторные кадры отправляются через фиксированный период, определяемый протоколом. например, 110 мс от начала до начала для NEC.
Имейте в виду, что после последней отправленной отметки задержки нет . Если вы самостоятельно обрабатываете отправку повторяющихся кадров, вам необходимо вставить разумные задержки перед повторными кадрами, чтобы обеспечить правильное декодирование.
Отправку старых кодов MSB без преобразования можно выполнить с помощью sendNECMSB()
, sendSonyMSB()
, sendSamsungMSB()
, sendJVCMSB()
.
Коды, найденные в базе данных Flipper-IRDB, довольно легко конвертировать, поскольку они также используют схему адрес/команда.
Соответствие протоколов: NECext -> NECext (или Onkyo), Samsung32 -> Samsung, SIRC20 -> Sony с 20 битами и т. д.
Коды, найденные в базе данных irdb, определяют устройство , подустройство и функцию . В большинстве случаев устройство и подустройство могут быть приняты как верхний и нижний байт параметра адреса , а функция является параметром команды для новых структурированных функций с параметрами адреса, команды и количества повторений, например, IrSender.sendNEC((device << 8) | subdevice, 0x19, 2)
.
Точное сопоставление можно найти в файлах определения IRP для протоколов IR. «D» и «S» обозначают устройство и подустройство, а «F» обозначает функцию.
Любой вывод может быть выбран в качестве вывода отправки, поскольку сигнал ШИМ по умолчанию генерируется с помощью программного бита, поскольку SEND_PWM_BY_TIMER
не активен.
В ESP32 канал 0 светодиода используется для генерации ИК-ШИМ.
Если указан IR_SEND_PIN
(как макрос c), это уменьшает размер программы и улучшает время отправки для AVR. Если вы хотите использовать переменную для указания вывода отправки, например, с помощью setSendPin(uint8_t aSendPinNumber)
, вы должны отключить этот макрос IR_SEND_PIN
. Затем вы можете изменить PIN-код отправки в любое время перед отправкой ИК-кадра. См. также параметры компиляции/макросы для этой библиотеки.
http://www.harctoolbox.org/IR-resources.html
База данных Flipper IRDB
Декодирование флиппера | IRдистанционное декодирование |
---|---|
Самсунг32 | Samsung |
НЭК | НЭК |
NECext | ОНКЁ |
<стартовый бит><VendorID:16><Четность VendorID:4><Genre1:4><Genre2:4><Command:10><ID:2><Parity:8><stop bit> и ID — это старший бит адреса. адрес: 8А 02 20 00 команда: 56 03 00 00 -> IRудалённый: Адрес 0x6A8, sendPanasonic (для 02 20) и команда 0x35. | <стартовый бит><VendorID:16><Четность VendorID:4><Адрес:12><Команда:8><Четность VendorID, четность, адрес и команда:8><стоповый бит> |
Для приложений, требующих только NEC, вариантов NEC или протокола FAST (см. ниже), в комплект входит специальный приемник/отправитель, который имеет очень небольшой размер кода - 500 байт и НЕ требует какого-либо таймера .
Вместо выборки входных данных каждые 50 мкс, как это делает IRremote, приемник TinyReceiver использует прерывание смены контакта для оперативного декодирования, что ограничивает выбор протоколов.
При каждом изменении уровня уровень и время с момента последнего изменения используются для постепенного декодирования протокола.
При таком принципе работы мы не можем дождаться таймаута , а затем декодировать протокол, как это делает IRremote.
Вместо этого нам нужно знать, какой бит (изменение уровня) протокола является последним для окончательного декодирования и вызова дополнительной пользовательской функции обратного вызова handleTinyReceivedIRData()
.
Это означает, что нам нужно знать количество битов в протоколе и, следовательно, протокол (семейство).
Ознакомьтесь с примерами TinyReceiver и IRDispatcherDemo.
Обязательно включите TinyIRReceiver.hpp
или TinyIRSender.hpp
вместо IRremote.hpp
.
//#define USE_ONKYO_PROTOCOL // Как NEC, но возьмите 16-битный адрес и команду для каждого как одно 16-битное значение, а не как 8-битное нормальное и 8-битное инвертированное значение. //#define USE_FAST_PROTOCOL // Используйте протокол FAST вместо NEC / ONKYO#include "TinyIRReceiver.hpp"void setup() { initPCIInterruptForTinyReceiver(); // Включает генерацию прерывания при изменении входного ИК-сигнала}voidloop() { if (TinyReceiverDecode()) { printTinyReceiverResultMinimal(&Serial); } // Возобновить() не требуется :-)}
#include "TinyIRSender.hpp"void setup() { sendNEC(3, 0, 11, 2); // Отправляем адрес 0 и команду 11 на контакт 3 с двумя повторениями.}voidloop() {}
Еще один крошечный получатель и отправитель, поддерживающий больше протоколов, можно найти здесь.
Протокол FAST — это собственный модифицированный протокол JVC без адреса, с четностью и с более коротким заголовком . Он предназначен для быстрого реагирования на событие, которое отправило кадр протокола на другую плату. FAST занимает 21 мс для отправки и отправляется с периодом 50 мс . Он имеет полную 8-битную четность для обнаружения ошибок.
Битовая синхронизация похожа на JVC
Заголовок короче: 3156 мкс против 12 500 мкс.
Нет адреса и 16-битные данные, интерпретируемые как 8-битная команда и 8-битная инвертированная команда, что приводит к фиксированной длине протокола (6 + (16 * 3) + 1) * 526 = 55 * 526 = 28930 микросекунд или 29 мс.
Повторы отправляются как полные кадры, но с периодом 50 мс/с интервалом 21 мс.
#define IR_SEND_PIN 3#include <IRremote.hpp>void setup() { sendFAST(11, 2); // Отправляем команду 11 на контакт 3 с двумя повторениями.}voidloop() {}
#define USE_FAST_PROTOCOL // Использовать протокол FAST. Нет адреса и 16-битные данные, интерпретируемые как 8-битная команда и 8-битная инвертированная команда#include "TinyIRSender.hpp"void setup() { sendFAST(3, 11, 2); // Отправляем команду 11 на контакт 3 с двумя повторениями.}voidloop() {}
Протокол FAST может быть получен с помощью IRremote и TinyIRReceiver.
Интервал выборки приемника 50 мкс генерируется таймером. На многих платах это должен быть аппаратный таймер. На некоторых платах, где доступен таймер программного обеспечения, используется таймер программного обеспечения.
Имейте в виду, что аппаратный таймер, используемый для получения, не должен использоваться для analogWrite()
.
Особенно управление двигателем часто использует функцию analogWrite()
и поэтому останавливает прием, если он используется на выводах, указанных здесь.
На ООН и других досках AVR таймер приемника так же, как и таймер тона. Таким образом, получение остановится после команды tone()
. См IrReceiver.restartTimer()
Пример получения
Флаг IRDATA_FLAGS_WAS_OVERFLOW
установлен, если RAW_BUFFER_LENGTH
слишком мал для всех отметок и пространств протокола. Это может произойти на длинных кадрах протокола, таких как рамки кондиционера. Это также может произойти, если RECORD_GAP_MICROS
меньше реального разрыва между кадром и трэк -повторением, тем самым интерпретируя оба как одну последовательную кадр. Лучше всего сбросить время, чтобы увидеть, какая причина удерживает.
Irremote не будет работать правильно, когда вы используете Neopixels (он же WS2811/WS2812/WS2812B) или другие библиотеки, блокирующие прерывания в течение более длительного времени (> 50 мкс).
Независимо от того, используете ли вы Adafruit Neopixel Lib или быстро, прерывания отключены на многих более низких процессорах, таких как основные Arduinos дольше 50 мкс. В свою очередь, это мешает ИК -обработчику прерываний, когда это нужно. Смотрите также это видео.
Один обходной путь - дождаться простоя IR -приемника, прежде чем отправлять неопиксельные данные с if (IrReceiver.isIdle()) { strip.show();}
.
Это предотвращает, по крайней мере, нарушение проводящей ИК -передачи и -азартинизации скорости обновления неопикселя может работать довольно хорошо.
Есть некоторые другие решения для этого на более мощных процессорах, см. Эта страница от Марка Мерлина
Другая библиотека работает/компиляция только в том случае, если вы деактивируете линию IrReceiver.begin(IR_RECEIVE_PIN, ENABLE_LED_FEEDBACK);
.
Это часто связано с конфликтами ресурсов таймера с другой библиотекой. Пожалуйста, смотрите ниже.
Эта библиотека поддерживает только один ИК -приемник и один объект IR отправителя (IRCV и IRSEND) на процессор.
Однако, поскольку отправка является последовательной задачей, вы можете использовать setSendPin()
для переключения вывода на отправку, подражая нескольким отправителю.
Приемник использует специальную функцию, запускаемую таймер , которая считывает цифровое значение IR -сигнала из одного вывода каждые 50 мкс.
Таким образом, несколько ИК -приемников могут использоваться только путем соединения выходных контактов нескольких ИК -приемников вместе. Модули IR -приемника внутри используют транзистор NPN в качестве устройства вывода с резистором 30 тыс. В VCC. Это в основном «открытый коллекционер» и позволяет подключить несколько выходных контактов к одному входному выводу Arduino.
Тем не менее, имейте в виду, что любой слабый / нарушенный сигнал от одного из приемников также будет мешать хорошему сигналу от другого приемника.
Лучший способ увеличить электроэнергию бесплатно - это использовать 2 или 3 IR -диода последовательно. Один диод требует 1,2 вольт при 20 мА или 1,5 вольт при 100 мА, чтобы вы могли подать до 3 диодов с выходом 5 вольт.
Для питания 2 диодов с 1,2 В и 20 мА и 5 В питанием, установите резистор на: (5 В - 2,4 В) -> 2,6 В / 20 мА = 130 Ом .
Для 3 диодов требуется 1,4 В / 20 мА = 70 Ом .
Фактический ток может быть ниже с момента потери на штифте AVR . Например, 0,3 В при 20 мА.
Если вам не требуется больше тока, чем 20 мА, нет необходимости использовать внешний транзистор (по крайней мере, для чипсов AVR).
На моих нано -arduino я всегда использую сериал 100 Ом резистор и один из IR -светодиодов?
Для получения минимальной тактовой частоты процессора составляет 4 МГц , поскольку таймер 50 мкс ISR (процедура обслуживания прерывания) занимает около 12 мкс на ATMEGA 16 МГц.
Tinyreceiver, который не требует опроса, работает с 1 МГц.
Для отправки программное обеспечение, созданное по умолчанию, имеет проблемы с запуском AVR с 8 МГц . Частота ШИМ составляет около 30 вместо 38 кГц, а RC6 не является надежной. Вы можете переключиться на Timer Pwm Generation от #define SEND_PWM_BY_TIMER
.
Декодер протокола Bang & Olufsen не включен по умолчанию, то есть, если протокол не включен явно #define DECODE_<XYZ>
. Он всегда должен быть включен явно #define DECODE_BEO
. Это связано с тем, что он имеет IR -частоту передачи 455 кГц и, следовательно, требует другого аппаратного обеспечения приемника (TSOP7000).
А поскольку генерация сигнала PWM 455 кГц в настоящее время реализовано только для SEND_PWM_BY_TIMER
, отправка только работает, если определена SEND_PWM_BY_TIMER
или USE_NO_SEND_PWM
.
Для получения дополнительной информации см. Ir_bangolufsen.hpp.
Примеры доступны в File> Примеры> Примеры из пользовательских библиотек / Irmote.
Чтобы соответствовать примерам 8K Flash of Attiny85 и Attiny88, библиотека Arduino AttinySerialout требуется для этого процессора.
См. Также Семинар DroneBot SimpleCeeriver и Simplesender.
Примеры простых и Simplesender являются хорошей отправной точкой. Простой пример может быть протестирован в Интернете с Wokwi.
SimpleReceiverforhashcodes использует только хэш -декодер. Он преобразует все IR -кадры до более 6 в 32 -битный хеш -код, что позволяет получить неизвестные протоколы.
См.: Http://www.righto.com/2010/01/using-arbitrary-remotes-with-arduino.html
Если размер кода или использование таймера имеет значение, посмотрите на эти примеры.
В примере TineReceiver используется библиотека TinyirReceiver , которая может получать только NEC, расширенный NEC, Onkyo и Fast Protocols, но не требует никакого таймера . Они используют прерывание замены вывода для декодирования на лету, что является причиной выбора ограниченного протокола.
Tinyreceiver может быть протестирован в Интернете с Wokwi.
В примере Tinysender используется библиотека Tinyirsender , которая может отправлять только NEC, Onkyo и Fast Protocols .
Он отправляет коды протоколов NEC в стандартном формате с 8 -битным адресом и 8 -битной командой, как в примере Simplesender. У него есть варианты отправки с использованием расширенного NEC, Onkyo и Fast Protocols. Сохраняет 780 байт программной памяти и 26 байт -оперативной памяти по сравнению с Simplesender, который делает то же самое, но использует библиотеку Irmote (и поэтому является гораздо более гибким).
Если протокол не имеет значения NEC, а размер кода имеет значение, посмотрите на этот пример.
Полученная команда получает все протоколы и генерирует звуковой сигнал с функцией Arduino Tone () на каждом полученном пакете.
Длинное нажатие одной IR -кнопки (получение нескольких повторений для одной команды) обнаруживается.
AllProtocolsonlcd дополнительно отображает короткий результат на ЖК -дисплее 1602 . ЖК -дисплей может быть подключен параллельно или последовательным (I2C).
Подключив штифт отладки к земле, вы можете принуждать печать необработанных значений для каждого кадра. Номер PIN -кода отладчика печатается во время настройки, потому что он зависит от типа подключения к борту и ЖК -дисплея.
Этот пример также служит примером, как использовать Irmote и Tone () вместе .
Получает все протоколы и сбрасывает полученный сигнал в разных ароматах, включая формат Pronto. Поскольку печать занимает много времени, повторные сигналы могут быть пропущены или интерпретированы как неизвестные.
Отправляет все доступные протоколы хотя бы один раз.
Демонстрирует получение во время отправки .
Запишите и воспроизводитесь последним полученным IR -сигналом на нажмите кнопку. ИК -рамки известных протоколов отправляются соответствующим протоколом. UNKNOWN
рамки протоколов хранятся как необработанные данные и отправляются с sendRaw()
.
Попробуйте декодировать каждый ИК -кадр с помощью универсального декодера расстояния , сохраните данные и отправьте его на кнопку нажмите с помощью sendPulseDistanceWidthFromArray()
.
Если ОЗУ не превышает 2K, декодер принимает только марку или пространственную продолжительность до 2500 микросекунд, чтобы сохранить пространство ОЗУ, в противном случае он принимает продолжительность до 10 мс.
Хранение данных для протокола ширины расстояния требует 17 байтов. Пример GetiveAndsend требует 16 байтов для известных данных протокола и 37 байтов для необработанных данных протокола EGNEC.
Служит ИК -удаленным расширителем макроса . Получает протокол SAMSUNG32 и при получении указанной входной кадры он отправляет несколько кадров Samsung32 с соответствующими задержками между ними. Это служит эмуляцией Netflix-ключа для моего старого телевизора Samsung H5273.
Структура для вызова различных функций вашей программы для разных ИК -кодов.
Управляйте реле (подключенным к выходному выводу) с помощью дистанционного управления.
Пример для пользователя, определенного класса, который сам использует класс Ircv от Irmote.
Пример для отправки IR -кодов LG кондиционера, управляемых последовательным входом.
Просто используя функцию bool Aircondition_LG::sendCommandAndParameter(char aCommand, int aParameter)
вы можете управлять кондиционером любым другим источником команды.
Файл ACLG.H содержит командную документацию IR -протокола кондиционера LG. На основе обратной инженерии LG AKB73315611 Remote.
IreCeivertimingAnalysis может быть протестирован в Интернете с Wokwi, нажмите на приемник во время выполнения моделирования для указания отдельных ИК -кодов.
Пример получения и отправки протокола AEG / Elektrolux HOB2HONH.
В этом примере анализируется сигнал, подаваемый вашим ИК -приемником модулем. Значения могут использоваться для определения стабильности принятого сигнала, а также подсказки для определения протокола.
Он также вычисляет значение MARK_EXCESS_MICROS
, которое является расширением продолжительности Mark (Pulse), введенной модулем IR -приемника.
Его можно проверить в Интернете с Wokwi. Нажмите на приемник во время выполнения моделирования, чтобы указать отдельные коды IR.
Полученное время + SendDemo в одной программе. Демонстрирует получение во время отправки . Здесь вы видите задержку выхода приемника (синий) от IR Diode Point (желтый).
Простой приемник
Простой переключатель от IR Key 5
Tinyreceiver
Получение
Приемник с оператором LCD и оператором переключения
Этот пример библиотеки Arduino pwmmotorControl управляет основными функциями робота -автомобиля с использованием библиотеки Irmote.
Он контролирует 2 -то чашечные каналы, 2 двигателя на каждом канале.
Здесь вы можете найти инструктаж для автомобильной сборки и кода.
IR_ROBOTCAR с IR -приемником TL1838, подключенным к плате расширения.
Не открывайте проблему без первого тестирования некоторых примеров!
Если у вас есть проблема, пожалуйста, опубликуйте MCVE (минимальный полной проверенный пример), показывающий эту проблему. Мой опыт в том, что в большинстве случаев вы найдете проблему при создании этого MCVE?
Используйте кодовые блоки; Это помогает нам помочь вам, когда мы сможем прочитать ваш код!
Чтобы настроить библиотеку для различных требований, есть некоторые параметры компиляции / макросы.
Эти макросы должны быть определены в вашей программе до строки #include <IRremote.hpp>
для вступления в силу.
Измените их, включив / отключив их, или измените значения, если применимо.
Имя | Значение по умолчанию | Описание |
---|---|---|
RAW_BUFFER_LENGTH | 200 | Размер буфера необработанного входа UINT16_T Buffer. Должно быть даже! Если он слишком маленький, будет установлен флаг переполнения. 100 достаточно для обычных протоколов до 48 бит, но для большинства протоколов кондиционера требуется значение до 750. Используйте пример MediceUp, чтобы найти наименьшее значение для ваших требований. Значение 200 требует 200 байтов ОЗУ. |
EXCLUDE_UNIVERSAL_PROTOCOLS | неполноценный | Исключает универсальный декодер для протоколов ширины расстояния импульса и декодехаша (специальный декодер для всех протоколов) от decode() . Сохраняет до 1000 байт памяти программы. |
DECODE_<Protocol name> | все | Выбор отдельных протоколов, который должен быть декодирован. Вы можете указать несколько протоколов. Смотрите здесь |
DECODE_STRICT_CHECKS | неполноценный | Проверьте дополнительные необходимые характеристики времени протокола, например, длина отметки для постоянного протокола марки, где длина пространства определяет значение бита. Требуется до 194 дополнительных байтов программной памяти. |
IR_REMOTE_DISABLE_RECEIVE_COMPLETE_CALLBACK | неполноценный | Сохраняет до 60 байтов программной памяти и 2 байта ОЗУ. |
MARK_EXCESS_MICROS | 20 | MARK_EXCESS_MICROS вычитается из всех отметок и добавляется во все пространства перед декодированием, чтобы компенсировать формирование сигнала различных модулей ИК -приемника. |
RECORD_GAP_MICROS | 5000 | Минимальный разрыв между ИК -передачи, чтобы обнаружить конец протокола. Должен быть больше, чем любое пространство протокола, например, пространство заголовка NEC 4500 мкс. Должен быть меньше любого разрыва между командой и повторением; Например, разрыв в повторной передаче для Sony составляет около 24 мс. Имейте в виду, что это задержка между окончанием полученной команды и началом декодирования. |
DISTANCE_WIDTH_DECODER_DURATION_ARRAY_SIZE | 50, если RAM <= 2K, еще 200 | Значение 200 позволяет декодировать отметки или пропускную жизнь до 10 мс. |
IR_INPUT_IS_ACTIVE_HIGH | неполноценный | Включите его, если вы используете радиочастотный приемник, который имеет активный высокий выходной сигнал. |
IR_SEND_PIN | неполноценный | Если указано, это уменьшает размер программы и улучшает время отправки для AVR. Если вы хотите использовать переменную для указания Send PIN -код EG с помощью setSendPin(uint8_t aSendPinNumber) , вы не должны использовать / отключить этот макрос в своем источнике. |
SEND_PWM_BY_TIMER | неполноценный | Отключает генерацию PWM -носителя в программном обеспечении и используйте аппаратный ШИМ (по таймеру). Имеет преимущество более точного генерации ШИМ, особенно Duty Cyc
Расширять
Дополнительная информация
Связанные приложения
Рекомендуем вам
Связанные новости
Все
|