Значение удержания ИК-пульта дистанционного управления Arduino

Я пытаюсь сделать робота с дистанционным управлением с помощью Arduino, и ИК-пульт дистанционного управления выглядит довольно странно. Когда я нажимаю кнопку, иногда я получаю правильное шестнадцатеричное значение, а иногда я получаю значение удержания FFFFFF.

Как мне реализовать какой-нибудь код, чтобы я мог, например, запускать двигатели, пока я удерживаю кнопку, или определять, какая это была кнопка, поскольку код удержания одинаков для всех кодов?

Поскольку я знаю, что значение удержания равно 0xFFFFFFFF, существует ли функция, которая:

(any hex not 0xffff) func(OR?) (0xffffffff) = (any hex ...)

и

( 0xfffff)           func (0xffffff)   != (0xffffff)

Или мне нужно реализовать какой-то конечный автомат? С delay() также довольно сложно.

Кстати, я использую Keyes KY 022. Какова продолжительность сигнала? (у меня нет осциллографа).

Может быть, было бы полезно установить значение нажатия на другое? Или игнорировать?

LE: И немного кода для тестирования: один единственный ключ:

Возможно, таймер прерывают другие библиотеки...

    #include <IRremote.h>
    #define IR_PIN 11
    IRrecv irrecv(IR_PIN);
    decode_results results;
    long int Key;
    const unsigned long int UP = 0x00FF629D;
    const unsigned long int DOWN = 0x00FFA857;
    const unsigned long int LEFT = 0x00FF22DD;
    const unsigned long int RIGHT = 0x00FFC23D;
    const unsigned long int OK = 0x00FF02FD;
    const unsigned long int k1 = 0x00FF6897;// C101E57B
    const unsigned long int k2 = 0x00FF9867;// 97483BFB
    const unsigned long int k3 = 0x00FFB04F;// F0C41643
    const unsigned long int k4 = 0x00FF30CF;
    const unsigned long int k5 = 0x00FF18E7;
    const unsigned long int k6 = 0x00FF7A85;
    const unsigned long int k7 = 0x00FF10EF;
    const unsigned long int k8 = 0x00FF38C7;
    const unsigned long int k9 = 0x00FF5AA5;
    const unsigned long int STAR = 0x00FF42BD;
    const unsigned long int k0 = 0x00FF4AB5;
    const unsigned long int HASH = 0x00FF52AD;
    const unsigned long int HOLD = 0xFFFFFFFF;

   void setup(){
   // put your setup code here, to run once:
      Serial.begin(9600);
      delay(2000); while (!Serial);
      irrecv.enableIRIn();
  //irrecv.blink13(true);
  //setup1(); From IRremoteInfo TAB   
   }
char buff[1000];
unsigned long int msg;
void processIR(unsigned long int msg)
{
  sprintf(buff, "READ IR %x \n", results.value);
  Serial.print(buff);
  switch (msg)
  {
    case UP:
      Serial.println("UP");
      break;
    case DOWN:
      Serial.println("DOWN");
      break;
    case LEFT:
      Serial.println("LEFT");
      break;
    case RIGHT:
      Serial.println("RIGHT");
      break;
    case k1:
      Serial.println("k1");
      break;
    case k2:
      Serial.println("k2");
      break;
    case k3:
      Serial.println("k3");
      break;
    case k4:
      Serial.println("k4");
      break;
    case k5:
      Serial.println("k5");
      break;
    case k6:
      Serial.println("k6");
      break;
    case k7:
      Serial.println("k7");
      break;
    case k8:
      Serial.println("k8");
      break;
    case k9:
      Serial.println("k9");
      break;
    case STAR:
      Serial.println("STAR");
      break;
    case k0:
      Serial.println("k0");
      break;
    case HASH:
      Serial.println("HASH");
      break;
    case HOLD:
      Serial.println("HOLD");
      break;
      //case default:
      //    delay(500);
      //       irrecv.decode(&results);
      //       msg = results.value;
      //       processIR(msg);
  }
}

void loop() {
  // put your main code here, to run repeatedly:
  if (irrecv.decode(&results))
  {
    irrecv.resume();
    char buff[255];
    sprintf(buff, "Val %010x \n " , results.value );
    Serial.print(buff);
    //results.decode();
    //results.DumpResults();
    //      msg = results.value;
    //      Serial.println(msg, HEX);
    //      Serial.println(results.decode_type);
    //      processIR(msg);

  }


}

