我会写完论文的 2023-01-12 17:15 采纳率: 0%
浏览 30

arduino小项目问题

大家好!想问一下关于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);
     }
    }
 
  
}
    
  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-01-12 21:10
    关注
    评论

报告相同问题?

问题事件

  • 创建了问题 1月12日

悬赏问题

  • ¥15 CSS通配符清除内外边距为什么可以覆盖默认样式?
  • ¥15 SPSS分类模型实训题步骤
  • ¥15 求解决扩散模型代码问题
  • ¥15 工创大赛太阳能电动车项目零基础要学什么
  • ¥20 limma多组间分析最终p值只有一个
  • ¥15 nopCommerce开发问题
  • ¥15 torch.multiprocessing.spawn.ProcessExitedException: process 1 terminated with signal SIGKILL
  • ¥15 QuartusⅡ15.0编译项目后,output_files中的.jdi、.sld、.sof不更新怎么解决
  • ¥15 pycharm输出和导师的一样,但是标红
  • ¥15 想问问富文本拿到的html怎么转成docx的