上面的实验让扬声器只发出一个声音显得太无趣,接下来我们要让扬声器发出不同的声调。并且使用一个个开关控制一个声调,就像电子琴一样。

# 部署

按照下表连接好导线

序号 元件端子 osepp UNO引脚号
1 Speaker 2
2 Button1 9
3 Button2 8
4 Button3 7
5 Button4 6
6 Button5 5
7 Button6 4
8 Button7 3

# 程序搭建

  • oseppBlock程序

  • Arduino程序
void setup()
{
  //speaker1
  pinMode(2, OUTPUT); //定义2号引脚为输出模式
  //button1
  pinMode(9, INPUT); //定义9号引脚为输入模式
  //button2
  pinMode(8, INPUT); //定义8号引脚为输入模式
  //button3
  pinMode(7, INPUT); //定义7号引脚为输入模式
  //button4
  pinMode(6, INPUT); //定义6号引脚为输入模式
  //button5
  pinMode(5, INPUT); //定义5号引脚为输入模式
  //button6
  pinMode(4, INPUT); //定义4号引脚为输入模式
  //button7
  pinMode(3, INPUT); //定义3号引脚为输入模式
}

void loop()
{
  if (digitalRead(9) == LOW) //如果9号引脚为低电平时
  {
    tone(2, 131); //2号引脚输出131频率的声音
  }
  else if (digitalRead(8) == LOW) //如果8号引脚为低电平时
  {
    tone(2, 147); //2号引脚输出147频率的声音
  }
  else if (digitalRead(7) == LOW) //如果7号引脚为低电平时
  {
    tone(2, 165); //2号引脚输出165频率的声音
  }
  else if (digitalRead(6) == LOW) //如果6号引脚为低电平时
  {
    tone(2, 175); //2号引脚输出175频率的声音
  }
  else if (digitalRead(5) == LOW) //如果5号引脚为低电平时
  {
    tone(2, 196); //2号引脚输出196频率的声音
  }
  else if (digitalRead(4) == LOW) //如果4号引脚为低电平时
  {
    tone(2, 220); //2号引脚输出220频率的声音
  }
  else if (digitalRead(3) == LOW) //如果3号引脚为低电平时
  {
    tone(2, 247); //2号引脚输出247频率的声音
  }
  else //否则
  {
    noTone(2); //停止声音
  }
}
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55

# 运行结果

学习板上只有7个开关,我们就设定前面7个音调。从开关1至7就是哆唻咪哗嗦啦西。
找一首简单的曲子,试试能不能弹出来1-2-3-1,1-2-3-1,3-4-5,3-4-5...

一首乐曲有若干音符组成,一个音符对应一个频率。tone()函数可以产生固定频率的PWM信号来驱动扬声器发声。发声时间长度和声调都可以通过参数控制。
定义发声时间长度有两种方法,第一种是通过tone()函数的参数来定义发声时长,另一种是使用no Tone()函数来停止发声。
如果您在使用 tone() 函数时没有定义发声时间长度,那么除非您通过noTone() 函数来停止声音,否则Arduino将会一直通过tone()函数产生声音信号。

# 解析

Arduino一次只能产生一个声音。假如Arduino的某一个引脚正在通过 tone() 函数产生发声信号,那么此时让Arduino使用另外一个引脚通过tone()函数发声是不行的。

  • 函数tone()

代码:
tone(pin, frequency)
tone(pin, frequency, duration)

参数:
pin: 发声引脚(该引脚需要连接扬声器)
frequency: 发声频率(单位:赫兹) – 无符号整数型
duration: 发声时长(单位:微秒,此参数为可选参数) – 无符号长整型
该函数无返回值

# 操作视频