Переделал скетч, чтобы удержание кнопки на пульте давало другой код. Пока нашел этому 2 применения: кнопка "положить трубку" при удержании закрывает активное окно (в Girder на это событие нужно включить антиповтор, чтобы все окна разом не закрыть)), а кнопки "вперед" / "назад" при удержании включают перемотку в AIMP. Очень удобно!
Пульт от пионера, при нажатии кнопок телефона, всегда сначала шлет код 0xB54AE916, а потом код клавиши. Это было учтено в алгоритме.
Скетч затачивался под Girder33, поэтому для использования в других программах нужно будет изменить код функции printIR.
PHP код:
#include <IRremote.h>
//вход ИК приемника
#define RECV_PIN 11
// Задержка на повтор клавиши
#define REPEAT_DELAY 500
// Время ожидания повторения
#define REPEAT_WAIT 100
//----------------------------
IRrecv irrecv(RECV_PIN);
decode_results result;
unsigned long IR_old; // предыдущий принятый код
unsigned long pressTime; // время, когда впервые нажалась кнопка пульта
unsigned long rcTime;
boolean IR_received;
void setup()
{
Serial.begin(115200);
IR_old = 0;
irrecv.enableIRIn(); // включить приемник
}
void loop() {
IR_received = false;
if (irrecv.decode(&result)) {
if (result.value > 0) {
// Код годится.
if (IR_old == result.value || result.value == 0xB54AE916) {
// Получили тот же код, что в последний раз
if ((millis() - pressTime) > REPEAT_DELAY && result.value != 0xB54AE916) {
// Шлем код удержания
printIR(result.value, true);
}
} else {
if (result.value != 0xB54AE916) {
IR_old = result.value;
}
pressTime = millis();
}
IR_received = true;
rcTime = millis();
}
irrecv.resume();
}
if (!IR_received && IR_old > 0) {
// Если в течении определенного времени никакой код не пришел, отсылаем последний из кеша
if ((millis() - rcTime) > REPEAT_WAIT) {
if ((millis() - pressTime) <= REPEAT_DELAY) {
printIR(IR_old, false);
}
IR_old = 0;
}
}
}
void printIR(unsigned long code, boolean repeat) {
Serial.print("IR:");
Serial.print(repeat ? "R" : "N");
Serial.print(code, HEX);
Serial.print(13, BYTE);
}