【问题标题】:Arduino: Use Timer in c++ classArduino:在 C++ 类中使用定时器
【发布时间】:2017-11-17 15:50:26
【问题描述】:

我正在尝试使用计时器随着时间的推移反复更改 PWM 输出,以便在亮度变化时平滑过渡。尝试编译代码时,我不断收到此错误:

/Users/jt/Documents/Arduino/libraries/SingleColorLight/SingleColorLight.cpp:在构造函数'CSingleColorLight::CSingleColorLight(int)'中: /Users/jt/Documents/Arduino/libraries/SingleColorLight/SingleColorLight.cpp:13:58: 错误:无法将 'CSingleColorLight::DimmerCallback' 从类型 'void (CSingleColorLight::)(void*)' 转换为类型 'void ( )(无效)' ets_timer_setfn(&Dimmer, this->DimmerCallback, NULL);

这是我的代码:

class CSingleColorLight {

  private:
    int pin;
    int intensitySetPoint;
    int intensityActual;
    int percentageBuffer;
    ETSTimer Dimmer;
    int dimmerCount;

  public:
    CSingleColorLight(int _pin);
    bool setIntensity(int _intensity);
    int getIntensity(); 
    bool getStatus(void);
    bool setStatus(bool _status); 
    void DimmerCallback(void*);

};

在cpp文件中:

void CSingleColorLight::DimmerCallback(void*) {
  if(dimmerCount>0){
    dimmerCount--;  
    intensityActual++;
  } else if(dimmerCount<0){
    dimmerCount++;
    intensityActual--;
  } else {
    ets_timer_disarm(&Dimmer);
  } 
  analogWrite(pin, percentageToTime[intensityActual]);
  return;
}

它要求一个指针,对吧?知道如何解决这个问题吗? 非常感谢!

【问题讨论】:

    标签: c++ class timer arduino esp8266


    【解决方案1】:

    如果你想让 DimmerCallback 接受一个 void* 参数,那么你需要给它命名,比如

    void CSingleColorLight::DimmerCallback(void* x)
    

    但您没有在代码中使用 void*。看起来你应该摆脱它,所以它会是

    void CSingleColorLight::DimmerCallback()
    

    输入 cpp 和

    void DimmerCallback();
    

    在标题中。

    void* 参数是一个可以指向任何数据类型的指针,它与没有参数的 void 不同。

    【讨论】:

    • 这确实使情况恶化...至少我猜是这样,因为错误注释更长:无法将 'CSingleColorLight::DimmerCallback' 从类型 'void (CSingleColorLight::)()' 转换为类型 ' void ()(void)' ets_timer_setfn(&Dimmer, this->DimmerCallback, NULL);
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多