2018-12-22 02:05:29 [显示全部楼层]
2695浏览
查看: 2695|回复: 3

[求助] 有关于一段arduino代码的问题,希望有人能帮我解一下疑惑~~

[复制链接]
我在做一个小玩意,就是用颜色检测模块加MP3模块做一个播放器,当颜色传感器检测到不同颜色的色卡时可以播放相对应的音乐,以下是我的代码,希望有大神能看看(主要看看最后面主函数那块的问题),如何能实现实时检测目前所插入的色卡的数值然后实时判断是否符合条件播放音乐,如果符合条件就播放相应音乐直到不符合条件然后切换到其他音乐或者停止播放。拜托了,谢谢!
[mw_shl_code=c,true]#include <TimerOne.h> //申明库文件
#include <SoftwareSerial.h>
#include <DFPlayer_Mini_Mp3.h>
//把TCS3200颜色传感器各控制引脚连到Arduino数字端口
#define S0    6   //物体表面的反射光越强,TCS3002D内置振荡器产生的方波频率越高,
#define S1    5  //S0和S1的组合决定输出信号频率比例因子,比例因子为2%
                 //比率因子为TCS3200传感器OUT引脚输出信号频率与其内置振荡器频率之比
#define S2     4   //S2和S3的组合决定让红、绿、蓝,哪种光线通过滤波器
#define S3     3
#define OUT    2  //TCS3200颜色传感器输出信号连接到Arduino中断0引脚,并引发脉冲信号中断
                  //在中断函数中记录TCS3200输出信号的脉冲个数
#define LED    7  //控制TCS3200颜色传感器是否点亮LED灯
float g_SF[3];     //从TCS3200输出信号的脉冲数转换为RGB标准值的RGB比例因子
int   g_count = 0;  // 计算与反射光强相对应TCS3200颜色传感器输出信号的脉冲数
// 数组用于存储在1s内TCS3200输出信号的脉冲数,它乘以RGB比例因子就是RGB标准值
int   g_array[3];  
int   g_flag = 0;   // 滤波器模式选择顺序标志


// 初始化TSC3200各控制引脚的输入输出模式
//设置TCS3002D的内置振荡器方波频率与其输出信号频率的比例因子为2%
void TSC_Init()
{
  pinMode(S0, OUTPUT);
  pinMode(S1, OUTPUT);
  pinMode(S2, OUTPUT);
  pinMode(S3, OUTPUT);
  pinMode(OUT, INPUT);
  pinMode(LED, OUTPUT);
  digitalWrite(S0, LOW);
  digitalWrite(S1, HIGH);
}

//选择滤波器模式,决定让红、绿、蓝,哪种光线通过滤波器
void TSC_FilterColor(int Level01, int Level02)
{
  if(Level01 != 0)
    Level01 = HIGH;
  if(Level02 != 0)
    Level02 = HIGH;
  digitalWrite(S2, Level01);
  digitalWrite(S3, Level02);
}

//中断函数,计算TCS3200输出信号的脉冲数
void TSC_Count()
{
  g_count ++ ;
}

