Ик-пульт - как отправить сигнал?

Тема в разделе "Arduino & Shields", создана пользователем Mabru, 26 ноя 2020.

  1. Mabru

    Mabru Нерд

    Добрый день.
    Начал вникать в получение и отправку ИК сигналов при помощи Ардуино. С получением проблем никаких нет, много поясняющего материала и примеров.
    Но с отправкой данных проблемы. Есть примеры по стандартам (NEC и пр.), а пояснения по отправке в произвольной форме не нашел.
    Понял, что надо использовать функцию из библиотеки IRRemote.

    Код (C++):
    IrSender.sendRaw(buf, len,  khz);
    при этом buf это массив, в котором прописано число, которое надо отправить. Не могу понять, как заполнять этот массив. Пока изучал, как принимать ИК-сигнал, натыкался на статью, где об этом говорилось. Что в массиве прописывается каждая цифра, из которого состоит число. Но потом уже не смог найти эту статью, когда начал разбираться с отправкой ИК-сигнала.
    В каком формате надо заполнять этот массив? Например, если есть число 123456.
    Что означает второй аргумент в функции - len? Как его вычислить?
     
  2. Рокки1945

    Рокки1945 Гуру

    len - длина больше не знаю
     
  3. parovoZZ

    parovoZZ Гуру

    buf - указатель на буфер
    len - его длина
    khz - несущая частота. Зависит от приёмной стороны.
     
  4. Mabru

    Mabru Нерд

    Да, это понятно. Но как заполнить этот массив? Как внести в него число 123456? Надо каждую цифру отдельно заносить. Нужна отдельная кодировка или можно вносить [1], [2], [3] и т.д.?
     
  5. parovoZZ

    parovoZZ Гуру

    Почитать про массивы.
     
  6. Mabru

    Mabru Нерд

    В массив данные я конечно внесу. Я просто не могу понять про кодировку.
    В одном примере я вижу такое

    Код (C++):
        unsigned int buf[] = {1690, 560, 560, 560, 560, 560,
                              1690,1690, 560,1690,1690,1690,
                              1690,1690, 560, 560, 560,1690,
                               560, 560, 560, 560,1690,1690,
                              1690, 560,1690,1690,1690,1690 };
    В примере Arduino для функции IRemot

    Код (C++):
    const uint8_t irSignalP[] PROGMEM
    = { 180, 90 /*Start bit*/, 11, 11, 11, 11, 11, 34, 11, 34/*0011 0xC of address LSB first*/, 11, 11, 11, 11, 11, 11, 11, 11/*0000*/,
            11, 34, 11, 34, 11, 11, 11, 34/*1101 0xB*/, 11, 34, 11, 34, 11, 34, 11, 34/*1111*/, 11, 11, 11, 11, 11, 11, 11,
            34/*0001 0x08 of command LSB first*/, 11, 34, 11, 11, 11, 11, 11, 11/*1000 0x01*/, 11, 34, 11, 34, 11, 34, 11,
            11/*1110 Inverted 8 of command*/, 11, 11, 11, 34, 11, 34, 11, 34/*0111 inverted 1 of command*/, 11 /*stop bit*/};
     
    Не могу понять правило заполнения массива.
     
  7. parovoZZ

    parovoZZ Гуру

    Если надо передать
    то оно заносится в целиком в один элемент массива.
    Если надо передать отдельно каждую цифру, то они заносятся так
    кодировку чего?
     
  8. Mabru

    Mabru Нерд

    В массиве код сигнала указан в формате Raw. Я никак не могу понять, как привести число к этому формату.
    У меня, например, пульт на кнопку включения выдает число 551489775. И мне его надо отправить через IrSender.sendRaw. Для этого свое число мне надо перенести в массив в формате Raw.
     
  9. parovoZZ

    parovoZZ Гуру

    Ну так и пробуй послать его.
    Raw - это то, что излучает непосредственно светодиод.
     
  10. Рокки1945

    Рокки1945 Гуру