Oh!Coder

Coding Life

好玩的Arduino-圣光之音

| Comments

Hi,大家好!上一次我们用三个扬声器组织了一次大合唱,但遗憾的是,唱出来的调调都是事先确定好的,没有即兴发挥的感觉。这一次,我们不但想通过外部的变化来控制这个调调,而且使用的外部条件是光。嗯,这一次,我们要听一听圣光的声音!

好!让我们进入正题,看看具体是如何做的。

硬件准备

arduino-light-song-parts

图片来源:Arduino电路配件

具体包括如下:

  • Arduino UNO电路板(1块)
  • 面包板(1块)
  • 扬声器(1个)
  • 100Ω电阻(1个)
  • 4.7KΩ电阻(1个)
  • 光敏电阻(1个)
  • 面包线(若干)

上述配件中,新出现了一个光敏电阻。使用起来很容易,这里简单介绍一下。光敏电阻的特性就是根据外界光源的强弱,实时产生一定数值范围的模拟信号。

软件方面

Arduino官方提供的IDE。

连接电路

arduino-light-song

图片来源:Arduino电路连接

连接电路时,注意与扬声器串联的电阻值是100Ω,与光敏电阻串联的电阻值是4.7KΩ。光敏电阻的连接方式,正负极遵循长正短负的原则。也就是说长腿为正极,短腿为负极。

好,最后一步!

添加几行代码

还是新建一个项目窗口。

arduino-ide-new

图片来源:Arduino官方IDE

向其中添加几行代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
// 对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-menu

图片来源:Arduino官方IDE的文件编辑菜单选项

点击上图中标有向右指向的箭头图标,将编写完成的代码烧入Arduino电路板。如果一切顺利,即可通过控制光敏电阻的受光强弱,扬声器里相应会发出不同的声音。

点击上图中最右侧的放大镜图标,打开串口调试窗口,可以看到调试窗口中光敏电阻产生的模拟信号的数值。

arduino-serial-light-song

图片来源:Arduino串口调试窗口

总结

通过这次的试验,我们通过使用光敏电阻来控制扬声器发音。嗯,这就是我们的圣光之音!除此之外,硬件上我们了解到了一个新的元器件,即光敏电阻。程序上,我们遇到了一个新的方法,即map()方法。

下期预告

这次我们听到了圣光之音,我们使用外部光源来控制扬声器发音。下一次我们换一种方式,看看如何使用旋钮开关来控制LED神灯!

Comments