You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Arduino编译报错:RH_ASK与PulseSensorPlayground库__vector_11重复定义

433发射器与脉搏传感器编译冲突问题解决

我正在开发一个项目,通过脉搏传感器采集心率数据,再用433发射器发送至接收器。使用Arduino Nano开发板,Arduino IDE版本2.1.0,RH_ASK和PulseSensorPlayground库均为最新版,但编译时出现中断向量重复定义的错误。

项目代码

#include <RH_ASK.h>
#include <SPI.h>
#define USE_ARDUINO_INTERRUPTS true
#include <PulseSensorPlayground.h>
#define PULSENSORPIN A0

PulseSensorPlayground pulseSensor;
RH_ASK transmitter;

void setup() {
  Serial.begin(9600);
  transmitter.init();
  pulseSensor.analogInput(PULSENSORPIN);
  pulseSensor.setThreshold(550);
  pulseSensor.begin();
}

void loop() {
  delay(1000);
  int myBPM = pulseSensor.getBeatsPerMinute();
  String str_myBPM = String(myBPM);
  const char *msg = str_myBPM.c_str();
  transmitter.send((uint8_t *)msg, strlen(msg));
  transmitter.waitPacketSent();
}

编译错误信息

C:\Users\Helen474402\AppData\Local\Temp\arduino\sketches\E400C37EF824CAD4EB4682519060B7A8\libraries\RadioHead\RH_ASK.cpp.o (symbol from plugin): In function `RH_ASK::maxMessageLength()':
(.text+0x0): multiple definition of `__vector_11'
C:\Users\Helen474402\AppData\Local\Temp\arduino\sketches\E400C37EF824CAD4EB4682519060B7A8\sketch\Transmitter.ino.cpp.o (symbol from plugin):(.text+0x0): first defined here
collect2.exe: error: ld returned 1 exit status

exit status 1

Compilation error: exit status 1

问题原因与解决办法

  • 核心原因:两个库同时占用了Arduino Nano的Timer2中断向量(__vector_11)。当USE_ARDUINO_INTERRUPTS设为true时,PulseSensorPlayground会使用Timer2中断来检测脉搏;而RH_ASK库默认也依赖Timer2实现433MHz信号的调制,导致中断向量重复定义。

方案1:修改脉搏传感器的工作模式

将USE_ARDUINO_INTERRUPTS改为false,让PulseSensorPlayground以轮询模式运行,不再占用Timer2中断。修改后的代码如下:

#include <RH_ASK.h>
#include <SPI.h>
#define USE_ARDUINO_INTERRUPTS false // 禁用中断模式
#include <PulseSensorPlayground.h>
#define PULSENSORPIN A0

PulseSensorPlayground pulseSensor;
RH_ASK transmitter;

void setup() {
  Serial.begin(9600);
  transmitter.init();
  pulseSensor.analogInput(PULSENSORPIN);
  pulseSensor.setThreshold(550);
  pulseSensor.begin();
}

void loop() {
  pulseSensor.read(); // 主动轮询传感器数据
  static unsigned long lastSendTime = 0;
  // 每隔1秒发送一次数据,避免delay阻塞轮询
  if (millis() - lastSendTime >= 1000) {
    lastSendTime = millis();
    int myBPM = pulseSensor.getBeatsPerMinute();
    String str_myBPM = String(myBPM);
    const char *msg = str_myBPM.c_str();
    transmitter.send((uint8_t *)msg, strlen(msg));
    transmitter.waitPacketSent();
  }
}

方案2:修改RH_ASK库的定时器配置

如果需要保留脉搏传感器的中断模式,可以修改RH_ASK库的定时器设置:

  1. 找到RH_ASK库的安装目录,打开RH_ASK.h文件
  2. 找到#define RH_ASK_TIMER 2这一行,将其改为#define RH_ASK_TIMER 1(切换到Timer1)
  3. 保存文件后重新编译项目

注意:Timer1可能被其他库(如Servo)占用,若项目中未使用此类库则可放心修改。

内容的提问来源于stack exchange,提问作者kdb17wsl

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 13:13:08