友情提示:380元/半年,儿童学编程,就上码丁实验室。
我是潘,曾经是个工程师。这是“Arduino 公开课” 系列的入门教程。有任何疑问请在评论区提出,我会逐一回答。
几乎所有电器都有开关,“开关”是最基本的人机交互形式。模拟电路时代,用机械开关或者双稳态电路来控制,现在我们要用程序来实现。
第一个程序,按下按钮灯亮 ,延时2 秒后熄灭。下面是接线图:
因为 Arduino 已经板载 LED (13号数字端口),所以这里不再外接了。
按钮开关处有一个10k欧姆的电阻接地,作为“下拉电阻”。所谓下拉是使逻辑信号保持在接近 0V 的状态,确保开关闭合前,是I/O 端口为低电平,反过来,有“上拉电阻”,使逻辑信号保持在高电平。上下拉电阻在后面会经常用到。
一般来说,选用 5K 或者 10K 电阻即可,如果开关闭合,该电阻电流为 5V / 10k 欧姆 = 0.0005A ,对电路几乎没有影响。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
/*
作者:Ardui.co
效果:按下按钮,LED 亮,延时2秒熄灭
版本:1.0
更新时间:2017年1月5日
*/
voidsetup()
{
pinMode(9,INPUT);//将9号数字端口设为输入状态,13号数字口设置为输出状态
pinMode(13,OUTPUT);
}
voidloop()
{
intn=digitalRead(9);//创建变量n,并采集9号数字口的状态,赋值给n
if(n==HIGH) //如果n为高电平,执行下面的语句,否则跳过
{
delay(500); //消除抖动
digitalWrite(13,HIGH);
delay(2000); //延时2秒关闭
digitalWrite(13,LOW);
}
|
delay(500) 的作用是消除抖动,原因下面讲解。
疑问来了:实际应用中,我们更希望按一下开关,灯一直亮,再按一下则关闭,即最常见的单键控制开关,程序如何设计?
程序的思路应该要加一个对灯状态的判断条件:如果灯处于亮的状态,按一下触发低电平,如果灯处于熄灭状态,按一下触发高电平。
第二个程序接线一样,但效果为按一下LED亮,再按一下关闭:
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
|
/*
作者:Ardui.co
效果:按一下打开,再按一下关闭
版本:1.0
更新时间:2017年1月5日
*/
intLight=0;//创建变量Light,并标记 LED 状态为熄灭
voidsetup()
{
pinMode(9,INPUT);
pinMode(13,OUTPUT);
}
voidloop()
{
intn=digitalRead(9);
if(Light==0)
{
if(n==HIGH)
{
delay(500);//消除抖动
digitalWrite(13,HIGH);
Light++;//标记LED状态为亮
}
}
else
{
if(n==HIGH)
{
delay(500);//消除抖动
digitalWrite(13,LOW);
Light–; //标记LED状态为熄灭
}
}
}
|
实际的效果:
现在可以解释一下 delay(500) 消除抖动的原理。因为按钮金属片闭合瞬间,可能由于接触不良或者手抖,在非常短的时间内,连续产生多个高电平的逻辑信号。如果没有延时,当Arduino 执行了第一个 if 条件逻辑,但LED还没有完全亮起来时,就进入下 if 条件逻辑灭掉了。
延伸阅读:抖动这对一些精密电器来说是致命的,尤其对使用大量感性原件的电器,会产生高电压震荡,破坏电路。所以加入延时,防止按下去的瞬间产生抖动,防抖动的时间设置在 0.5 到 1 秒之间即可。
现在疑问又来了,Arduino 驱动小 LED 完全没问题,不过,如果是高电压的大功率电器,如家用照明、电机呢?此时,我们需要继电器的帮忙:
不过,Arduino 的驱动电流较小,同时为了防止继电器的感性电路对Arduino的影响,我们通过晶体管开关电路来驱动继电器的线圈,接线如下:
但在航天、军事等严苛的环境下,为了防止干扰、保证稳定性,一般会将数字电路跟模块电路物理区隔的方式来连接,下面这款模块就是通过光耦驱动继电器,实现物理隔离:
模块的接线方式是一样的,我们用它来控制一盏节能灯:
练习1:
希望各位不要仅仅照着教程去做,这样没有意义。Arduino 本质是一个创意玩具,用简单的编程语言实现你的想法。尝试结合第2课的内容做更多的花样出来,我举两个例子:
a. 利用按钮改变一排LED 流动方向。
b. 使用按钮让每个 LED 逐个亮起来。