Hi,大家好!上一次我们用三个扬声器组织了一次大合唱,但遗憾的是,唱出来的调调都是事先确定好的,没有即兴发挥的感觉。这一次,我们不但想通过外部的变化来控制这个调调,而且使用的外部条件是光。嗯,这一次,我们要听一听圣光的声音!
好!让我们进入正题,看看具体是如何做的。
硬件准备
图片来源:Arduino电路配件
具体包括如下:
- Arduino UNO电路板(1块)
- 面包板(1块)
- 扬声器(1个)
- 100Ω电阻(1个)
- 4.7KΩ电阻(1个)
- 光敏电阻(1个)
- 面包线(若干)
上述配件中,新出现了一个光敏电阻。使用起来很容易,这里简单介绍一下。光敏电阻的特性就是根据外界光源的强弱,实时产生一定数值范围的模拟信号。
软件方面Arduino官方提供的IDE。
连接电路
图片来源:Arduino电路连接
连接电路时,注意与扬声器串联的电阻值是100Ω,与光敏电阻串联的电阻值是4.7KΩ。光敏电阻的连接方式,正负极遵循长正短负的原则。也就是说长腿为正极,短腿为负极。
好,最后一步!
添加几行代码还是新建一个项目窗口。
图片来源:Arduino官方IDE
向其中添加几行代码:
- // 对Arduino电路板或相关状态进行初始化方法
- void setup() {
- // 开启串行通信,并设置其频率为9600。
- // 如果没有特别要求,此数值一般都为9600。
- Serial.begin(9600);
- }
- // 系统调用,无限循环方法
- void loop() {
- // 读取A0端口数据。
- // 此时,此端口连接的是光敏电阻,
- // 故,此时读取的是光敏电阻产生的模拟信号数据。
- int sensorReading = analogRead(A0);
- // 向串口打印光敏电阻产生的模拟信号数据。
- // 这行代码只是起到调试作用,无实际作用。
- Serial.println(sensorReading);
- // map()方法的作用是,
- // 对光敏电阻产生的模拟信号数据进行变换。
- // 光敏电阻产生的数据范围为400~1000,
- // 将此数据范围变换到120~1500之间。
- // map()方法输入参数从左边开始依次是,
- // 左一参数为光敏电阻模拟信号数值。
- // 左二和左三是光敏电阻默认的数值范围。
- // 左四和左五是变换后的数值范围。
- int thisPitch = map(sensorReading, 400, 1000, 120, 1500);
- // 对9号数字引脚上的扬声器,
- // 输入变换后的光敏电阻数值,
- // 声音的播放时间长度为10毫秒。
- tone(9, thisPitch, 10);
- // 每次循环之间延时1毫秒。
- delay(1);
- }
复制代码
好!代码就这些。这几行代码里出现了一个新面孔,那就是map()方法,已经在代码的注释里说明了,调用方式并不复杂,只是参数多了几个,这里就不再赘述。
图片来源:Arduino官方IDE的文件编辑菜单选项
点击上图中标有向右指向的箭头图标,将编写完成的代码烧入Arduino电路板。如果一切顺利,即可通过控制光敏电阻的受光强弱,扬声器里相应会发出不同的声音。
点击上图中最右侧的放大镜图标,打开串口调试窗口,可以看到调试窗口中光敏电阻产生的模拟信号的数值。
图片来源:Arduino串口调试窗口
总结通过这次的试验,我们通过使用光敏电阻来控制扬声器发音。嗯,这就是我们的圣光之音!除此之外,硬件上我们了解到了一个新的元器件,即光敏电阻。程序上,我们遇到了一个新的方法,即map()方法。
下期预告这次我们听到了圣光之音,我们使用外部光源来控制扬声器发音。下一次我们换一种方式,看看如何使用旋钮开关来控制LED神灯!
ohcoder的系列精彩Arduino教程:
Arduino教程-初识Arduino(包含本教程目录):http://www.51hei.com/bbs/dpj-41334-1.html
Arduino教程-开篇:http://www.51hei.com/bbs/dpj-41335-1.html
Arduino教程-点亮LED神灯:http://www.51hei.com/bbs/dpj-41336-1.html
Arduino教程-让LED神灯闪烁:http://www.51hei.com/bbs/dpj-41337-1.html
Arduino教程-让LED神灯亮度渐变:http://www.51hei.com/bbs/dpj-41338-1.html
Arduino教程-获取输入数字信号:http://www.51hei.com/bbs/dpj-41339-1.html
Arduino教程-获取输入模拟信号:http://www.51hei.com/bbs/dpj-41340-1.html
Arduino教程-另一种时间延迟:http://www.51hei.com/bbs/dpj-41331-1.html
Arduino教程-按键开关:http://www.51hei.com/bbs/dpj-41341-1.html
Arduino教程-停止抖动!:http://www.51hei.com/bbs/dpj-41333-1.html
Arduino教程-抛弃外部电阻!:http://www.51hei.com/bbs/dpj-41332-1.html
Arduino教程-用按键开关计数:http://www.51hei.com/bbs/dpj-41330-1.html
|