《Arduino实战》——2.2 获得控制权

简介:

本节书摘来自异步社区《Arduino实战》一书中的第2章,第2.2节,作者 【美】Martin Evans , Joshua Noble , Jordan Hochenbaum ,译者 况琪,更多章节内容可以访问云栖社区“异步社区”公众号查看。

2.2 获得控制权

现在你的程序已经开始工作了,伴随着LED一个接一个地点亮和熄灭,下面我们要添加一个按钮,来控制这电路了。这个按钮用来启动和停止LED序列的闪烁。

2.2.1 电路图

电路图如图2-7所示。你需要保留最初版本的电路,并再添加一个按钮(S1)和一个阻值为10 kΩ的电阻(R6)就可以了。

在你看懂了修改过的电路图之后,就可以把新的元件添加到面包板上了。


screenshot

2.2.2 连接

首先,将Arduino从USB电缆上断开,然后将按钮安装到面包板上,如图2-8所示。请注意如何将其跨接在面包板中间。电阻R6是一个下拉电阻,在按钮未被按下的时候,它能防止D2的输入浮空,而将D2的输入下拉到地(GND),也就是低电平。当按钮按下的时候,D2的输入会接到5 V,也就是高电平。

图2-9展示了在面包板上组装完成后的电路。Arduino的供电由连接在计算机上的USB电缆提供。

上拉电阻和下拉电阻

在包含按钮的电路中,上拉电阻和下拉电阻的使用是十分普遍的,它可以防止由电气噪声或干扰带来的错误信号。这个电阻将输入口的电平保持在与程序检测电位相反的电平上。一个上拉电阻将电平上拉到5 V,一个下拉电阻将电平下拉到地。

当你连接好按钮和增加的电阻后,就可以来处理一下代码这边的工作了。在这个程序里,我们要使用Arduino中一个专门的特性,称为中断。


screenshot


screenshot

2.2.3 认识中断

Arduino的中断非常强大,它可以在任何时候打断程序流程的执行。中断就像你就要走进浴室时突然有人按门铃一样——你必须马上处理它。Arduino也是一样的,一旦中断信号发出,你的程序就要马上去处理它。

标准的Arduino可以使用最多两个中断,但在这个项目中,你只会用到一个。当按钮被按下时就会发生一个中断,第一次按下按钮会时LED序列停止闪烁,再按一次则会使其重新开始闪烁,以此类推。

2.2.4 通过按钮控制LED的程序

下列代码清单就是新版的程序。你可以在现有程序的基础上修改,也可以再新建一个程序。

代码清单2-2 开始-停止显示

screenshot

标准的Arduino有两个中断:中断0绑定在2号数字引脚,中断1绑定在3号数字引脚。Arduino Mega还有4个额外的中断:中断2绑定在21号数字引脚,中断3绑定在20号数字引脚,中断4绑定在19号数字引脚,中断5绑定在18号数字引脚。

注意 函数attachInterrupt(interrupt, function, mode)有3个参数。第一个参数是中断号,可以设置为0或者1;第二个参数是中断调用的函数,必须是一个无参数无返回值的函数;第三个参数是产生中断的模式。中断模式可赋下列4种值:设置LOW时,中断在引脚电平为低时触发;设置为CHANGE时,中断在引脚电平改变时触发;设置为RISING时,中断在引脚电平从低电平变为高电平时触发;设置为FALLING时,中断在引脚电平从高电平变为低电平时触发。

screenshot

抖动消除

在中断服务程序,也就是ledOnOff()函数中,我们还添加了一些代码,用于处理机械按钮中存在的抖动(bounce)问题。当按钮被按下时,在它从断开状态转换到闭合状态的瞬间,其中机械部件的接触并不完美,而是会产生一系列被称为抖动的干扰信号,导致与之相连的引脚电位高低变化数次后才最终稳定。按钮通常需要10 ms~50 ms才能最终稳定,但当你观察到一些奇怪的结果并怀疑其是由于抖动造成的时,你也可以尝试将这个时间改得更长一些。

screenshot

警告 很多人认为中断是一个高级技巧,但只要你够仔细,应该可以毫无障碍地使用它。在中断服务程序中,让你的程序代码尽可能小巧,这将会避免你在程序的其他部分遇到预料之外的事情。另外一个警告就是,你不能在中断服务程序中使用delay函数。

接下来让我们一起来测试我们最新的程序吧。

2.2.5 烧写和测试

将Arduino通过USB电缆连接到你的计算机。确保你的程序已经被正确编译,然后将其写入到Arduino中。当程序烧写完成后,所有LED都处于熄灭状态,直到你按下按钮。尝试着多按几次按钮,观察LED序列如何开始和停止。

2.2.6 使用break语句

保留原来的电路不动,现在把一个break语句添加到你的程序中。break``指令用于跳出一个循环或者switch语句。你利用它停止LED序列并保持LED的点亮状态,直到再次按下按钮,所以如果你在已经点亮3个LED的时候按下按钮,这3个LED就会一直处于点亮状态,直到再次按下按钮,序列才会继续循环点亮。

下列代码清单给出了使用break语句的新版程序。

代码清单2-3 添加break语句

screenshot

下面要检查一下你的程序能否正常工作。

2.2.7 烧写和测试

确保你的程序已经正确地编译,然后烧写并测试它。当按下按钮时,闪烁的LED序列应该会暂停,再次按下按钮,序列应该重新开始循环。

是时候让你的项目进入到下一个阶段了。你要来制作一个反应测试仪。

相关文章
|
7月前
|
数据处理 C语言
侃侃单片机的裸奔程序的框架
侃侃单片机的裸奔程序的框架
80 0
|
10月前
|
消息中间件 Windows
单片机程序构架
单片机程序构架
|
Ubuntu Linux 编译器
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(二十七)具体单板的LED驱动程序
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(二十七)具体单板的LED驱动程序
156 0
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(二十七)具体单板的LED驱动程序
|
Linux 开发工具 git
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(二十六)LED驱动程序框架
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(二十六)LED驱动程序框架
151 0
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(二十六)LED驱动程序框架
|
Linux 开发工具 git
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(三十五)具体单板的按键驱动程序(查询方式)
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(三十五)具体单板的按键驱动程序(查询方式)
200 0
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(三十五)具体单板的按键驱动程序(查询方式)
|
Linux 芯片 内存技术
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(三十七) 异常与中断的概念及处理流程
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(三十七) 异常与中断的概念及处理流程
152 0
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(三十七) 异常与中断的概念及处理流程
|
Ubuntu JavaScript 虚拟化
鸿蒙开发板利用串口通信的基本原理与实现
大家好,今天主要来学习一下,如何使用Hi3861通过UART串口与其它开发板进行通信方法。
664 0
鸿蒙开发板利用串口通信的基本原理与实现
|
C语言
【嵌入式实训】STM32中断处理机制及外部中断使用方法
理论知识 STM32系列处理器外部中断/事件控制器的原理 共19个外部中断线,其中GPIO端口以下图的方式连接到16个外部中断/事件线上: 另外三种其他的外部中断/事件控制器的连接如下:EXTI 线 
534 0
|
缓存 开发工具 芯片
单片机:串口通信(内含硬件解析+软件编程)
单片机:串口通信(内含硬件解析+软件编程)
132 0
单片机:串口通信(内含硬件解析+软件编程)
|
Linux
树莓派内核驱动编写——添加与调用
树莓派内核驱动编写——添加与调用
386 0