蓝色骨骨头 发表于 2015-4-13 16:02:53

马仔 发表于 2013-4-13 23:40 static/image/common/back.gif
小星星
#define NOTE_D0 -1
#define NOTE_D1 262


我想问一下 在里面加一个按键控制程序应该怎么修改啊

allenyao 发表于 2015-5-1 20:13:29

这个不错,很好!不仅有示例代码,而且还有原理讲解:lol

xuziyou1234567 发表于 2015-6-7 13:09:24

接拍部分是什么?

tomylver 发表于 2015-7-15 12:44:57

不错哦,,感动

jojoisthebad 发表于 2015-7-23 10:25:56

蜂鸣器可以这么玩哈哈

jkgf2015 发表于 2015-8-25 16:32:21

萧芸凤 发表于 2012-10-6 22:46 static/image/common/back.gif
蜂鸣器是有源的还是无源的?有源的太难听了

无源的   有源的一通电就会响哒

yokey5352 发表于 2015-8-25 20:11:36

不错不错!以前用51弄过,arduino还没试过,有空试试!

jkgf2015 发表于 2015-8-29 14:11:59

最近在做语音控制的   想要把蜂鸣器鸣响加入到语音控制中   如下代码,我想知道如何将蜂鸣器播放音乐的程序嵌入到我原本的程序中下面的是我自己嵌入的   报错了很多   希望有哪位大侠可以帮忙解决一下   万分感谢


/*
识别关键词的个数为SUM;
n为数组中对应关键词的序列号,例如数组sRecog中的第一个关键词为“kai deng”则对应的序列号为0;
Voice.Initialise();初始化设置输入方式MIC/MONO。
数字口0,1,2,4,7,9,10,11,12,13已被占用,继电器可用的有3,5,6,8.
*/
//#include <TimerOne.h>//定时器
#include <avr/wdt.h>//包含看门狗头文件
#include <Voice.h>    //申明语音识别库文件
//#include <Syn6288.h>//语音合成库文件
#include <dht11.h>    //温湿度传感器库

dht11 DHT;
Syn6288 syn;
uint8nAsrStatus=0;//申明语音模块工作状态
#define SUM 13

#define DHT11_PIN A0//定义温湿度传感器模拟口A0
#define light_sensor_pin A2//定义光线传感器模拟口A2
#define light_threshold 200//定义光照度阈值200
#define gas_sensor_pin A1   //定义气体传感器模拟口A1
#define gas_threshold 700   //气体传感器阈值700
#define relay_1 8    //定义继电器数字口8
#define relay_2 3
#define state_led 7 //状态指示灯数字口7

#define tonePin 6
#define NOTE_G0 -1
#define NOTE_G1 393
#define NOTE_G2 441
#define NOTE_G3 495
#define NOTE_G4 556
#define NOTE_G5 624
#define NOTE_G6 661
#define NOTE_G7 742

#define NOTE_GL1 196
#define NOTE_GL2 221
#define NOTE_GL3 234
#define NOTE_GL4 262
#define NOTE_GL5 294
#define NOTE_GL6 330
#define NOTE_GL7 371

#define NOTE_GH1 786
#define NOTE_GH2 882
#define NOTE_GH3 990
#define NOTE_GH4 1049
#define NOTE_GH5 1178
#define NOTE_GH6 1322
#define NOTE_GH7 1484
//以上部分是定义是把每个音符和频率值对应起来,其实不用打这么多,但是都打上了,后面可以随意编写D调的各种歌,我这里用NOTE_D+数字表示音符,NOTE_DH+数字表示上面有点的那种音符,NOTE_DL+数字表示下面有点的那种音符。这样后面写起来比较好识别。
#define WHOLE 1
#define HALF 0.5
#define QUARTER 0.25
#define EIGHTH 0.25
#define SIXTEENTH 0.625
//这部分是用英文对应了拍子,这样后面也比较好看



