公司网站建设企划书,wordpress主题域名授权密钥生成,深圳跨境电商公司排行榜,免费百度广告怎么投放Arduino 入门学习笔记#xff08;五#xff09;#xff1a;KEY实验
开发板#xff1a;正点原子ESP32S3 例程源码在文章顶部可免费下载#xff08;审核中…#xff09;
1. GPIO 输入功能使用
1.1 GPIO 输入模式介绍
在上一文章中提及到 pinMode 函数#xff0c; 要对…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 灯的亮灭状态。