请教下各位大佬,我在做奥森机器人的那个记忆大考验实验的时候用光盘给的程序一直报错,加上IRemote库函数,改了tone()函数也不行,改了好久快炸了,求大佬帮帮忙。
报的错误:collect2.exe: error: ld returned 1 exit status
程序:
#include <IRremote.h>
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);
}
}
const unsigned long RC_CODE[10] = {0,
0xFF30CF, 0xFF18E7, 0xFF7A85, 0xFF10EF, 0xFF38C7, 0xFF5AA5, 0xFF42BD, 0xFF4AB5, 0xFF52AD
}; // 遥控器1~9的编码表
const int PINS[10] = {0, 2, 3, 4, 5, 6, 7, 8, 9, 10}; // 9盏灯,下标0不使用
const int BUZ = 13;
const int RECV_PIN = 12;
const int N = 3; // N 为游戏的难度,即需要回忆的次数
int randomNums[30]; // randomNums 中存放了 N 个由单片机生成的随机数
IRrecv irrecv(RECV_PIN);
decode_results results; // 红外接收需要的两个对象
int anwser[30];
int inc; // anwser 中存放了 inc 个玩家的回答
bool isRight; // 最后判断玩家是否回答正确
unsigned long beginTime; // 用来计算超时时间
void setup() {
irrecv.enableIRIn(); // 初始化红外接收
for(int i = 1; i <= 9; i++)
pinMode(PINS[i], OUTPUT);
pinMode(BUZ, OUTPUT);
randomSeed(analogRead(A0)); // 随机种子
}
void loop() {
// 生成随机数
for(int i = 0; i < N; i++)
randomNums[i] = random(1, 10); // 范围 1~9
// 使用 LED 展示随机数,难度为 N
for(int i = 0; i < N; i++)
{
// randomNums[i] 表示第 i 次亮第几盏灯
// PINS[n] 表示第 n 盏灯对应的物理针脚号
digitalWrite(PINS[randomNums[i]], HIGH);
delay(1000);
digitalWrite(PINS[randomNums[i]], LOW);
delay(1000);
}
// 全亮全灭 ,提示游戏开始,你也可以使用蜂鸣器
for(int i = 1; i <= 9; i++)
{
digitalWrite(PINS[i], HIGH);
}
delay(2000);
for(int i = 1; i <= 9; i++)
{
digitalWrite(PINS[i], LOW);
}
// 开始接收玩家的回答
inc = 0; // 用于记录玩家答案 anwser 的下标
beginTime = millis(); // 记录玩家回答的时间
while(1)
{
if(irrecv.decode(&results)) // 红外接收遥控器的值,结果位于 results.value
{
// 将玩家的输入,依次与 RC_CODE[i] 做比较
// RC_CODE[i] 表示遥控器的数字 i 所对应的编码
for(int i = 1; i <=9; i++)
{
if(results.value == RC_CODE[i]) // 如果玩家按下的数字是 i
{
// 第 i 盏灯闪烁
digitalWrite(PINS[i], HIGH); delay(50); digitalWrite(PINS[i], LOW);
anwser[inc++] = i; // 记录玩家的答案
break;
}
}
irrecv.resume(); // 接收玩家的下一个回答
// 如果玩家输入的数量与单片机的数量相同,说明玩家已经回答完毕
// 退出循环,准备判断
if(inc == N) break;
}
// 另外一种可能,玩家5秒内都未回答完毕(inc==N),直接退出循环
// 这种情况下,回答一定是错误的
if(millis() - beginTime > 5000) break;
}
// 判断玩家的回答是否正确
isRight = true;
for(int i = 0; i < N; i++) // 逐项比较 anwser 和 randomNums
if(anwser[i] != randomNums[i]) // 如果发现有任何一项不相同
{
isRight = false; // 标记回答错误
break;
}
// 根据判断结果 , 使用蜂鸣器提示回答正确与否
if(isRight) { newtone(BUZ, 2000, 200); delay(200); newtone(BUZ, 2500, 200); delay(200); newtone(BUZ, 3000, 200); delay(200); }
else { newtone(BUZ, 1000, 600); delay(600); }
noTone(BUZ); // 关闭蜂鸣器,开始下一轮游戏
}