中断创建arduino库

interrupts on creating arduino library

本文关键字:arduino 创建 中断      更新时间:2023-10-16

我正在为能量计数器创建一个库。我想计算能量计数器产生的脉冲,并通过arduino将其转换为能量。为了捕捉任何脉冲,我想使用arduino中断。我希望它易于使用:

#include <EnergyCounter.h>
#define counterPin 2; // interrupt code 0 in Uno
EnergyCounter counter;
void setup(){
    counter.begin(counterPin);
}
...

现在,在begin方法中,我想将中断附加到counterPin:

void EnergyCounter::begin(byte pin){
    pinMode(pin, INPUT);
    attachInterrupt(0, countPulse, RISING);
}
void EnergyCounter::countPulse(){
    display += increment_per_pulse;
}

当我尝试它时,我得到以下错误:

error: cannot convert 'EnergyCounter::countPulse' from type 'void (EnergyCounter::)()' to type 'void (*)()'
 attachInterrupt(0, countPulse, RISING);
                                      ^
Erro ao compilar.

这是否意味着我不能使用中断服务例程(ISR)的方法?我如何解决这个问题,同时拥有一个易于使用的库接口?

increment_per_pulse需要是一个静态函数(请参阅签名)。

因此,将其标记为static:

static void increment_per_pulse();

在EnergyCounter类内部,将countPulse定义为静态方法,如下所示:

class EnergyCounter{
   //...
   static void countPulse();
   //...
};

原因:ISR应该是一个返回void且没有参数的函数。类成员函数有一个(隐藏的)参数,该参数是对类实例的引用。

另一种解决方案是将countPulse移到EnergyCounter之外,并使其成为全局命名空间中的一个常规方法(不属于任何类)。