本帖最后由 vincentlee 于 2014-7-24 19:51 编辑
经过参考两位官方大神的教程
1.http://www.geek-workshop.com/thread-1340-1-1.html
Arduino入门教程--第十一课--Arduino达文西之灯(光敏实验)
2.http://www.geek-workshop.com/thread-288-1-2.html
Arduino学习心得-简单制作各种歌曲
卤煮看到手边的见光会自动摇脑袋晴天娃娃后,便萌生一个想法,即:想用光敏电阻与蜂鸣器组合成一个有光就会发出优美音乐的小闹钟。
但目前却在技术上遇到了困难,向各位大神求职!
以下是电路图
就照着Arduino达文西之灯里的电路图直接改的,把LED换成蜂鸣器。
以下是代码(捂脸)
(前面是参照教程2编写的,歌曲是五月天的《拥抱》的前奏)
PS:各位可以暂时忽略后面的备注,没有修改。
#define NOTE_C0 -1 #define NOTE_C1 262 #define NOTE_C2 294 #define NOTE_C3 330 #define NOTE_C4 350 #define NOTE_C5 393 #define NOTE_C6 441 #define NOTE_C7 495 #define NOTE_CL1 131 #define NOTE_CL2 147 #define NOTE_CL3 165 #define NOTE_CL4 175 #define NOTE_CL5 196 #define NOTE_CL6 221 #define NOTE_CL7 248 #define NOTE_CH1 525 #define NOTE_CH2 589 #define NOTE_CH3 661 #define NOTE_CH4 700 #define NOTE_CH5 786 #define NOTE_CH6 882 #define NOTE_CH7 990 //以上部分是定义是把每个音符和频率值对应起来,其实不用打这么多,但是都打上了,后面可以随意编写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_C4,NOTE_C6,NOTE_CH3,NOTE_CH1, NOTE_C3,NOTE_C5,NOTE_CH3,NOTE_C7, NOTE_C2,NOTE_C6,NOTE_CH4,NOTE_CH1, NOTE_C1,NOTE_C5,NOTE_CH3,NOTE_CH1, NOTE_C4,NOTE_C6,NOTE_CH3,NOTE_CH1, NOTE_C3,NOTE_C5,NOTE_CH3,NOTE_C7, NOTE_C2,NOTE_C6,NOTE_CH4,NOTE_CH1, NOTE_C1,NOTE_C5,NOTE_CH3,NOTE_CH1, };//这部分就是整首曲子的音符部分,用了一个序列定义为tune,整数 float duration[]= { 0.5,0.5,0.5,0.5, 0.5,0.5,0.5,0.5, 0.5,0.5,0.5,0.5, 0.5,0.5,0.5,0.5, 0.5,0.5,0.5,0.5, 0.5,0.5,0.5,0.5, 0.5,0.5,0.5,0.5, 0.5,0.5,0.5,0.5, 1+1+1+1 };//这部分是整首曲子的接拍部分,也定义个序列duration,浮点(数组的个数和前面音符的个数是一样的,一一对应么) int length;//这里定义一个变量,后面用来表示共有多少个音符 int tonePin=13;//蜂鸣器的pin int a =100; //此处需是环境基础亮度变量,请查看自己的亮度数值, //填写到此处数值要略大于所测得的数据但小于灯光下的数据
void setup () { Serial.begin(9600); pinMode(13,OUTPUT); } void loop() { intn = analogRead(A0); //读取模拟口A0数值 Serial.println(n); if(n>= a ) //对光线强度进行判断,如果比我们的预设值大 就点亮LED否则就关闭 { for(int x=0;x<length;x++)//循环音符的次数 { tone(tonePin,tune[x]);//此函数依次播放tune序列里的数组,即每个音符 delay(1000*duration[x]);//每个音符持续的时间,即节拍duration,400是调整时间的越大,曲子速度越慢,越小曲子速度越快,自己掌握吧 noTone(tonePin);//停止当前音符,进入下一音符 } delay(2000);//等待2秒后,循环重新开始 } else { digitalWrite(13,LOW); } }
最后上传到arduino上代码已经没有问题
但是传输之后,蜂鸣器没有按照我的想法发出声音,几次检查线路、接口什么的都没有问题,但还是不行。
我想是不是我的代码有问题?还是接法有误?请各位看见的大神能指点一下!
小弟感激不尽!!!
|