+
+
Posts List
  1. 温度测量
    1. 硬件介绍
    2. 问题和解决方案
    3. 代码
  2. 蜂鸣器
    1. 硬件介绍
    2. 代码
      1. 无源蜂鸣器
      2. 有源蜂鸣器
    3. 小拓展——让蜂鸣器哼歌
      1. 音调对应表
      2. 代码

Arduino基础(三)半导体测温元件与蜂鸣器

温度测量

硬件介绍

最早感知温度的手段:

  • 热敏电阻
  • 热电偶

原理:测量电阻值带来的电压的变化

现在感知温度的手段:

  • 半导体测温元件(LM35)

问题和解决方案

如何输出当前的摄氏温度?

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#define LED 13
#define LDR A5

int temperature = 0;
int readVal = 0;
int ledVal = 0;

void setup() {
// put your setup code here, to run once:
pinMode(LED,OUTPUT);
Serial.begin(9600);
}

void loop() { // put your main code here, to run repeatedly:
temperature = analogRead(LDR);
Serial.print("temperature = ");
Serial.println(temperature*0.488);
delay(500);
}

蜂鸣器

硬件介绍

蜂鸣器的两根脚有长有短,长的是正极。
表面上贴了一张纸,保护元器件在工业生产中不被清洗水损坏。

实际上,根据驱动方式,蜂鸣器可以分为有源蜂鸣器无源蜂鸣器两种,这里的“源”不是指电源,而是指震荡源,有源蜂鸣器内部带震荡源,所以只要一通电就会响,而无源内部不带震荡源,仅用直流信号是无法令其鸣叫的,必须用2K-5K的方波去驱动它。而慕课中翁凯老师所说的蜂鸣器指的是有源蜂鸣器,所以当我直接使用视频中的示例代码时,蜂鸣器并不会鸣响。

  • 无源蜂鸣器:没有正负之分,类似于喇叭,要在两个腿上加载不同的频率的电信号才可以实现发声,根据不同的频率所发出的声音也是不一样的。
  • 有源蜂鸣器:有正负之分,只需要在两个腿上加上电压信号就会发声,发出的声音音调单一、频率固定。

代码

无源蜂鸣器

对于无源蜂鸣器,必须使用tone()函数,通过PWM管脚输出一个波形才能发生。如果用的是digitalWrite,会听到轻微的鼓膜震动的嘀嗒声。不过若是使用高低电平交替输出,中间延时时间非常短的情况下,无源蜂鸣器也是可以发声的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#define buzzer 3

long frequency = 300;

void setup() {
// put your setup code here, to run once:
pinMode(buzzer,OUTPUT);
}

void loop() {
// put your main code here, to run repeatedly:
tone(buzzer, frequency);
delay(1000);
noTone(buzzer);
delay(1000);
}

有源蜂鸣器

对于有源蜂鸣器,直接使用digitalWrite函数。

1
2
3
4
5
6
7
8
9
10
11
12
13
int buzzer = 3;

void setup() {
pinMode(buzzer, OUTPUT);
}

void loop() {
digitalWrite(buzzer, HIGH);
delay(1);

digitalWrite(buzzer, LOW);
delay(2);
}

小拓展——让蜂鸣器哼歌

如果能控制蜂鸣器发声的频率和时间,就相当于控制了音调和节拍,那么蜂鸣器就能够哼出曲子了。

音调对应表

低音:

音符/音调
A 221 248 278 294 330 371 416
B 248 278 294 330 371 416 467
C 131 147 165 175 196 221 248
D 147 165 175 196 221 248 278
E 165 175 196 221 248 278 312
F 175 196 221 234 262 294 330
G 196 221 234 262 294 330 371

中音:

音符/音调 1 2 3 4 5 6 7
A 441 495 556 589 661 742 833
B 495 556 624 661 742 833 935
C 262 294 330 350 393 441 495
D 294 330 350 393 441 495 556
E 330 350 393 441 495 556 624
F 350 393 441 495 556 624 661
G 393 441 495 556 624 661 742

高音:

音符/音调
A 882 992 1112 1178 1322 1484 1665
B 990 1112 1178 1322 1484 1665 1869
C 525 589 661 700 786 882 990
D 589 661 700 786 882 990 1112
E 661 700 786 882 990 1112 1248
F 700 786 882 935 1049 1178 1322
G 786 882 990 1049 1178 1322 1484

那么以赵紫骅的《可乐》这一首歌为例,试试怎么让蜂鸣器哼出“可惜在遇见……太晚了”这一段。

先要了解一下简谱:

从第一张图副标题位置可以看到,这张简谱是F调的,对应表里F调所在行;也可以看到节拍是4/4拍,即每个普通音符对应1拍。

普通音符:占1拍 eg. 6
带下划线的音符:占0.5拍 eg. 3
后面加点的音符:占1.5拍 eg. 3·
后面加横杠的音符:占2拍 eg. 3 -
连续的两个音符上带有弧线:表示连音,稍微将两个音符的频率差减小
上面带小点的音符:高音 eg. 5̇
下面带小点的音符:低音 eg. 7̣