//定时器中断函数,每1s中断后,把该时间内的红、绿、蓝三种光线通过滤波器时,
//TCS3200输出信号脉冲个数分别存储到数组g_array[3]的相应元素变量中
void TSC_Callback()
{
  switch(g_flag)
  {
    case 0:
         //Serial.println("->WB Start");
         TSC_WB(LOW, LOW);   //选择让红色光线通过滤波器的模式
         break;
    case 1:
         //Serial.print("->Frequency R=");
        // Serial.println(g_count);   //打印1s内的红光通过滤波器时,TCS3200输出的脉冲个数
         g_array[0] = g_count;    //存储1s内的红光通过滤波器时,TCS3200输出的脉冲个数
         TSC_WB(HIGH, HIGH);  //选择让绿色光线通过滤波器的模式
         break;
    case 2:
         //Serial.print("->Frequency G=");
         //Serial.println(g_count);   //打印1s内的绿光通过滤波器时,TCS3200输出的脉冲个数
         g_array[1] = g_count;    //存储1s内的绿光通过滤波器时,TCS3200输出的脉冲个数
         TSC_WB(LOW, HIGH);  //选择让蓝色光线通过滤波器的模式
         break;

    case 3:
         //Serial.print("->Frequency B=");
         Serial.println(g_count);   //打印1s内的蓝光通过滤波器时,TCS3200输出的脉冲个数
         //Serial.println("->WB End");
         g_array[2] = g_count;     //存储1s内的蓝光通过滤波器时,TCS3200输出的脉冲个数
         TSC_WB(HIGH, LOW);   //选择无滤波器的模式  
         break;
   default:
         g_count = 0;     //计数值清零
         break;
  }
}
//设置反射光中红、绿、蓝三色光分别通过滤波器时如何处理数据的标志
//该函数被TSC_Callback( )调用
void TSC_WB(int Level0, int Level1)   
{
  g_count = 0;   //计数值清零
  g_flag ++;     //输出信号计数标志
  TSC_FilterColor(Level0, Level1); //滤波器模式
  Timer1.setPeriod(1000000);     //设置输出信号脉冲计数时长1s
}
//初始化
void setup()
{
  TSC_Init();
  Serial.begin(9600); //启动串行通信
  mp3_set_serial (Serial);    //set Serial for DFPlayer-mini mp3 module
    mp3_set_volume (2);// 音量大小
  Timer1.initialize();   // defaulte is 1s
  Timer1.attachInterrupt(TSC_Callback); //设置定时器1的中断,中断调用函数为TSC_Callback()
  //设置TCS3200输出信号的上跳沿触发中断,中断调用函数为TSC_Count()
  attachInterrupt(0, TSC_Count, RISING);
  digitalWrite(LED, HIGH);//点亮LED灯
  delay(4000); //延时4s,以等待被测物体红、绿、蓝三色在1s内的TCS3200输出信号脉冲计数
  //通过白平衡测试,计算得到白色物体RGB值255与1s内三色光脉冲数的RGB比例因子
  g_SF[0] = 255.0/ g_array[0];     //红色光比例因子
  g_SF[1] = 255.0/ g_array[1] ;    //绿色光比例因子
  g_SF[2] = 255.0/ g_array[2] ;    //蓝色光比例因子
  //打印白平衡后的红、绿、蓝三色的RGB比例因子
  //Serial.println(g_SF[0],5);
  //Serial.println(g_SF[1],5);
  //Serial.println(g_SF[2],5);
  //红、绿、蓝三色光分别对应的1s内TCS3200输出脉冲数乘以相应的比例因子就是RGB标准值
  //打印被测物体的RGB值
  //for(int i=0; i<3; i++)
    //Serial.println(int(g_array * g_SF));   
}
//主程序
void loop()
{
   g_flag = 0;
   //每获得一次被测物体RGB颜色值需时4s
   while(1)
   {
    delay(4000);
    for(int i=0; i<3; i++)
    Serial.println(int(g_array * g_SF));
   }
   if(250<=(g_array[0] * g_SF[0])<=260&&250<=(g_array[0] * g_SF[0])<=260&&250<=(g_array[0] * g_SF[0])<=260)
   {
    mp3_play (2);//天空之城
    delay(90000);//01:29
   }
   else if(130<=(g_array[0] * g_SF[0])<=140&&90<=(g_array[1] * g_SF[1])<=97&&70<=(g_array[1] * g_SF[1])<=80)
   {
     mp3_play (1);//梁祝
     delay(325000);//05:24
   }
   else if(20<=(g_array[0] * g_SF[0])<=27&&20<=(g_array[1] * g_SF[1])<=27&&20<=(g_array[1] * g_SF[1])<=27)
   {
     mp3_play (3);//云水禅心
     delay(334000);//05:33
   }
   else if(112<=(g_array[0] * g_SF[0])<=122&&30<=(g_array[1] * g_SF[1])<=42&&40<=(g_array[1] * g_SF[1])<=50)
   {
     mp3_play (4);//雨的印记
     delay(342000);//03:41
   }
   else if(60<=(g_array[0] * g_SF[0])<=70&&123<=(g_array[1] * g_SF[1])<=132&&150<=(g_array[1] * g_SF[1])<=160)
   {
     mp3_play (5);//梦中的婚礼
       delay(183000);//03:02*/
   }
   else
   {
    mp3_stop ();
   }
   }[/mw_shl_code]

