gpt4 book ai didi

arduino - 不能在库中使用 attachInterrupt

转载 作者:行者123 更新时间:2023-12-04 17:51:17 26 4
gpt4 key购买 nike

我正在为超声波距离传感器编写一个简单的库,并认为我会尝试使用中断。

但是我无法在 attachCallback 中设置我的功能方法正确。

我要 HCSR04Interrupt::echoHigh()HCSR04Interrupt::echoLow()当引脚分别变高和变低时调用。

我已经谷歌搜索无济于事。 Ardiuno IDE 说明如下:

./Arduino/libraries/HCSR04/HCSR04Interrupt.cpp: In member function 'void HCSR04Interrupt::getDistance()':
./Arduino/libraries/HCSR04/HCSR04Interrupt.cpp:31: error: argument of type 'void (HCSR04Interrupt::)()' does not match 'void (*)()'
./Arduino/libraries/HCSR04/HCSR04Interrupt.cpp: In member function 'void HCSR04Interrupt::echoHigh()':
./Arduino/libraries/HCSR04/HCSR04Interrupt.cpp:47: error: argument of type 'void (HCSR04Interrupt::)()' does not match 'void (*)()'

这是我的标题:
#ifndef _HCSR04Interrupt_
#define _HCSR04Interrupt_

#include "Arduino.h"

#define HCSR04_CM_FACTOR 58.0
#define HCSR04_IN_FACTOR 148.0
#define HCSR04_CM_MODE 0
#define HCSR04_IN_MODE 1

class HCSR04Interrupt {
public:
double distance;

HCSR04Interrupt(int trigger_pin, int echo_pin, void (*callback)());

void setUnits(int units);

void getDistance();
private:
int _trigger_pin;
int _echo_pin;
int _units;
unsigned long _micros_start;
void (*_callback)();

void initialize();
void echoHigh();
void echoLow();
};

#endif

和我的实现(不完整,因为我无法通过 attachInterrupt 步骤):
#include "Arduino.h"
#include "HCSR04Interrupt.h"

HCSR04Interrupt::HCSR04Interrupt(int trigger_pin, int echo_pin, void (*callback)()) {
_trigger_pin = trigger_pin;
_echo_pin = echo_pin;
_callback = callback;

initialize();
}

void HCSR04Interrupt::setUnits(int units) {
_units = units;
}

void HCSR04Interrupt::initialize() {
pinMode(_trigger_pin, OUTPUT);
pinMode(_echo_pin, INPUT);

digitalWrite(_trigger_pin, LOW);
}

void HCSR04Interrupt::getDistance() {
//Listen for the RISING interrupt
attachInterrupt(_echo_pin - 2, echoHigh, RISING);

//The trigger pin should be pulled high,
digitalWrite(_trigger_pin, HIGH);

//for 10 us.
delayMicroseconds(20);

//Then reset it.
digitalWrite(_trigger_pin, LOW);
}

void HCSR04Interrupt::echoHigh() {
_micros_start = micros();

detachInterrupt(_echo_pin - 2);
attachInterrupt(_echo_pin - 2, echoLow, FALLING);
}

void HCSR04Interrupt::echoLow() {
detachInterrupt(_echo_pin - 2);

unsigned long us = micros() - _micros_start;

distance = us;

(*_callback)();
}

最佳答案

所以编译器 (不是 IDE)会准确地告诉您出了什么问题:

argument of type 'void (HCSR04Interrupt::)()' does not match 'void (*)()

所以,虽然 attachInterrupt()接受类型为 void (*)() 的函数指针,您正试图将其传递给 非静态成员函数,你不能。您可以尝试制作成员函数 static和类型转换:
static void echoHigh();

// ...

attachInterrupt(_echo_pin - 2, reinterpret_cast<void (*)()>(&echoHigh), RISING);

关于arduino - 不能在库中使用 attachInterrupt,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15669017/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com