Значение удержания ИК-пульта дистанционного управления 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 значения.
@Florin, 👍1
Обсуждение2 ответа
Если я правильно понял ваш вопрос, при нажатии кнопки сначала будет сгенерирован отдельный шестнадцатеричный код, а затем через некоторое время серия 0xFFFFFF
?
В таком случае, почему бы вам просто не сохранить последний полученный уникальный код и заменить вхождения 0xFFFFFF
сохраненным кодом?
Я обнаружил, что при добавлении этого цикла while к использованию IRremote код после него не будет выполняться до тех пор, пока кнопка не будет отпущена.
while(irrecv.decode(&results)){
irrecv.resume();
delay(150);
}
Это удержит кнопки нажатыми, если код в конце loop()
завершает ввод.
Мужик ты гений! оно работает :), @Ivanovic
- Как объявить массив переменного размера (глобально)
- Программирование Arduino с использованием Python, а не C/C ++
- Загрузка Arduino Nano дает ошибку: avrdude: stk500_recv(): programmer is not responding
- Как справиться с rollover millis()?
- Является ли использование malloc() и free() действительно плохой идеей для Arduino?
- Можно ли сделать несколько функций loop() с помощью Arduino Uno?
- Какие накладные расходы и другие соображения существуют при использовании структуры по сравнению с классом?
- устаревшее преобразование из строковой константы в 'char*'
char buff[1000];
- что это за Arduino? Вы знаете, что у Arduino обычно не так много оперативной памяти? Использование 1000 байт для храненияREAD IR abcd \n
кажется немного чрезмерным., @Nick GammonДа, я знаю. Я просто тестировал... Возможно, реальный вопрос, когда я изменил размер, заключался в том, что «sprintf() переполняется». Может быть, это так, но он просто переполнялся, но не имел никакого шелл-кода., @Florin