Arduino引入NewPing.h报__vector_13多重定义编译错误如何解决
错误原因分析
你遇到的__vector_13重复定义错误,是Arduino开发中非常典型的定时器资源冲突问题:
__vector_13对应AVR单片机的定时器1比较匹配A中断向量,同一时间只能被一个功能模块注册使用- NewPing库默认启用定时器1实现测距计时,已经注册了该中断向量
- Arduino内置
tone()函数生成蜂鸣器方波时,默认也会占用定时器1注册同一中断向量,二者冲突触发报错 - 额外你同时引入了功能完全重叠的
SR04.h和NewPing.h两个超声波测距库,也可能加重资源冲突问题。
报错关键信息:
(.text+0x0): multiple definition of `__vector_13' C:\Users\name\AppData\Local\Temp\arduino_build_789753\libraries\NewPing\NewPing.cpp.o (symbol from plugin):(.text+0x0): first defined here
解决步骤
按照以下顺序操作即可解决冲突:
- 第一步:删除冗余库引用,删掉代码中
#include "SR04.h"这一行,你全程使用NewPing库的接口实现测距,SR04库没有被调用,完全不需要保留 - 第二步:修改NewPing库的定时器配置,有两种可选方案:
- 关闭NewPing的定时器功能:打开本地NewPing库目录下的
NewPing.h文件,找到#define TIMER_ENABLED true配置项,将值改为false即可。你代码中使用的是阻塞式sonar.ping()测距接口,不需要用到NewPing的定时器中断功能,该修改不会影响你的业务逻辑。 - 切换NewPing使用定时器2:如果你需要使用NewPing的非阻塞测距功能,就将
NewPing.h中#define TIMER1 1配置项改为#define TIMER2 1,换用未被占用的定时器2即可。
- 关闭NewPing的定时器功能:打开本地NewPing库目录下的
- 第三步(可选):如果你不想修改NewPing库配置,也可以弃用内置
tone()函数,自己手动写模拟方波输出的代码驱动蜂鸣器,避免占用定时器资源。
修改完成后重新编译即可正常通过,原有测距、点阵显示、蜂鸣器功能不受影响。
内容的提问来源于stack exchange,提问作者Bean
相关产品推荐
相关产品推荐

