ArduinoLearn2

Arduino 学习(二): 高级输入输出

传感器型开关

上一次的学习中使用的是瞬时按键来控制开关,其实瞬时按键只是传感器型开关的一种,它能检测它是否被按下。而类似的传感器型开关还有:

  • 拨动开关:类似于灯的开关
  • 温控器:根据温度来调节
  • 磁力开关:两个小金属片,靠近磁场的时候会吸在一起
  • 压力开关:压力达到一定程度就会检测到
  • 倾斜开关:由一些触点和小球构成,倾斜小球会离开触点
  • PIR 传感器:检测人是否在范围内移动

灯光逐渐点亮熄灭

在之前控制亮灭的时候中间要有一定时间的延时,因为间隔太小的话人眼是无法捕捉相应的变化的。而间隔太小的时候虽然无法看出闪烁,但是能感觉到亮度比一直亮着的时候要暗,这种通过改变脉冲宽度来改变亮度的技术叫做脉宽调制,或 PWN。

而在 Arduino 中为了避免代码的长度给调节亮度造成的影响于是有了 analogWrite() 函数。

下面便是逐渐点亮和熄灭 LED 灯的代码,电路则只用把 LED 灯一边接在 9 端口,一边接在 GND,当然保护电阻也是不可少的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
const int LED = 9;
int i = 0;

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

void loop() {
for (; i < 255; ++i) {
analogWrite(LED, i);
delay(10); // 延时,否则看不到变化
}

for (; i > 0; --i) {
analogWrite(LED, i);
delay(10); // 延时,否则看不到变化
}
}

analogWrite(引脚号, 亮度)
-> 这里亮度是从 0~255,0 是全灭,255 是全亮,引脚号只能为3、5、6、9、10、11,因为这个功能需要硬件的支持。

通过按钮控制灯管亮度

如果想通过瞬时开关来进行亮度调节,则需要捕捉按下按键时间了,在下面的代码里面,按开关则改变灯的状态,而长按则调整亮度,亮度达到顶峰就变为零。

电路图为上面的电路图和上一次电路图的结合。

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
const int LED = 9;
const int BUTTON = 7;

int val = 0;
int old_val = 0;
int state = 0;
int brightness = 128;
unsigned long startTime = 0;

void setup() {
pinMode(LED, OUTPUT);
pinMode(BUTTON, INPUT);
}

void loop() {
val = digitalRead(BUTTON);

if (val == HIGH && old_val == LOW) { // 按下按钮则改变状态
state = 1 - state;
startTime = millis(); // millis 返回距离上次重置所用的毫秒数
delay(10);
}

if (val == HIGH && old_val == HIGH) { // 长按则调节亮度
if (state == 1 && (millis() - startTime) > 500) {
brightness++;
delay(10);

if (brightness > 255) {
brightness = 0;
}
}
}

old_val = val;

if (state == 1) {
analogWrite(LED, brightness);
}
else {
analogWrite(LED, 0);
}
}

millis()
-> 获取距离上次重置所用的毫秒数,这里用来测量按下的时间