我正在为能量计数器创建一个库。我想计算能量计数器产生的脉冲并通过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)? 如何解决问题,并且具有易于使用的库界面?
答案 0 :(得分:1)
increment_per_pulse
需要是一个静态函数(参见签名)。
所以,标记static
:
static void increment_per_pulse();
答案 1 :(得分:1)
在EnergyCounter类中,将countPulse定义为静态方法,如下所示:
class EnergyCounter{
//...
static void countPulse();
//...
};
原因:ISR应该是一个返回void且没有参数的函数。类成员函数有一个(隐藏)参数,它是对类实例的引用。
替代解决方案是将countPulse移到EnergyCounter之外,并使其成为全局命名空间中的常规方法(不属于任何类)。