代码

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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
// 中音F调
#define NTF0 -1
#define NTF1 350
#define NTF2 393
#define NTF3 441
#define NTF4 495
#define NTF5 556
#define NTF6 624
#define NTF7 661
// 低音F调
#define NTFL1 175
#define NTFL2 196
#define NTFL3 221
#define NTFL4 234
#define NTFL5 262
#define NTFL6 294
#define NTFL7 330
//高音F调
#define NTFH1 700
#define NTFH2 786
#define NTFH3 882
#define NTFH4 935
#define NTFH5 1049
#define NTFH6 1178
#define NTFH7 1322

int tune[]=
{
NTF0,NTF0,NTF0,NTF0,NTFL3,NTFL4,
NTFL5,NTFL3,NTFL5,NTFL3,NTFL5,NTFL3,NTFL5,NTF3,
NTF2,NTF1,NTFL6,NTFL6,NTFL6,NTF3,
NTF2,NTF1,NTF2,NTF2,NTFL5,NTFL5,NTFL3,NTFL5,NTF2,
NTF2,NTFL7,NTFL7,NTFL7,NTF1,NTF1,NTF1,NTF2,NTF3,
NTF3,NTFL6,NTF2,NTF2,NTF1,NTF2,NTF3,
NTF3,NTFL5,NTF1,NTF1,NTF1,NTF2,NTF3,
NTF3,NTFL6,NTFL7,NTF1,NTF1,NTFL7,NTF1,NTF2,
NTF3,NTF2,NTF2,NTF1,NTFL5,NTF0,NTFL3,NTFL4,
NTFL5,NTFL3,NTFL5,NTFL3,NTFL5,NTFL3,NTFL5,NTF3,
NTF2,NTF1,NTFL6,NTFL6,NTFL6,NTF3,
NTF2,NTF1,NTF2,NTF2,NTFL5,NTFL5,NTFL3,NTFL5,NTF2,
NTF2,NTF1,NTF2,NTF3,NTF3,NTF3,NTF4,NTF5,
NTF5,NTF1,NTF2,NTF2,NTF3,NTF4,NTF5,
NTF5,NTF1,NTF2,NTFL7,NTF1,NTF1,NTF3,NTF4,NTF5,
NTF5,NTF1,NTF6,NTF6,NTF5,NTF3,NTF3,NTF4,NTF3,NTF3,NTF1,NTF2,
NTF2,NTF0,NTFL5,NTF6,NTF3,
NTF3,NTF4,NTF5,NTF0,NTFL5,NTF6,NTF3,
NTF3,NTF4,NTF3,NTF3,NTF3,NTF3,NTF1,NTF1,NTF7,
NTF7,NTFH1,NTF7,NTF7,NTF5,NTF5,NTF7,NTFH1,NTF7,NTF7,NTF2,
NTF3,NTF0,NTF0
};
float durt[]=
{
1,1,1,0.75,0.25,0.25,
0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,
0.33,0.33,0.33,2,0.25,0.75,
0.25,0.25,0.5,0.75,0.25,0.5,0.5,0.25,0.75,
0.25,0.25,0.5,0.5,0.5,1,0.33,0.33,0.33,
1,0.5,0.5,1,0.33,0.33,0.33,
1,0.5,0.5,1,0.33,0.33,0.33,
0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,
0.25,0.75,0.5,0.5,1,0.5,0.25,0.25,
0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5,
0.33,0.33,0.33,2,0.5,0.5,
0.5,0.25,0.25,0.75,0.25,0.5,0.5,0.5,0.5,
0.5,0.5,0.5,0.5,1,0.5,0.25,0.25,
1,0.5,0.5,1,0.5,0.25,0.25,
0.5,0.5,0.5,0.25,0.25,1,0.5,0.25,0.25,
0.5,0.25,0.25,0.25,0.5,0.25,0.5,0.25,0.25,0.5,0.25,0.25,
2,0.5,0.5,0.5,0.5,
0.5,1,0.5,0.5,0.5,0.5,0.5,
0.5,0.25,0.25,0.5,0.5,1,0.25,0.25,0.5,
0.25,0.5,0.25,0.25,0.5,0.25,0.25,0.5,0.25,0.75,0.25,
3,0.5,0.5
};

int length;
int buzzer=3;
int LED=13;

void setup()
{
pinMode(buzzer,OUTPUT);
pinMode(LED,OUTPUT);
length=sizeof(tune)/sizeof(tune[0]);
}

void loop()
{
for(int x=0;x<length;x++)
{
tone(buzzer,tune[x]);
digitalWrite(LED, HIGH);
delay(400*durt[x]);
digitalWrite(LED, LOW);
delay(100*durt[x]);
noTone(buzzer);

}
delay(2000);
}

本文作者: rhinoc

本文链接: https://www.rhinoc.top/arduino_3/

版权声明: 本博客所有文章除特别声明外,均采用BY-NC-SA 4.0国际许可协议,转载请注明。

打赏
Love U 3000
  • Through WeChat
  • Through Alipay