Hi,大家好!经过之前的几次学习,Arduino一直保持沉默,任意听从我们的摆布。从今天开始,我们将来点儿不一样的!这一次,让我们听一听Arduino那动人的歌喉!好!直奔主题,还是先看一看我们需要做一些什么样的准备吧!
硬件方面
图片来源:Arduino电路配件
具体包括如下:
- Arduino UNO电路板(1块)
- 面包板(1块)
- 10kΩ电阻(1个)
- 100Ω电阻(1个)
- 8Ω扬声器(1个)
- 压力传感器(1个)
- 面包线(若干)
这一次出现了两个新面孔,一个是压力传感器,另一个是8Ω的扬声器。别担心,虽然都是新面孔,上手还是超级简单的。一般来说,压力传感器输出的信号为连续模拟信号,所以要想接收压力传感器发出的信号变化,需要将其连接到模拟信号引脚上。压力传感器的数值变化范围一般为0~1023之间。
普通的8Ω扬声器就是一个数字输出设备,所以需要将其连接到数字信号引脚上。通过这个扬声器,马上我们就将可以感受到Arduino那美丽而动人的歌喉!
软件方面Arduino官方提供的IDE。
好的!下面来连接电路。
连接电路
图片来源:Arduino电路连接
这里我们要简单的提醒一下,与扬声器进行串联的电阻使用的是数值为100Ω的那个,另一个10kΩ的电阻是与压力传感器进行串联的。另外,注意在连接时,压力传感器的负级与连接到Arduino上的信号线是分开的两根线,而且信号线是连接在压力传感器的负极上,也就是说呢,连接压力传感器一共需要四根面包线,嗯!扬声器的连接就比较简单了,只是期间串联了一个100Ω的电阻。
好!最后一步!
添加几行代码首先,还是新建一个项目窗口。
图片来源:Arduino官方IDE
接下来我们向其中添加如下代码:
- // 为了在程序中方便对音调进行变更,
- // 我们提前在程序的最顶部预定义了
- // 四个宏变量,每个宏变量代表一个
- // 音调,可以让扬声器发出不同的声音。
- // 宏变量在程序运行中不得更改,
- // 其使用方式可以简单理解成常量。
- #define NOTE_B0 31
- #define NOTE_AS2 117
- #define NOTE_AS3 233
- #define NOTE_D6 1175
- // 定义压力传感器的输入针脚号为0
- int forceSensorPin = 0;
- // 对Arduino电路板或相关状态进行初始化方法
- void setup(void) {
- // 开启串行通信,并设置其频率为9600。
- // 如果没有特别要求,此数值一般都为9600。
- Serial.begin(9600);
- }
- // 系统调用,无限循环方法
- void loop(void) {
- // 从模拟引脚号为0的接口,读取压力传感器的数值。
- int forceSensorState =analogRead(forceSensorPin);
- // 向调试窗口打印字符串"Analog reading = "
- Serial.print("Analog reading = ");
- // 紧接着上一行字符串的后面,
- // 输出当前读取到的压力传感器的数值状态。
- Serial.print(forceSensorState);
- // 简单根据压力传感器所受力的大小,
- // 划分了五个不同的等级。
- if(forceSensorState < 10) {
- // 当压力数值小于10时,不发出声音,
- // 并向调试窗口打印" - No pressure"字符串。
- Serial.println(" - No pressure");
- }else if(forceSensorState < 200) {
- // 当压力大于10小于200时,发出声音,
- // 同时向调试窗口打印" - Light touch"字符串。
- Serial.println(" - Light touch");
- // tone()方法是让歌喉发出动人声音的方法。
- // 此方法共有三个参数,
- // 从左边算起,第一个参数为针脚号,此处为8,
- // 也即数字信号引脚的8号引脚。
- // 第二个参数为音调数值,此处为程序顶部预定义的
- // 宏变量之一,例如此处为NOTE_B0。
- // 第三个参数为音调的发声时间长度,单位为毫秒,
- // 此处为100毫秒。
- tone(8, NOTE_B0, 100);
- }else if(forceSensorState < 500) {
- // 当压力大于200小于500时,发出声音,
- // 同时向调试窗口打印" - Light squeeze"字符串。
- Serial.println(" - Light squeeze");
- // tone()方法向扬声器发送信号,让其发出动人的声音。
- // tone()方法详细解释同上。
- tone(8, NOTE_AS2, 100);
- }else if(forceSensorState < 800) {
- // 当压力大于500小于800时,发出声音,
- // 同时向调试窗口打印" - Medium squeeze"字符串。
- // tone()方法向扬声器发送信号,让其发出动人的声音。
- // tone()方法详细解释同上。
- Serial.println(" - Medium squeeze");
- tone(8, NOTE_AS3, 100);
- }else{
- // 当压力大于800时,发出声音,
- // 同时向调试窗口打印" - Big squeeze"字符串。
- // tone()方法向扬声器发送信号,让其发出动人的声音。
- // tone()方法详细解释同上。
- Serial.println(" - Big squeeze");
- tone(8, NOTE_D6, 100);
- }
- // 延迟1000毫秒(也即1秒钟)进入下一次程序循环。
- // 实际效果就是,每两次发声之间有1秒钟的时间间隔。
- delay(1000);
- }
复制代码
完工!作为学习的实例,猛然看起来好像很麻烦,其实删除中间的文字注释,一共也不到三十行的代码!而其中真正的新面孔说实话也就一个tone()方法而已,此方法中三个参数的解释已经在代码的注释中说过,这里就不重复解释了。
图片来源:Arduino官方IDE的文件编辑菜单选项
好的!最后点击上图中标有向右指向的箭头图标,将编写好的代码烧入Arduino UNO电路板。然后单击上图中最右侧的放大镜图标,打开串口调试窗口,如下图所示。
图片来源:Arduino串口调试窗口
在上图窗口中,你将会看到每隔1秒钟打印一条描述信息。如果电路连接一切正常,此时用手去按压连接好的压力传感器,立刻就会听到Arduino那动人的歌喉!压力传感器会根据按压的力道,会从歌喉里传出不同的美妙音律!
总结我们通过这次学习,碰到了两个新的硬件,一个是扬声器,另一个是压力传感器。压力传感器的电路连接,一开始可能看起来有些复杂,不过思路想清楚之后也还是比较简单的。扬声器的连接,期间串联了一个电阻。软件方面,为了让扬声器发声,程序中我们遇到了一个新面孔,那就是tone()方法。对于这个方法的使用,我们在实例代码的注释中也已经详细说明。嗯,差不多这次主要就是这些!
下期预告
既然我们可以借助压力传感器让扬声器发出不同的声音,那我们可不可以抛弃压力传感器,直接让扬声器发出声音呢?答案当然是可以!好!下一次,就让我们把Arduino的动人歌喉变成跨时代的留声机!
|