A/C не обнаруживает ИК-коды, отправленные из Arduino

Есть ИК-приемник и ИК-светодиод, которые я достал из комплекта (у меня нет спецификаций для них).
Я загрузил скетч Arduino, чтобы записать свои ИК-коды A/Cs. Это были закодированные NEC 32-битные целые числа.
Записав коды, я попробовал их ретранслировать. Кондиционер не смог обнаружить эти сигналы.
Немного поискав неисправности, я отправил код с Arduino на скетч приемника с предыдущего шага - он их успешно получил.

Во всех вышеперечисленных шагах использовалась библиотека IRremote Arduino

Вопрос в том, чем можно объяснить такое поведение? Несколько возможностей, которые я имел в виду:

  1. ИК-частота. Может быть, схема обнаружения работала с настройками по умолчанию, а передача-нет?
  2. Длина волны ИК-излучения. Есть ли шанс, что сторона кондиционера вообще не обнаружит мои ИК-импульсы?
  3. Декодирование/кодирование протокола NEC в IRremote. Если нет стандарта для протокола NEC, то реализация Arduino и A/C может немного отличаться.

, 👍3

Обсуждение

Это кондиционер NEC? Я думаю, что в ИК - библиотеке есть "сырой" режим-вы могли бы попробовать его, который более точно воспроизводит то, что он получил. Я думаю, что ваши решения (1) и (2) немного маловероятны, но выполнимы., @Nick Gammon

Вы можете попробовать другую библиотеку: http://tech.cyborg5.com/irlib/, @Nick Gammon

4. диапазон. Ик-светодиод, который вы используете, может быть намного слабее, чем тот, что находится на пульте дистанционного управления. Попробуйте поместить arduino прямо рядом с блоком переменного тока., @Gerben

@NickGammon Это не кондиционер NEC. Он просто использует ИК-протокол NEC. Что касается вашего предложения о режиме RAW, то я попробовал его использовать, но приемник raw генерирует как отрицательные, так и положительные значения. Я попробую сделать это еще раз и попробую также в другой библиотеке. Спасибо!, @omribahumi

ПРИВЕТ Я поставил свой ответ по ссылке ниже. https://stackoverflow.com/questions/44528781/clone-remote-using-arduino-with-the-irremote-library/45955124#45955124 Пожалуйста, дайте мне знать, если это работает для вас. Дай мне знать, если тебе понадобится помощь., @Ourang-Zeb Khan

Простая яркость также является проблемой. Пробовали ли вы различные положения светодиода по отношению к датчику? Понижение значения токоограничивающего резистора?, @Lee Daniel Crocker


1 ответ


1

Привет, я сделал то же самое. Я использовал это, чтобы получить коды переменного тока для переменного тока GREE. Я нахожу это с двухнедельной борьбой и форумом под названием AnalysIR. Если вы обнаружите какие-либо проблемы в этом коде ниже или методе, дайте мне знать.

Коды переменного тока обычно длинные, и они не соответствуют коду, который вы использовали выше, поэтому я даю вам пример кода для запуска в скетче Arduino, чтобы вы могли протестировать.

   #define LEDPIN 13
  //вы можете увеличить это значение на ардуино с объемом памяти более 2 кб
  #define maxLen 800

       volatile  unsigned int irBuffer[maxLen]; 
       //сохраняет временные интервалы - изменчивые, потому что изменены ISR
       volatile unsigned int x = 0;
       //Указатель через irBuffer - изменчив, потому что изменен ISR

     void setup() {
     Serial.begin(115200); //при необходимости измените скорость передачи данных
     attachInterrupt(0, rxIR_Interrupt_Handler, CHANGE);
    //настройка ISR для приема ИК-сигнала
     }

 void loop() {

   Serial.println(F("Нажмите кнопку на пульте дистанционного управления сейчас - только один раз"));
    delay(5000); // пауза 5 секунд
  if (x) { //если сигнал записан
digitalWrite(LEDPIN, HIGH);//визуальный индикатор того, что сигнал получен
Serial.println();
Serial.print(F("Raw: (")); //формат необработанного заголовка дампа - для 
Serial.print((x - 1));
Serial.print(F(") "));
detachInterrupt(0);//остановить прерывания и захват до завершения здесь

for (int i = 1; i < x; i++) { //now dump the times
  if (!(i & 0x1)) Serial.print(F("-"));
  Serial.print(irBuffer[i] - irBuffer[i - 1]);
  Serial.print(F(", "));
                     }

   x = 0;
   Serial.println();
   Serial.println();
   digitalWrite(LEDPIN, LOW);//конец визуального индикатора, для этого времени
   attachInterrupt(0, rxIR_Interrupt_Handler, CHANGE);///повторно включите ISR для приема ИК-сигнала
        }

      }

  void rxIR_Interrupt_Handler() {
    if (x > maxLen) return; //игнорировать, если irBuffer уже заполнен
     irBuffer[x++] = micros(); //просто постоянно записывайте временную метку переходов сигналов

    }