И ценности, конечно:

 Val 0x0000629d 
 Val 0x0000ffff 
 Val 0x0000629d 
 Val 0x0000ffff 
 Val 0x0000629d 
 Val 0x0000ffff 
 Val 0x0000629d 
 Val 0x0000ffff 
 Val 0x0000629d 
 Val 0x0000ffff 
 Val 0x0000629d 
 Val 0x0000ffff 
 Val 0x0000629d 
 Val 0x0000ffff 
 Val 0x0000629d 
 Val 0x0000ffff 
 Val 0x0000629d 
 Val 0x0000ffff 
 Val 0x0000629d 
 Val 0x0000ffff 
 Val 0x0000629d 
 Val 0x0000ffff 
 Val 0x0000629d 
 Val 0x0000ffff 
 Val 0x0000629d 
 Val 0x0000ffff 
 Val 0x0000629d 
 Val 0x0000ffff 
 Val 0x0000629d 
 Val 0x0000ffff 
 Val 0x0000629d 
 Val 0x0000ffff 
 Val 0x0000629d 
 Val 0x0000ffff 
 Val 0x0000ffff 
 Val 0x0000629d 
 Val 0x0000ffff 
 Val 0x0000629d 
 Val 0x0000ffff 
 Val 0x0000629d 
 Val 0x0000ffff 
 Val 0x0000629d 
 Val 0x0000629d 
 Val 0x0000ffff 
 Val 0x0000629d 
 Val 0x0000ffff 
 Val 0x0000629d 
 Val 0x0000ffff 
 Val 0x0000629d 
 Val 0x0000ffff 
 Val 0x000002fd 
 Val 0x0000ffff 
 Val 0x0000629d 
 Val 0x0000ffff 
 Val 0x0000629d 
 Val 0x0000629d 
 Val 0x0000ffff 
 Val 0x000022dd 
 Val 0x0000ffff 
 Val 0x0000c23d 
 Val 0x0000ffff 
 Val 0x0000629d 
 Val 0x0000ffff 
 Val 0x0000629d 
 Val 0x0000ffff 
 Val 0x0000629d 
 Val 0x0000ffff 
 Val 0x0000629d 
 Val 0x0000ffff 
 Val 0x0000ffff 
 Val 0x0000ffff 
 Val 0x0000ffff 
 Val 0x0000ffff 
 Val 0x0000ffff 
 Val 0x0000ffff 
 Val 0x0000629d 
 Val 0x0000ffff 
 Val 0x0000629d 
 Val 0x0000ffff 
 Val 0x0000629d 
 Val 0x0000ffff 
 Val 0x00005282 
 Val 0x000038d6 
 Val 0x0000ffff 
 Val 0x0000efb5 
 Val 0x00006897 
 Val 0x00006897 
 Val 0x00006897 
 Val 0x0000ffff 
 Val 0x00006897 
 Val 0x00006897 
 Val 0x0000ffff 
 Val 0x00006897 
 Val 0x00009867 
 Val 0x00009867 
 Val 0x0000b04f 
 Val 0x0000ffff 
 Val 0x00004794 
 Val 0x00009424 
 Val 0x0000ffff 
 Val 0x000042bd 
 Val 0x0000ffff 
 Val 0x00004ab5 
 Val 0x0000ffff 
 Val 0x000052ad 
 Val 0x0000ffff 
 Val 0x00004ab5 
 Val 0x00005aa5 
 Val 0x0000ffff 
 Val 0x000038c7 
 Val 0x000010ef 
 Val 0x0000ffff 
 Val 0x000030cf 
 Val 0x0000ffff 
 Val 0x000018e7 
 Val 0x0000ffff 
 Val 0x00007a85 
 Val 0x0000ffff 
 Val 0x00004ec5 
 Val 0x00007a2a 
 Val 0x00007d4f 
 Val 0x0000a33f 
 Val 0x00007a28 
 Val 0x00008dd8 
 Val 0x00004b78 
 Val 0x0000144b 
 Val 0x00006781 
 Val 0x0000040a 
 Val 0x0000ffbf 
 Val 0x00007d4f 
 Val 0x0000ee7c 
 Val 0x0000629d 
 Val 0x0000ffff 
 Val 0x0000629d 
 Val 0x0000ffff 
 Val 0x0000629d 
 Val 0x0000ffff 
 Val 0x0000629d 
 Val 0x0000ffff 

Поэтому каждое нажатие клавиши дает 2 значения.

, 👍1

Обсуждение

char buff[1000]; - что это за Arduino? Вы знаете, что у Arduino обычно не так много оперативной памяти? Использование 1000 байт для хранения READ IR abcd \n кажется немного чрезмерным., @Nick Gammon

Да, я знаю. Я просто тестировал... Возможно, реальный вопрос, когда я изменил размер, заключался в том, что «sprintf() переполняется». Может быть, это так, но он просто переполнялся, но не имел никакого шелл-кода., @Florin


2 ответа


1

Если я правильно понял ваш вопрос, при нажатии кнопки сначала будет сгенерирован отдельный шестнадцатеричный код, а затем через некоторое время серия 0xFFFFFF?

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

,

1

Я обнаружил, что при добавлении этого цикла while к использованию IRremote код после него не будет выполняться до тех пор, пока кнопка не будет отпущена.

while(irrecv.decode(&results)){
    irrecv.resume();
    delay(150);
}

Это удержит кнопки нажатыми, если код в конце loop() завершает ввод.

,

Мужик ты гений! оно работает :), @Ivanovic