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);