我意识到这是一个非常具体的问题,但在这里......
我使用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秒的延迟,代码永远不对。幕后发生的可能导致此类行为的是什么?
答案 0 :(得分:1)
IRremote库被中断驱动。显而易见的地方
controller.iterate();
阻止那些中断,导致irrecv中断的时间。
IRremote有几个分支,其中原始分支基于轮询输入引脚的周期性中断。它有一个配置文件,可以将周期调整为更有损耗,但更能容忍延迟中断。
此外还有其他叉子(例如通过微热处理),或者使用可能更具响应性的PCINT更改。
除此之外,最好的解决方案是挖掘控制器对象的类,以确定阻塞中断的原因。