Как только это будет сделано, вы получите правильный код, чтобы отправить его в AC.

Немного хитрая часть

как только вы получите коды необработанных значений, вам придется немного изменить их, например, я получил необработанные значения и преобразовал их в массив.

Что я получил, например Сырье (16): -27750, 4464, 696, 1612, 692, 516, 688, 516, 688, 1620, 692, 512, 692, 1612, 696, 1612, 692, 512, 692, 516, 688, 1616, 696, 1612, 692, 512, 696, 512, 692, 512, 692, 512, 696, 512, 692, 512, 692, 512, 696, 512, 692, 512, 692, 512, 696, 1612, 692, 1612, 692, 516, 688, 516, 692, 516, 688, 516, 688, 516, 692, 1612, 692, 516, 688, 1620, 688, 516, 688, 520, 684, 1620, 660, 544, 664, 19960, 628, 1680, 628, 1676, 628, 580, 628, 1676, 628, 580, 624, 580, 628, 576, 628, 580, 628, 584, 620, 576, 628, 580, 628, 576, 628, 576, 628, 580, 624, 1680, 628, 580, 624, 580, 628, 580, 624, 580, 628, 576, 628, 580, 624, 580, 628, 576, 628, 580, 628, 576, 628, 580, 624, 580, 628, 576, 628, 1680, 624, 580, 628, 1676, 628, 1680, 628

Чтобы преобразовать вышеуказанные необработанные значения в массив, удалите первое значение -27750 и вместо него поставьте 3800. Ниже приведен образец массива.**

беззнаковый инт сведения[] = {3800, 4464, 696, 1612, 692, 516, 688, 516, 688, 1620, 692, 512, 692, 1612, 696, 1612, 692, 512, 692, 516, 688, 1616, 696, 1612, 692, 512, 696, 512, 692, 512, 692, 512, 696, 512, 692, 512, 692, 512, 696, 512, 692, 512, 692, 512, 696, 1612, 692, 1612, 692, 516, 688, 516, 692, 516, 688, 516, 688, 516, 692, 1612, 692, 516, 688, 1620, 688, 516, 688, 520, 684, 1620, 660, 544, 664, 19960, 628, 1680, 628, 1676, 628, 580, 628, 1676, 628, 580, 624, 580, 628, 576, 628, 580, 628, 584, 620, 576, 628, 580, 628, 576, 628, 576, 628, 580, 624, 1680, 628, 580, 624, 580, 628, 580, 624, 580, 628, 576, 628, 580, 624, 580, 628, 576, 628, 580, 628, 576, 628, 580, 624, 580, 628, 576, 628, 1680, 624, 580, 628, 1676, 628, 1680, 628, };

Теперь, отправляя эти значения на ИК-передатчик, используйте следующий код.

      #include<IRremote.h>
       IRsend irsend;
       int KHz = 38;                    // частота по умолчанию

      unsigned int data[] = {3800, 4464, 696, 1612, 692, 516, 688, 516, 688, 1620, 692, 512, 692, 1612, 696, 1612, 692, 512, 692, 516, 688, 1616, 696, 1612, 692, 512, 696, 512, 692, 512, 692, 512, 696, 512, 692, 512, 692, 512, 696, 512, 692, 512, 692, 512, 696, 1612, 692, 1612, 692, 516, 688, 516, 692, 516, 688, 516, 688, 516, 692, 1612, 692, 516, 688, 1620, 688, 516, 688, 520, 684, 1620, 660, 544, 664, 19960, 628, 1680, 628, 1676, 628, 580, 628, 1676, 628, 580, 624, 580, 628, 576, 628, 580, 628, 584, 620, 576, 628, 580, 628, 576, 628, 576, 628, 580, 624, 1680, 628, 580, 624, 580, 628, 580, 624, 580, 628, 576, 628, 580, 624, 580, 628, 576, 628, 580, 628, 576, 628, 580, 624, 580, 628, 576, 628, 1680, 624, 580, 628, 1676, 628, 1680, 628,
        };


    void setup() 
   {
     Serial.begin(9600);   
     irsend.enableIROut(38);
   }

    void loop()
   {

    for (int i=0; i<1 ; i++){
    irsend.sendRaw(data, sizeof(data) / sizeof(int),38 ); 
    delay(40);
          }


 }
,