大家好!想问一下关于arduino小项目的问题。我设想的作品是一个多模式灯,利用红外线遥控器来转换不同的模式。其中一个模式是音乐小灯,就是跟着音乐节奏变化灯的颜色。然后在这个模式下要想按下遥控器按键来转换模式的话是没有反应的,我就在播放音乐的for循环里加了一句检测红外按键的语句,想在这里面给mode(mode是我定义的模式变量,比如mode等于3的时候就是第三个模式)重新赋值然后利用goto语句走到loop函数的开头位置从而转换到别的模式,从串口监视器里看这个监测语句是有执行的(因为每次按下按键,串口监视器就会打印出mode的值,但是一直等于3),所以就证明红外线检测的这个if语句是从头到尾有执行的,但是给mode重新赋值的功能始终无法实现。实物里小灯也只是重新从头演奏而没有转换模式。实在是没有头绪了,想问一下各位有没有什么思路。问题相关代码如下
#include <IRremote.h>
#define NTD0 -1
#define NTD1 294
#define NTD2 330
#define NTD3 350
#define NTD4 393
#define NTD5 441
#define NTD6 495
#define NTD7 556
#define NTDL1 147
#define NTDL2 165
#define NTDL3 175
#define NTDL4 196
#define NTDL5 221
#define NTDL6 248
#define NTDL7 278
int tune[]=
{
NTD3,NTD3,NTD4,NTD5,
NTD5,NTD4,NTD3,NTD2,
NTD1,NTD1,NTD2,NTD3,
NTD3,NTD2,NTD2,
NTD3,NTD3,NTD4,NTD5,
NTD5,NTD4,NTD3,NTD2,
NTD1,NTD1,NTD2,NTD3,
NTD2,NTD1,NTD1,
NTD2,NTD2,NTD3,NTD1,
NTD2,NTD3,NTD4,NTD3,NTD1,
NTD2,NTD3,NTD4,NTD3,NTD2,
NTD1,NTD2,NTDL5,NTD0,
NTD3,NTD3,NTD4,NTD5,
NTD5,NTD4,NTD3,NTD4,NTD2,
NTD1,NTD1,NTD2,NTD3,
NTD2,NTD1,NTD1
};
float durt[]=
{
1,1,1,1,
1,1,1,1,
1,1,1,1,
1+0.5,0.5,1+1,
1,1,1,1,
1,1,1,1,
1,1,1,1,
1+0.5,0.5,1+1,
1,1,1,1,
1,0.5,0.5,1,1,
1,0.5,0.5,1,1,
1,1,1,1,
1,1,1,1,
1,1,1,0.5,0.5,
1,1,1,1,
1+0.5,0.5,1+1,
};
int length;
int tonepin=6;
byte ledpin[]={8,9,10};
int recv = 11;
int i=0;
int val = 0;
int mode=1;
int state=1;
IRrecv irrecv(recv);
decode_results results;
void setup() {
for(int j=0;j<3;j++){
pinMode(ledpin[j],OUTPUT);
}
Serial.begin(9600);
irrecv.enableIRIn(); // 初始化红外接收器
pinMode(tonepin,OUTPUT);
length=sizeof(tune)/sizeof(tune[0]);
}
void loop() {
aaa:
if (irrecv.decode(&results)) {//检测模式
if(results.value==0xFFE21D)//按下CH+
{
state=0;
}
if(results.value==0xFFA25D)//按下CH-
{
state=1;
}
if (results.value == 0xFF30CF) //按下1
{
mode=1;
}
if (results.value == 0xFF18E7) //按下2
{
mode=2;
}
if (results.value == 0xFF7A85) //按下3
{
mode=3;
}
if (results.value == 0xFF10EF) //按下4
{
mode=4;
}
if (results.value == 0xFF38C7) //按下5
{
mode=5;
}
if (results.value == 0xFF5AA5) //按下6
{
mode=6;
}
if (results.value == 0xFF02FD) //按下⏩
{
i++;
}
if (results.value == 0xFFA857 && val < 255) //按“+”号键
{
val = val + 50;
}
else if (results.value == 0xFFE01F && val > 0) //按下“-”号键
{
val = val - 50;
}
irrecv.resume(); // 接收下一次红外线信号
}
if(state==1){
for(int j=0;j<3;j++)
{
digitalWrite(ledpin[j],LOW);
}
}
else if(state==0){
if(mode==1){//mode1
for(int j=0;j<3;j++)
{
digitalWrite(ledpin[j],LOW);
}
digitalWrite(ledpin[i%3], HIGH);
analogWrite(ledpin[i%3], val);
}
else if(mode==3){//mode3
for(int x=0;x<length;x++)
{
if (irrecv.decode(&results)) {//检测模式
if (results.value == 0xFF30CF) //按下1
{
mode=1;
}
if (results.value == 0xFF18E7) //按下2
{
mode=2;
}
if (results.value == 0xFF7A85) //按下3
{
mode=3;
}
if (results.value == 0xFF10EF) //按下4
{
mode=4;
}
if (results.value == 0xFF38C7) //按下5
{
mode=5;
}
if (results.value == 0xFF5AA5) //按下6
{
mode=6;
}
Serial.println(mode);
irrecv.resume(); // 接收下一次红外线信号
goto aaa;
}
tone(tonepin,tune[x]);
digitalWrite(ledpin[x%3], HIGH);
delay(400*durt[x]);
digitalWrite(ledpin[x%3], LOW);
delay(100*durt[x]);
noTone(tonepin);
}
}
}