IRremote и attachInterrupt
- Войдите на сайт для отправки комментариев
Всем привет!
Я, к сожалению, новичок, что на форуме, что в Ардуино, поэтому прошу не судить строго!
Прошу у вас помощи по следующему вопросу: есть ИК-пуль и ардуино. Хочу заставить пульт работать через прерывания.
Код:
- основной .ino
#include "IRControl.h"
#define IRPIN 2
IRControl ir(IRPIN);
void setup() {
cli();
Serial.begin(9600);
/*
запускаем прием сигнала от пульта
ставим прерывание на эту процедуру
*/
ir.enable();
attachInterrupt(digitalPinToInterrupt(IRPIN), irListen, CHANGE);
sei();
}
void loop() {
/**
если есть команда с пульта, то выполняем необходимые действия
в конце обнуляем код
*/
if (ir.code != 0) {
Serial.println(ir.code);
ir.emptyCode();
}
}
/**
обработчик прерывания на нажатие кнопки на пульте
*/
void irListen() {
ir.keyListen();
}
- IRControl.h
#include <IRremote.h>
#include <IRremoteInt.h>
class IRControl {
public:
volatile long code;
private:
const long repeat_code = -1;
long single_code;
decode_results response;
IRrecv ir;
public:
IRControl(int pin) : ir(pin) {
}
void enable() {
ir.enableIRIn();
}
void emptyCode() {
code = 0;
}
void keyListen() {
if (ir.decode(&response)) {
if (response.value != repeat_code) {
single_code = response.value;
}
code = single_code;
ir.resume();
}
}
};
В принципе это работает, но проблема вот в чем: если я нажимаю, скажем, кнопку 1 на пульте и потом сразу же, например, 2, то Serial.println выведет мне 2 раза код кнопки 1. А затем, если я еще раз нажму 2, то уже код 2. Если снова нажму 1, то все наоборот.
Если же прерывания не использовать, сделать все в loop(), то все отлично.
Я был бы очень благодарен за любую критику или помощь, или направление, куда копать.
P.S. гуглить естественно пробовал, только ничего путного не напробовал. Заранее спасибо!!!
rymka1989, здравствуйте!
Попробуйте исправить в 17ой строчке основного скетча первый параметр (digitalPinToInterrupt(IRPIN)) на 0 (ноль).
attachInterrupt(digitalPinToInterrupt(IRPIN), irListen, CHANGE);
attachInterrupt(0, irListen, CHANGE);