这个错误提示表面上是说在红外库里定义过的函数在Tone里又重复定义了,实际原因是红外库和Tone都使用了相同的内部计时器TIMER2(在各自的ISR函数里),换名字是不解决根本问题的。如果你不熟悉avr的中断处理函数ISR,修改哪一方都不靠谱,考虑下面的Tone的替代办法:
arduino的几个延时函数都是用的timer 0。这里有个不用timer2而用延时函数的发声函数,用它替代Tone应该可以避开与红外库的计时器冲突:- void newtone(byte tonePin, int frequency, int duration) {
- int period = 1000000L / frequency;
- int pulse = period / 2;
- for (long i = 0; i < duration * 1000L; i += period) {
- digitalWrite(tonePin, HIGH);
- delayMicroseconds(pulse);
- digitalWrite(tonePin, LOW);
- delayMicroseconds(pulse);
- }
- }
复制代码 |