gada888  版主

发表于 2018-12-22 09:01:11

单独看你的代码是很费时间的,因为错误需要设断点来排查的。
回复

使用道具 举报

gada888  版主

发表于 2018-12-22 09:08:13

用我曾经做的这个试一下。
[mw_shl_code=applescript,true]/******made by gada888*****/
#include <SoftwareSerial.h>
#include <DFPlayer_Mini_Mp3.h>
int s0=3,s1=4,s2=5,s3=6;
int flag=0;
int counter=0;
int countR=0,countG=0,countB=0;
void setup()
{
Serial.begin(9600);
  mp3_set_serial (Serial);  //set Serial for DFPlayer-mini mp3 module
  mp3_set_volume (25);
  delay (400);
pinMode(s0,OUTPUT);
pinMode(s1,OUTPUT);
pinMode(s2,OUTPUT);
pinMode(s3,OUTPUT);
}
void TCS()
{
  digitalWrite(s1,HIGH);
  digitalWrite(s0,LOW);
  flag=0;
  attachInterrupt(0, ISR_INTO, CHANGE);
  timer2_init();
}
void ISR_INTO()
{
  counter++;
}
void timer2_init(void)
{
  TCCR2A=0x00;
  TCCR2B=0x07; //the clock frequency source 1024 points
  TCNT2= 100;    //10 ms overflow again
  TIMSK2 = 0x01; //allow interrupt
}
int i=0;
ISR(TIMER2_OVF_vect)//the timer 2, 10ms interrupt overflow again. Internal overflow interrupt executive function
{
TCNT2=100;
flag++;
if(flag==1)
{
   counter=0;
}
else if(flag==2)
  {
   digitalWrite(s2,LOW);
   digitalWrite(s3,LOW);
   countR=counter/1.051;
   Serial.print("red=");
   Serial.println(countR,DEC);
   digitalWrite(s2,HIGH);
   digitalWrite(s3,HIGH);   
  }
else if(flag==3)
   {
    countG=counter/1.0157;
   Serial.print("green=");
   Serial.println(countG,DEC);
    digitalWrite(s2,LOW);
    digitalWrite(s3,HIGH);
    }
else if(flag==4)
   {
    countB=counter/1.114;
   Serial.print("blue=");
   Serial.println(countB,DEC);
    digitalWrite(s2,LOW);
    digitalWrite(s3,LOW);
    }
else
    {
    flag=0;
     TIMSK2 = 0x00;
    }
    counter=0;
    delay(2);
}
void loop()
{
delay(10);
TCS();
if((countR>10)||(countG>10)||(countB>10))
  {
     if((countR>countG)&&(countR>countB))
      {
           Serial.print("red");
           Serial.print("\n");
           delay(1000);
           mp3_play (1);
      delay (200);
      }
     else if((countG>=countR)&&(countG>countB))
      {
           Serial.print("green");
           Serial.print("\n");
           delay(1000);
           mp3_play (2);
      delay (200);
      }
    else if((countB>countG)&&(countB>countR))
     {
           Serial.print("blue");
           Serial.print("\n");
          delay(1000);
          mp3_play (3);
     delay (200);
     }
   }
else
{
    delay(1000);      
}
}
[/mw_shl_code]
回复

使用道具 举报

gada888  版主

发表于 2018-12-22 09:10:08

刚好这几天我要写个这种的教程。程序你先拿去
回复

使用道具 举报

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

本版积分规则

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

硬件清单

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

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

mail