IRremote и attachInterrupt

rymka1989
Offline
Зарегистрирован: 21.10.2017

Всем привет!

Я, к сожалению, новичок, что на форуме, что в Ардуино, поэтому прошу не судить строго!

Прошу у вас помощи по следующему вопросу: есть ИК-пуль и ардуино. Хочу заставить пульт работать через прерывания.

Код: 

 - основной .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. гуглить естественно пробовал, только ничего путного не напробовал. Заранее спасибо!!!

Arduino Kharkov
Offline
Зарегистрирован: 06.02.2018

rymka1989, здравствуйте!
Попробуйте исправить в 17ой строчке основного скетча первый параметр (digitalPinToInterrupt(IRPIN)) на 0 (ноль).
attachInterrupt(digitalPinToInterrupt(IRPIN), irListen, CHANGE);
attachInterrupt(0, irListen, CHANGE);