| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1566 人关注过本帖
标题:[求助]有关于一段arduino代码的问题,希望有人能帮我解一下疑惑~~
只看楼主 加入收藏
Chock
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2018-10-2
结帖率:66.67%
收藏
 问题点数:0 回复次数:1 
[求助]有关于一段arduino代码的问题,希望有人能帮我解一下疑惑~~
我在做一个小玩意,就是用颜色检测模块加MP3模块做一个播放器,当颜色传感器检测到不同颜色的色卡时可以播放相对应的音乐,以下是我的代码,希望有大神能看看(主要看看最后面主函数那块的问题),如何能实现实时检测目前所插入的色卡的数值然后实时判断是否符合条件播放音乐,如果符合条件就播放相应音乐直到不符合条件然后切换到其他音乐或者停止播放。拜托了,谢谢!
程序代码:
#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[i] * g_SF[i]));   
}
//主程序
void loop()
{
   g_flag = 0;
   //每获得一次被测物体RGB颜色值需时4s
   while(1)
   {
    delay(4000);
    for(int i=0; i<3; i++)
    Serial.println(int(g_array[i] * g_SF[i])); 
   } 
   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 ();
   }
   }
搜索更多相关主题的帖子: Serial 输出 信号 滤波器 脉冲 
2018-12-22 02:09
Mr_doge
Rank: 5Rank: 5
等 级:贵宾
威 望:10
帖 子:159
专家分:385
注 册:2018-6-28
收藏
得分:0 
实时检测目前所插入的色卡的数值然后实时判断是否符合条件播放音乐,如果符合条件就播放相应音乐直到不符合条件然后切换到其他音乐或者停止播放。
    我没有接触过嵌入式开发,不过对于你这个话题我忍不住想掺和下
    如果需要实时检测,那么对于程序运行的环境就有很大依赖性了,如果是在win或者linux,系统是支持任务切换的那种,可以将播放和检测分隔开来作为两个独立的程序块进行同步运行,检测到--播放--同时检测并保持反馈
    但是一般来说,嵌入式平台恐怕是不支持这样的模式,只能线性执行,检测--播放--返回检测循环,不过如果播放是一个独立的块,在播放时主程序是处于手动设置的等待状态的话,那就可以做点文章了,比如说将等待时间作为一个等待循环,循环内依旧对检测反馈作响应,反馈出现变化则停止播放并返回主函数(重新进行检测)这样
    如果本身开发平台局限没有简便的任务并行的方式,恐怕就只能考虑多板协作这样的取巧方式了,一个板负责不断检测反馈,一个接收反馈并决定播放与否,一个只负责接收播放对应项目命令和停止播放命令并立即执行,当然成本会暴增,这也是无奈之举,如果平台本身有支持任务并行是再好不过了,不可能为了任务并行自己开发个简易操作系统吧....
    其实还有个丧病的方法,就是播放音乐的同时也不断的循环中断并跳回主程序执行一遍检测然后跳回播放块继续播放音乐这样,但是鉴于嵌入式平台的性能,很可能会出现播放断续的情况,是非常不稳妥的实现方式(这个有点类似在单核处理器上操作系统的执行方式吧,大概)

纯属个人观点,这种比较深入特定方向并且依赖开发平台的话题,果然还是得去找找专门玩这个的群体请教吧
2018-12-22 20:49
快速回复:[求助]有关于一段arduino代码的问题,希望有人能帮我解一下疑惑~~
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.038758 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved