当前位置: 首页 > news >正文

Arduino 入门学习笔记(五):KEY实验

Arduino 入门学习笔记(五):KEY实验

开发板:正点原子ESP32S3
例程源码在文章顶部可免费下载(审核中…)

1. GPIO 输入功能使用

1.1 GPIO 输入模式介绍

在上一文章中提及到 pinMode 函数, 要对数字 I/O 进行检测,首先把 I/O 设置为输入模式, 然后使用数字 I/O 检测函数为 digitalRead 函数检测外部电平状态。当外部输入高电平时,返回值为 1;当外部输入低电平时,返回值为 0。
pinMode 函数设置 I/O 为输入,有三种选择: INPUT、 INPUT_PULLUP、 INPUT_PULLDOWN。这里简单设置的依据就跟这个按键电路相关。当我们存在上拉或者下拉按键电路的情况时,可以直接选择 INPUT;如果当前的按键电路需要内部上拉电阻,这时候选择 INPUT_PULLUP;如果当前的按键电路需要内部下拉电阻时,这时候选择 INPUT_PULLDOWN。
在这里,简单介绍一下上拉电阻电路、下拉电阻电路、内部上拉电路和内部下拉电路。
上拉电阻电路,如下图所示:
在这里插入图片描述
当按键开关断开时,即没有被按下时, ESP32S3 的 IO0 通过电阻和 3.3V 电源相连接,产生高电平, digitalRead(0)函数的返回值为 1。当按键开关闭合时,即按下按键时, ESP32S3 的 IO0的电压和地相连接,产生低电平, digitalRead(0)函数的返回值为 0。电路中的 1KΩ电阻成为上拉电阻。
下拉电阻电路,如下图所示:
在这里插入图片描述
当按键开关断开时,即没有被按下时, ESP32S3 的 IO0 通过电阻和地相连接,产生低电平,digitalRead(0)函数的返回值为 0。当按键开关闭合时,即按下按键时, ESP32S3 的 IO0 的电压和电源 3.3V 相连接,产生高电平, digitalRead(0)函数的返回值为 1。电路中的 1KΩ电阻成为下拉电阻。
当数字输入引脚的工作模式设置为 INPUT 时,读取按键值,一定要在电路中设置一个上拉电阻或者下拉电阻,电阻的阻值一般可以为 1~10KΩ 。采用上拉电阻时,当按键断开时digitalRead(0)函数的返回值为 1。采用下拉电阻时,当按键断开时, digitalRead(0)函数的返回值为 0。
内部上拉电阻电路, 除了上述的两种电路外,在 ESP32S3 控制器内部还集成了上拉电阻,通过在 pinMode()函数中设置 mode 参数为 INPUT_PULLUP 来启动内部上拉电阻。启动控制器内部的上拉电阻后,按键开关电路就可以省略外接电阻。内部上拉电阻电路, 如下图所示:
在这里插入图片描述
从上图可以看出,当开关断开时, digitalRead(0)函数的返回值为 1;当开关闭合时,digitalRead(0)函数的返回值为 0。当采用内部上拉电阻电路时,按键的一端和数字引脚相连,另外一端和地相连。
内部下拉电阻电路,在 ESP32S3 控制器内部除了集成上拉电阻,还有下拉电阻,通过在pinMode()函数中设置 mode 参数为 INPUT_PULLDOWN 来启动内部下拉电阻。启动控制器内部的下拉电阻后,按键开关电路就可以省略外接电阻。内部下拉电阻电路,如下图所示:
在这里插入图片描述
从上图可以看出,当开关断开时, digitalRead(0)函数的返回值为 0;当开关闭合时,digitalRead(0)函数的返回值为 1。当采用内部下拉电阻电路时,按键的一端和数字引脚相连,另外一端和 VCC 相连。

1.2 独立按键简介

几乎每个开发板都会板载有独立按键,因为按键用处很多。常态下,独立按键是断开的,按下的时候才闭合。每个独立按键会单独占用一个 IO 口,通过 IO 口的高低电平判断按键的状态。但是按键在闭合和断开的时候,都存在抖动现象,即按键在闭合时不会马上就稳定的连接,断开时也不会马上断开。这是机械触点,无法避免。独立按键抖动波形图如下:
在这里插入图片描述
图中的按下抖动和释放抖动的时间一般为 5~10ms, 如果在抖动阶段采样, 其不稳定状态可能出现一次按键动作被认为是多次按下的情况。为了避免抖动可能带来的误操作,我们要做的措施就是给按键消抖(即采样稳定闭合阶段)。消抖方法分为硬件消抖和软件消抖,我们常用软件的方法消抖。
软件消抖:方法很多, 我们例程中使用最简单的延时消抖。 检测到按键按下后,一般进行10ms 延时,用于跳过抖动的时间段,如果消抖效果不好可以调整这个 10ms 延时,因为不同类型的按键抖动时间可能有偏差。待延时过后再检测按键状态,如果没有按下,那我们就判断这是抖动或者干扰造成的;如果还是按下,那么我们就认为这是按键真的按下了。对按键释放的判断同理。
硬件消抖:利用 RC 电路的电容充放电特性来对抖动产生的电压毛刺进行平滑出来,从而实现消抖,但是成本会更高一点,本着能省则省的原则,我们推荐使用软件消抖即可。

2. 硬件设计

2.1 例程功能

通过开发板上的 boot 独立按键实现 LED 的亮灭。

2.2 硬件资源

1) LED 灯:LED-IO1
2)独立按键:BOOT-IO0

2.3 原理图

独立按键硬件部分的原理图,如下图所示:
在这里插入图片描述
这里需要注意的是: BOOT 设计为采样到按键另一端的低电平为有效电平。

3 软件设计

3.1 程序流程图

下面看看本实验的程序流程图:
在这里插入图片描述

3.2 程序解析

3.2.1 key 驱动代码

这里我们只讲解核心代码,详细的源码请大家参考光盘本实验对应源码。 KEY 驱动源码包括两个文件: key.cpp 和 key.h。
下面我们先解析 key.h 的程序,我们把它分两部分功能进行讲解。
由硬件设计小节,我们知道 KEY 按键在硬件上连接到 IO0,我们做了下面的引脚定义。

/* 引脚定义 */
#define KEY_PIN 0 /* 开发板上 KEY 连接到 GPIO0 引脚 */

为了后续对 KEY 按键进行便捷的操作,我们为 KEY 按键操作函数做了下面的定义。

/* 宏函数定义 */
#define KEY digitalRead(KEY_PIN) /* 读取 KEY 引脚的状态 */

KEY 是读取对应按键状态的宏定义。用 digitalRead 函数实现,该函数返回值就是 IO 口的状态, 0 或 1,代表的是低电平或高电平。
下面我们再解析 key.cpp 的程序,这里只有一个函数 key_init,这是 KEY 按键的初始化函数,其定义如下:

/**
* @brief 初始化 KEY 相关 IO 口
* @param 无
* @retval 无
*/
void key_init(void)
{
/* 结合原理图设计,按键没有按下时,KEY 引脚检测到的是高电平 */
pinMode(KEY_PIN, INPUT_PULLUP); /* 设置 key 引脚为上拉输入模式 */
}

KEY 按键的引脚设置为上拉输入模式。 默认情况,读取到的是高电平。

3.2.2 02_key.ino 代码

在 02_key.ino 里面编写如下代码:

#include "led.h"
#include "key.h"
/**
* @brief 当程序开始执行时,将调用 setup()函数,通常用来初始化变量、函数等
* @param 无
* @retval 无
*/
void setup()
{
led_init(); /* LED 初始化 */
key_init(); /* KEY 初始化 */
}
/**
* @brief 循环函数,通常放程序的主体或者需要不断刷新的语句
* @param 无
* @retval 无
*/
void loop()
{
if (KEY == 0) /* 读取 KEY 状态,如果按下 KEY */
{
delay(10);
if (KEY == 0)
{
LED(0); /* LED 引脚输出接低电平,点亮 */
}
}
else /* 读取 KEY 状态,如果 KEY 没有按下 */
{
LED(1); /* LED 引脚输出接高电平,熄灭 */
}
}

在 setup 函数中, 除了要调用 key_init 函数对 KEY 进行初始化,还要调用 led_init 对 LED进行初始化。接下来,在 loop 函数中, 当按键被按下时, 会调用 delay 函数等待 10 毫秒实现消抖作用,然后再次确认按键状态,如果按键确实被按下, 点亮 LED。 如果按键没有被按下时,就会熄灭 LED。 然后程序进入检测按键是否按下的循环中。

4. 下载验证

下载完之后, 通过 BOOT 按键来控制 LED 灯的亮灭状态。

http://www.xdnf.cn/news/175159.html

相关文章:

  • 3G大一下安卓考核题解
  • 多节点同步协同电磁频谱监测任务分配方法简要介绍
  • CDA Edit 的设计
  • 【C到Java的深度跃迁:从指针到对象,从过程到生态】第四模块·Java特性专精 —— 第十五章 泛型:类型系统的元编程革命
  • 编译原理实验 之 Tiny C语言编译程序实验 语法分析
  • 量子力学:量子通信
  • 人工智能时代的网络安全威胁
  • 全自动部署到远程服务器
  • 8.0 西门子PLC的S7通讯解析
  • 欧空局的P 波段雷达卫星即将升空
  • python pyplot 输出支持中文
  • Linux常用命令23——usermod
  • 关于堆栈指针的那些事 | bootloader 如何跳转app
  • react的 Fiber 节点的链表存储
  • 学生公寓限电模块控制柜是如何实现智能限电功能?
  • 【八股消消乐】发送请求有遇到服务不可用吗?如何解决?
  • 项目代码生成工具
  • 【技术追踪】基于扩散模型的脑图像反事实生成与异常检测(TMI-2024)
  • 【计算机视觉】CV实战项目- Four-Flower:基于TensorFlow的花朵分类实战指南
  • HarmonyOS NEXT:多设备的自由流转
  • 前端Vue项目处理跨域请求问题解决方案(后端未加cors),前端调后端
  • 深入探索Python Pandas:解锁数据分析的无限可能
  • go语言八股文(四)
  • WGS84(GPS)、火星坐标系(GCJ02)、百度地图(BD09)坐标系转换Java代码
  • 电池管理系统
  • Linux文件管理(3)
  • SpringMVC 静态资源处理 mvc:default-servlet-handler
  • 新增29个专业,科技成为未来主赛道!
  • 【机器学习驱动的智能化电池管理技术与应用】
  • 数字人接大模型第二步:实时语音同步