Arduino IRremote库奇怪的行为

时间:2014-12-17 18:19:48

标签: arduino avr

我意识到这是一个非常具体的问题,但在这里......

我使用IRremote库可以使用遥控器控制LED屏幕。这是我loop()的实现。

void loop()
{
    if (irrecv.decode(&res))
    {
        Serial.println(res.value, HEX);
        controller.takeAction(res.value);
        irrecv.resume();                                   
    }

    // controller.iterate();
}

请注意,最后一行已注释掉。这就是导致问题的原因......不知何故,当我调用此函数时,解码器返回的IR代码很少有意义。该功能没有任何有趣的事情发生。在此功能中,IRremote库没有任何交互。

当我评论这个电话时,我得到以下输出:

FF30CF
FF30CF
FF30CF
FF30CF
FF30CF
FF30CF
FF30CF
FF30CF

解码器在所有场合都能正确使用。但是,如果调用未注释,我会收到此输出:

661CB9CF   // WRONG
2DE59485   // WRONG
E007A367   // WRONG
FF         // WRONG
FF30CF     // OK
FF         // WRONG
FF30C      // WRONG
FF30CF     // OK
33         // WRONG
FF30CF     // OK
700EEBE2   // WRONG
E007A367   // WRONG
FF30CF     // OK
FF30CF     // OK
E7         // WRONG
5E55E51A   // WRONG

一团糟......

这不是我遇到的第一个问题。以前,我已经在类成员中封装了库调用。由于某种原因,这导致解码完全崩溃。每次按下按钮都有1秒的延迟,代码永远不对。幕后发生的可能导致此类行为的是什么?

1 个答案:

答案 0 :(得分:1)

IRremote库被中断驱动。显而易见的地方

controller.iterate();

阻止那些中断,导致irrecv中断的时间。

IRremote有几个分支,其中原始分支基于轮询输入引脚的周期性中断。它有一个配置文件,可以将周期调整为更有损耗,但更能容忍延迟中断。

此外还有其他叉子(例如通过微热处理),或者使用可能更具响应性的PCINT更改。

除此之外,最好的解决方案是挖掘控制器对象的类,以确定阻塞中断的原因。