当前位置: 首页 > 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 灯的亮灭状态。

相关文章:

  • PTA -L1-005 考试座位号
  • WPF-遵循MVVM框架创建图表的显示【保姆级】
  • SpringCloud核心组件Eureka菜鸟教程
  • LaTex、pdfLaTex、XeLaTex和luaLaTex的区别和联系
  • Docker常见命令
  • 关于指针和指针算术
  • 开发常使用的团队协作工具
  • 再谈从视频中学习:从给视频打字幕的Humanoid-X、UH-1到首个人形VLA Humanoid-VLA:迈向整合第一人称视角的通用人形控制
  • 文本向量化
  • FastAPI + Redis Pub/Sub + WebSocket 组合解决方案的详细介绍
  • Redis01-基础-入门
  • 信创系统 sudoers 权限配置实战!从小白到高手
  • 引领印尼 Web3 变革:Mandala Chain 如何助力 1 亿用户迈向数字未来?
  • 刀客独家 | 潘胜接管百度移动生态市场部
  • 【Linux】Centos7 在 Docker 上安装 mysql8.0(最新详细教程)
  • 【嘉立创EDA】如何在更新或转换原理图到PCB时,保留已有布局器件
  • QML中的色彩应用
  • .dep 和.rpm有什么区别?
  • 马哥教育Linux云计算运维课程
  • 统信操作系统使用默认yum源安装 Docker 的踩坑
  • 程璧“自由生长”,刘卓辉“被旋律牵着走”
  • 公交公司须关注新出行需求:“单车巴士”能否常态化
  • 楼下电瓶车起火老夫妻逃生时被烧伤,消防解析躲火避烟注意事项
  • 青年如何打破“千人一面”,创造属于自己的文化观?
  • 蜀道考古调查阶段性成果发布,新发现文物遗存297处
  • 双拥主题歌曲MV:爱我人民,爱我军