int tune[]=
{
NOTE_G6,NOTE_GH1,NOTE_G7,NOTE_G6,NOTE_G5,NOTE_G6,
NOTE_G3,NOTE_G6,NOTE_G5,
NOTE_G6,NOTE_GH1,NOTE_G7,NOTE_GH1,NOTE_G7,NOTE_G6,NOTE_G7,
NOTE_GH1,NOTE_GH1,NOTE_GH2,
NOTE_GH3,NOTE_GH3,NOTE_GH3,NOTE_GH3,NOTE_GH2,
NOTE_GH1,NOTE_G7,NOTE_G6,NOTE_G7,NOTE_G5,
NOTE_G6,NOTE_GH1,NOTE_G7,NOTE_G6,NOTE_G5,
NOTE_G6,NOTE_G0,
NOTE_G0,NOTE_G0,NOTE_G0,NOTE_G0,

};//这部分就是整首曲子的音符部分,用了一个序列定义为tune,整数
float duration[]=
{
1+0.5,0.5+0.5,0.5,0.5,0.5,0.5,
1+1+1,0.5,0.5,
1+0.5,0.5,0.5,0.25,0.25,0.5,0.5,
1+1+1,0.5,0.5,
0.5,0.5,0.5,0.5,1+1,
0.5,0.5,0.5,0.5,1+1,
1,1,1,0.5,0.5,
1+1+1,1,
1,1,1,1,

};//这部分是整首曲子的接拍部分,也定义个序列duration,浮点(数组的个数和前面音符的个数是一样的,一一对应么)
int length;//这里定义一个变量,后面用来表示共有多少个音符
int tonePin=6;//蜂鸣器的pin


//void loop()
//{
//for(int x=0;x<length;x++)//循环音符的次数
//{
//    tone(tonePin,tune);//此函数依次播放tune序列里的数组,即每个音符
//    delay(800*duration);//每个音符持续的时间,即节拍duration,400是调整时间的越大,曲子速度越慢,越小曲子速度越快,自己掌握吧
//    noTone(tonePin);//停止当前音符,进入下一音符
//}
//delay(5000);//等待5秒后,循环重新开始
//}
char sRecog = {"xiao hei","xian zai wen du zen me yang","kai deng","guan deng","xu yao kai deng ma","da kai feng shan","guan bi feng shan","wo xiang ting ge""xiao","hei","wen du","kai","guan"};
//小hei,现在温度怎么样,开灯,关灯,需要开灯吗

uint8_t text1[]={0xC1,0xE3,0xD2,0xBB,0xB6,0xFE,0xC8,0xFD,0xCB,0xC4,0xCE,0xE5,0xC1,0xF9,0xC6,0xDF,0xB0,0xCB,0xBE,0xC5,0xCA,0xAE};//零一二三四五六七八九十
uint8_t text2[]={0xD4,0xDA };// zai!
uint8_t text3[]={0xB5,0xB1,0xC7,0xB0,0xCE,0xC2,0xB6,0xC8,0xCE,0xAA};//当前温度为
uint8_t text4[]={0xCA,0xAA,0xB6,0xC8,0xCE,0xAA,0xB0,0xD9,0xB7,0xD6,0xD6,0xAE};//湿度为百分之
uint8_t text5[]={0xC9,0xE3,0xCA,0xCF,0xB6,0xC8};//摄氏度
uint8_t text6[]="soundn";//报警音
uint8_t text7[]={0xC7,0xEB,0xD7,0xA2,0xD2,0xE2,0xA3,0xAC,0xD3,0xD0,0xCE,0xA3,0xCF,0xD5,0xC6,0xF8,0xCC,0xE5,0xD0,0xB9,0xC2,0xA9};//请注意,有危险气体泄漏
uint8_t text8[]={0xD5,0xFD,0xD4,0xDA,0xBF,0xAA,0xB5,0xC6};//正在开灯
uint8_t text9[]={0xD5,0xFD,0xD4,0xDA,0xB9,0xD8,0xB5,0xC6};//正在关灯
uint8_t text10[]={0xCE,0xD2,0xC3,0xBB, 0xCC, 0xFD, 0xC7, 0xE5, 0xA3, 0xAC, 0xD4, 0xD9, 0xCB, 0xB5,0xD2, 0xBB, 0xB1, 0xE9, 0xBF, 0xC9, 0xD2, 0xD4, 0xC2, 0xEF, 0xA3, 0xBF };//womeitingqing
uint8_t text11[]={0xB9,0xE2,0xCF,0xDF,0xB2,0xBB,0xD7,0xE3,0x20,0xA3,0xAC,0xD5,0xFD,0xD4,0xDA,0xBF,0xAA,0xB5,0xC6};//光线不足,正在开灯
uint8_t text12[]={0xCF,0xD6,0xD4,0xDA,0xB9,0xE2,0xCF,0xDF,0xC3,0xF7,0xC1,0xC1,0xA3,0xAC,0xB2,0xBB,0xD0,0xE8,0xD2,0xAA,0xBF,0xAA,0xB5,0xC6};//光线明亮,不需要开灯
uint8_t text13[]={0xB7,0xE7,0xC9,0xC8,0xB4,0xF2,0xBF,0xAA};// 风扇打开!
uint8_t text14[]={0xB7,0xE7,0xC9,0xC8,0xB9,0xD8,0xB1,0xD5};//风扇关闭!
uint8_t text15[]={0xD2,0xF4,0xC0,0xD6,0xB4,0xF2,0xBF,0xAA};
uint8_t text;
uint8_t flag;        //标志位,收到小口令后将置为1,动作执行完后清零

