Как конвертировать коды Arduino-IRremote в формат Tasmota-IRSend
Как преобразовать IR-коды из формата библиотеки Arduino IRRemote в формат Tasmota IRSend? У меня есть ИК-приемник, построенный на базе Arduino Nano. Я записал коды со своего пульта дистанционного управления NEC, используя пример программы, поставляемый в комплекте с библиотекой. Коды сообщаются в виде
Protocol=NEC Address=0xF300 Command=0x91 Raw-Data=0x6E91F300, 32 bits LSB first.
Я использовал программу IRSender из тех же примеров библиотеки и подал приведенные выше коды на свой ИК-светодиод. Это работает отлично. Теперь все мои устройства IoT используют Tasmota, поэтому я хочу интегрировать в них ИК-отправитель. Но когда я попытался отправить необработанные данные с помощью команды Tasmota IRSend, это не сработало. Я пробовал совместить адрес и команду разными способами. Например:
IRSend {"Protocol":"NEC","Bits":32,"Data": 0x6E91F300 }
IRSend {"Protocol":"NEC","Bits":32,"Data": 0x91F300 }
IRSend {"Protocol":"NEC","Bits":32,"Data": 0xF30091 }
и т. д., и даже в виде строки в кавычках:
IRSend {"Protocol":"NEC","Bits":32,"Data": "0xF30091" }
Но ничего из этого не работает. Само оборудование в порядке, поскольку оно хорошо работает с библиотекой Arduino. Пожалуйста, помогите мне с преобразованием формата ИК-кода между Arduino и Tasmota.
1 ответ
Наконец я выяснил соответствие между IR-кодами Arduino и IR-кодами Tasmota.
В следующем описании я называю группу из 4 битовnibble
и 8 бит какoctet
. Таким образом, полубайт представляет одну шестнадцатеричную цифру, а октет — две шестнадцатеричные цифры.
Кreversing the bits
под полубайтом мы подразумеваем чтение 4 битов назад, например:
0001 становится 1000,
1101 становится 1011 и т. д.
К1's complement
мы имеем в виду инвертирование каждого бита на свое место. Например:
1001 становится 0110,
0001 становится 1110 и т. д.
Протокол NEC отправляет каждую 8-битную команду дважды: один раз в исходном виде, а второй раз с инвертированным битом, т. е. с дополнением до одного бита.
Процедура преобразования протокола:
В библиотеке Arduino IR Remote ИК-команда состоит из 16-битного адреса и 8-битной команды. (Часть «необработанных данных» можно игнорировать). Например, у меня есть пульт дистанционного управления Onida Smart TV, который имеет следующую ИК-команду для включения/выключения:
Protocol=NEC Address=0xDF20 Command=0xB Raw-Data=0xF40BDF20 32 bits LSB first.
Сначала давайте обработаем адрес устройства и преобразуем его в формат Tasmota:
Адрес:0xDF20
- Если он меньше 16 бит, добавьте ведущие нули, чтобы получилось 4 полубайта.
- Поменяйте местами два октета:
DF 20
-> - Внутри каждого октета поменяйте местами полубайты:
20 DF
->02 FD
В двоичном виде это - Внутри каждого полубайта поменяйте местами биты:
0000 0010 1111 1101
->0000 0100 1111 1011
Таким образом, в Hex часть адреса становится:04 FB
. Оставьте это на потом.
Теперь давайте обработаем 8-битную часть команды:
- Если оно меньше 8 бит, добавьте ведущий ноль:
0xB
становится0x0B
- Поменяйте местами два кусочка:
0B
-> В двоичном формате,B0
является - Поменяйте местами биты в каждом полубайте:
1011 0000
->1101 0000
Добавьте еще 8 бит, которые являются дополнением до 1 битов в этом октете: Таким образом0010 1111
добавлен. Вся командная часть теперь
1101 0000 0010 1111
В шестнадцатеричной записи этоD02F
.
Наконец, объедините адрес и части команды:04FBD02F
Его необходимо отправить с консоли Tasmota следующим образом:
IRSend {"Protocol":"NEC","Bits":32,"Data": 0x4FBD02F }