Arduino学习心得-简单制作各种歌曲
时间:2022-12-20 09:00:01
最近在做语音控制 想在语音控制中加入蜂鸣器的声音 如下代码,我想知道如何将蜂鸣器播放音乐的程序嵌入到我原来的程序中下面是我自己嵌入的。 报错了很多 希望有哪位大侠能帮忙解决? 万分感谢
/*
识别关键字的数量为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 //定时器
#include //包括看门狗头文件
#include ///声明语音识别库文件
//#include //语音合成库文件
#include ///温湿度传感器库
dht11 DHT;
Syn6288 syn;
uint8nAsrStatus=0;///声明语音模块的工作状态
#define SUM 13
#define DHT11_PIN A0//定义温湿度传感器模拟口A0
#define light_sensor_pin A2/定义光传感器模拟口A2
#define light_threshold 200//定义光照度阈值2000/
#define gas_sensor_pin A1 //定义气体传感器模拟口A1
#define gas_threshold 700 //气体传感器阈值7000
#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
//{
// tone(tonePin,tune[x]);//依次播放此函数tune序列中的数组,即每个音符
// delay(800*duration[x]);///每个音符的持续时间,即节拍duration,调整时间越大,曲子越慢,曲子越小,曲子越快,自己掌握吧
// noTone(tonePin);///停止当前音符,输入下一个音符
//}
//delay(5000)
//}
char sRecog[SUM][30] = {"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};///湿度为1%
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,0xC六};//正在开灯
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[2];
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[0]=text1[pig1*2];
text[1]=text1[pig1*2+1];
syn.play(text,sizeof(text),0); //播放温度数值十位
text[0]=text1[20];
text[1]=text1[21];
syn.play(text,sizeof(text),0); //播放语音十
}
if(pig2>0){
text[0]=text1[pig2*2];
text[1]=text1[pig2*2+1];
syn.play(text,sizeof(text),0); //播放温度数值个位
}
syn.play(text5,sizeof(text5),0); //播放摄氏度
syn.play(text4,sizeof(text4),0); //播放湿度为百分之
if(pig3>0){
text[0]=text1[pig3*2];
text[1]=text1[pig3*2+1];
syn.play(text,sizeof(text),0); //播放湿度数值十位
text[0]=text1[20];
text[1]=text1[21];
syn.play(text,sizeof(text),0); //播放语音十
}
if(pig4>0){
text[0]=text1[pig4*2];
text[1]=text1[pig4*2+1];
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[0]);//这里用了一个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
}