void finally(uint8_t n)        //n为sRecog数组中对应关键词的序列号
{
        switch(n)
        {
      case 0: syn.play(text2,sizeof(text2),0);flag=1;break;        // 在!
        case 1:                                //现在温度怎么样
             if(flag==1)        //收到小米渣的出发命令后
             {
                                        flag=0;
                                        DHT.read(DHT11_PIN);        //读取温度
                                        /*Serial.print("Temperature:");
                                        Serial.print(DHT.temperature);
                                        Serial.print("   humidity:");
                                        Serial.println(DHT.humidity);*/
                                        uint8_t pig1 = DHT.temperature/10;        //温度数值十位
                                        uint8_t pig2 = DHT.temperature%10;        //温度数值个位
                                        uint8_t pig3 = DHT.humidity/10;                //湿度数值十位
                                        uint8_t pig4 = DHT.humidity%10;                //湿度数值个位
                                        syn.play(text3,sizeof(text3),0);         //当前温度为               
                                        if(pig1>0){
                                        text=text1;
                                        text=text1;
                                        syn.play(text,sizeof(text),0);                 //播放温度数值十位
                                        text=text1;
                                        text=text1;
                                        syn.play(text,sizeof(text),0);                 //播放语音十
                                        }
                                        if(pig2>0){
                                        text=text1;
                                        text=text1;
                                        syn.play(text,sizeof(text),0);                 //播放温度数值个位       
                                        }                                       
                                        syn.play(text5,sizeof(text5),0);         //播放摄氏度
                                        syn.play(text4,sizeof(text4),0);         //播放湿度为百分之
                                       
                                        if(pig3>0){
                                        text=text1;
                                        text=text1;
                                        syn.play(text,sizeof(text),0);         //播放湿度数值十位
                                        text=text1;
                                        text=text1;
                                        syn.play(text,sizeof(text),0); //播放语音十
                                        }
                                        if(pig4>0){
                                        text=text1;
                                        text=text1;
                                        syn.play(text,sizeof(text),0);         //播放湿度数值个位       
                                        }                                       
             }
                        break;
        case 2:        //开灯
             if(flag==1)
             {
               syn.play(text8,sizeof(text8),0); //播放正在开灯
               digitalWrite(relay_1,HIGH);        //高电平驱动
               flag=0;
             }
                        break;       
      case 3:        //关灯
                   if(flag==1)
                   {
                                syn.play(text9,sizeof(text9),0); //播放正在关灯
                                digitalWrite(relay_1,LOW);
                                flag=0;
                        }
                        break;
      case 4:        //需要开灯吗?
                        if(flag==1)
                       {
                                int shine=analogRead(light_sensor_pin);        //读取光照度模拟量
                                //Serial.print("Light:");
                                //Serial.println(shine);
                                if(shine < light_threshold)        //小于光照度阀值时
                                {
                                        syn.play(text11,sizeof(text11),0); //光线不足,正在开灯
                                        digitalWrite(relay_1,HIGH);
                                }
                                else
                                {
                                        syn.play(text12,sizeof(text12),0); //光线明亮,不需要开灯
                                        digitalWrite(relay_1,LOW);
                                }
                                flag=0;
                       }
            break;
      case 5://开风扇
                  if(flag==1)
                     {
                              syn.play(text13,sizeof(text13),0); //播放风扇打开
                                digitalWrite(relay_2,HIGH);
                                flag=0;
                        }
                        break;
         case 6://关闭风扇
                  if(flag==1)
                     {
                               syn.play(text14,sizeof(text14),0);//播放风扇关闭
                                digitalWrite(relay_2,LOW);
                                flag=0;
                        }
                        break;
         case 7://音乐打开
                     if(flag==1)
                     {
                               syn.play(text15,sizeof(text15),0);//播放音乐打开
                                digitalWrite(tonePin,HIGH);
                                flag=0;
                        }
                        break;
                default:syn.play(text10,sizeof(text10),0);break;//非正常命令   
        }
}

void ExtInt0Handler ()
{
Voice.ProcessInt0();        //芯片送出中断信号
                               
}
void timerIsr()
{
wdt_reset();
}
void setup()
{
Serial.begin(9600);
Voice.Initialise(MIC,VoiceRecognitionV1);//Initialise mode MIC or MONO,default is MIC
                                           //VoiceRecognitionV1 is VoiceRecognitionV1.0 shield
                                           //VoiceRecognitionV2 is VoiceRecognitionV2.1 module
attachInterrupt(0,ExtInt0Handler,LOW);

pinMode(relay_1,OUTPUT);
digitalWrite(relay_1,LOW);
pinMode(state_led,OUTPUT);
digitalWrite(state_led,LOW);
Timer1.initialize(90000);      //z每隔0.09s执行一次此函数
Timer1.attachInterrupt(timerIsr); //执行中断服务程序
wdt_enable(WDTO_120MS);//WatchDog使能

pinMode(tonePin,OUTPUT);//设置蜂鸣器的pin为输出模式
length = sizeof(tune)/sizeof(tune);//这里用了一个sizeof函数,可以查出tone序列里有多少个音符
}
void loop()
{
    static uint8_t nAsrRes=0;//声明语音模块工作状态
    static unsigned long time = millis();
        if(millis()-time>100)
        {
       int gas=analogRead(gas_sensor_pin);
       if(gas > gas_threshold)
       {
                        syn.play(text6,sizeof(text6),0);
                        syn.play(text7,sizeof(text7),0);
       }
                switch(nAsrStatus)
                {
                        case LD_ASR_RUNING:
                        case LD_ASR_ERROR:break;
                        case LD_ASR_NONE:
                        {
                                nAsrStatus=LD_ASR_RUNING;
                if (Voice.RunASR(SUM,30,sRecog)==0) //识别不正确
                                {
                                        nAsrStatus= LD_ASR_ERROR;
                  Serial.println( "ASR_ERROR");
                                }

                Serial.println( "ASR_RUNING.....");
                                digitalWrite(state_led,HIGH);
                                break;
                        }
                        case LD_ASR_FOUNDOK:
                        {
                                digitalWrite(state_led,LOW);
                                nAsrRes =Voice. LD_GetResult();//        一次ASR识别流程结束,去取ASR识别结果                   
                finally(nAsrRes);
                                nAsrStatus = LD_ASR_NONE;
                                break;
                        }
                        case LD_ASR_FOUNDZERO:
                        default:
                        {       
                                digitalWrite(state_led,LOW);
                                nAsrStatus = LD_ASR_NONE;
                                break;
                        }
          }// switch

        }//if
}

jkgf2015 发表于 2015-8-30 17:04:32

回复地方 发表于 2011-12-8 12:05 static/image/common/back.gif
照葫芦画瓢画了一个~大家可以听听~一首老歌,不要说你听不出来是哪首歌···

可以帮忙弄一下匆匆那年嘛男朋友快生日了我想给他个惊喜可以嘛   谢谢大虾

rockthree 发表于 2015-9-25 09:31:34

回家试一下

牛大侠 发表于 2016-1-17 16:33:54

这个程序好,万能

beo 发表于 2016-2-16 15:39:54

顶,无敌啊啊啊啊啊啊啊啊

topdog 发表于 2016-2-16 22:54:27

这需要的,非常感谢分享。

MoonShine 发表于 2016-10-20 17:21:58

Arduino有自动生成音乐的二转软件

Juvenile俊逸 发表于 2016-12-2 11:29:27

只能一首歌?能不能两首歌然后加个红外控制或者按键控制下一首 暂停这种?
页: 1 2 3 4 5 6 7 8 [9] 10
查看完整版本: Arduino学习心得-简单制作各种歌曲