极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 13979|回复: 4

小白求助——如何用光敏电阻控制蜂鸣器开关?(晴天娃娃闹钟)

[复制链接]
发表于 2014-7-24 19:51:20 | 显示全部楼层 |阅读模式
本帖最后由 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]);//每个音符持续的时间,即节拍duration400是调整时间的越大,曲子速度越慢,越小曲子速度越快,自己掌握吧
       noTone(tonePin);//停止当前音符,进入下一音符
     }
     delay(2000);//等待2秒后,循环重新开始
   }
else
  {
   digitalWrite(13,LOW);
  }
}


最后上传到arduino上代码已经没有问题

但是传输之后,蜂鸣器没有按照我的想法发出声音,几次检查线路、接口什么的都没有问题,但还是不行。
我想是不是我的代码有问题?还是接法有误?请各位看见的大神能指点一下!
小弟感激不尽!!!











本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

 楼主| 发表于 2014-7-24 20:48:25 | 显示全部楼层
谢谢各位!!!{:soso_e109:}{:soso_e109:}{:soso_e109:}{:soso_e109:}{:soso_e109:}{:soso_e109:}{:soso_e109:}{:soso_e109:}{:soso_e109:}{:soso_e109:}{:soso_e109:}{:soso_e109:}{:soso_e109:}


我自己找到问题了。。。。= =!!
回复 支持 反对

使用道具 举报

发表于 2014-7-27 14:34:26 | 显示全部楼层
vincentlee 发表于 2014-7-24 20:48
谢谢各位!!!{:soso_e ...

找到问题要说一下,其他人搜索过来就能把问题给解决了。对不对~~~
回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-16 22:36 , Processed in 0.041947 second(s), 20 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表