2014-7-5 17:01:51 [显示全部楼层]
11207浏览
查看: 11207|回复: 4

[求助] 如何解决Tone.cpp与IRremote.cpp冲突问题

[复制链接]

在震动报警器示例代码中做了一下扩展,增加一个RGB LED,使报警的时候有红绿蓝三色进行闪烁。震动停止10秒钟之后,报警停止。
上面这些功能都实现了,除了使用倾斜检查来实现震动检测准确率不是特别高,其他的基本上正常。
最后想加入红外遥控器进行控制,但是导入IRremote.h后编译器检查代码时报错,看错误信息是有冲突,于是找到发生冲突的文件,看到冲突确实存在。
发生冲突的两个文件分别是“Arduino.app/Contents/Resources/Java/hardware/arduino/cores/arduino/Tone.cpp”和“Arduino.app/Contents/Resources/Java/libraries/IRremote/IRremote.cpp”。
完整的报错信息如下:
core.a(Tone.cpp.o): In function `__vector_7':
/Applications/Arduino.app/Contents/Resources/Java/hardware/arduino/cores/arduino/Tone.cpp:535: multiple definition of `__vector_7'
IRremote/IRremote.cpp.o:/Applications/Arduino.app/Contents/Resources/Java/libraries/IRremote/IRremote.cpp:311: first defined here

完整的代码如下:
  1. #include <IRremote.h>
  2. const float radianValue = 3.14 / 180;//conver angle to radian
  3. const int rLedPin = 8;
  4. const int gLedPin = 9;
  5. const int bLedPin = 10;
  6. const int alarmPin = 7;
  7. boolean isAlarmWork = false;
  8. const int detectionVabrationPin = 3;
  9. int detectionVabrationCount = 0;
  10. unsigned long detectionVabrationTime = 0;
  11. unsigned const long alarmTimeOut = 1000 * 10;
  12. const int infraredPin = 12;
  13. IRrecv irrecv(infraredPin);
  14. decode_results results;
  15. void setup(){
  16.   pinMode(rLedPin, OUTPUT);
  17.   pinMode(gLedPin, OUTPUT);
  18.   pinMode(bLedPin, OUTPUT);
  19.   pinMode(alarmPin, OUTPUT);
  20.   pinMode(detectionVabrationPin, INPUT);
  21.   attachInterrupt(0, detectionVabration, RISING);
  22.   
  23.   Serial.begin(9600);
  24. }
  25. void loop(){
  26.   alarmDoWork();
  27.   if(isAlarmWork){
  28.     if(millis() - detectionVabrationTime > alarmTimeOut){
  29.       isAlarmWork = false;
  30.       Serial.println("end");
  31.     }
  32.     Serial.println(detectionVabrationCount);
  33.   }
  34. }
  35. void detectionVabration(){
  36.   isAlarmWork = true;
  37.   detectionVabrationCount ++;
  38.   detectionVabrationTime = millis();
  39. }
  40. void alarmDoWork(){
  41.   int ledIndex = 1;
  42.   for(int i=0; i<180; i++){
  43.     if(!isAlarmWork){
  44.       noTone(alarmPin);
  45.       resetAllLed();
  46.       break;
  47.     }
  48.     tone(alarmPin, int(2000 * sin(i * radianValue)));
  49.     if(i % 10 == 0){
  50.       if(ledIndex == 1){
  51.         onlyShowRLed();
  52.         ledIndex = 2;
  53.       }
  54.       else if(ledIndex == 2){
  55.         onlyShowGLed();
  56.         ledIndex = 3;
  57.       }
  58.       else if(ledIndex == 3){
  59.         onlyShowBLed();
  60.         ledIndex = 1;
  61.       }
  62.     }
  63.     delay(10);
  64.   }
  65. }
  66. void onlyShowRLed(){
  67.   digitalWrite(rLedPin, HIGH);
  68.   digitalWrite(gLedPin, LOW);
  69.   digitalWrite(bLedPin, LOW);
  70. }
  71. void onlyShowGLed(){
  72.   digitalWrite(rLedPin, LOW);
  73.   digitalWrite(gLedPin, HIGH);
  74.   digitalWrite(bLedPin, LOW);
  75. }
  76. void onlyShowBLed(){
  77.   digitalWrite(rLedPin, LOW);
  78.   digitalWrite(gLedPin, LOW);
  79.   digitalWrite(bLedPin, HIGH);
  80. }
  81. void resetAllLed(){
  82.   digitalWrite(rLedPin, LOW);
  83.   digitalWrite(gLedPin, LOW);
  84.   digitalWrite(bLedPin, LOW);
  85. }
复制代码

这种问题大家开发过程中遇到过没,有什么好的解决方法吗?

wangyi2926  学徒

发表于 2014-7-9 12:54:21

我有一次用红外遥控接D3的LED,也遇到过类似的事情。经求助得知,红外的库文件里计时器占用了D3和D11针脚,你试着改一下LED的接线,或许有用。
回复

使用道具 举报

Youyou  初级技匠

发表于 2014-7-10 14:48:23

你好,类似于楼上说的,两个库用的是同一个定时器,造成定时器冲突,两个库里面都写了同一个定时器的中断程序,这样就出现了同一个定时器却有两个中断程序,导致编译器不能正常编译。可以修改IR的库,换个定时器使用,在IRremoteint_h里面,找到这些语句:
// Arduino Duemilanove, Diecimila, LilyPad, Mini, Fio, etc
#else
  #define IR_USE_TIMER1   // tx = pin 9
  //#define IR_USE_TIMER2     // tx = pin 3
#endif
这里我已经修改了,注释掉了#define IR_USE_TIMER2 ,使用了#define IR_USE_TIMER1,因此不会出现定时器冲突了。
重启IDE后即可正常编译。
回复

使用道具 举报

33532997052017  见习技师

发表于 2018-3-3 20:50:49

可以正常编译,但是我使用完tone之后,红外遥控就不控制了怎么办?不再接受码值了。。。
回复

使用道具 举报

無数  学徒

发表于 2020-10-9 18:24:41

我把我的实验经过写在博客里了。
https://blog.csdn.net/GreatSimulation/article/details/108982522
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
关于楼主
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail