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.mzph.cn/news/903236.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Centos9安装docker

1. 卸载docker 查看是否安装了docker yum list | grep docker卸载老版本docker,拷贝自官网 sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine卸载新版本…

Pgvector+R2R搭建RAG知识库

背景 R2R是一个采用Python编写的开源AI RAG框架项目,与PostgreSQL技术栈集成度高,运行需求资源少(主要是本人的Macbook air m1内存只有8G)的特点,对部署本地私有化化AI RAG应用友好。 Resource Recommendations Whe…

go中redis使用的简单介绍

目录 一、Redis 简介 二、Go中Redis的使用 1. 安装Go Redis包 2. 单机模式 连接示例 3. 哨兵模式 依赖 连接示例 三、Redis集群 1. 集群模式 集群部署 部署结构 使用redis-cli创建集群 连接示例 四、常用数据结构与操作 1. 字符串(String&#xff0…

北京工业大学25计专上岸经验分享

1.个人情况介绍 本科就读于河北双非,专业为计算机科学与技术,四级三次498,六级两次460,拿过几次校级奖学金,竞赛经历有蓝桥杯国三、数学竞赛省二。本科成绩排名靠前,保研保7排8,遗憾选择考研继…

在 Ubuntu 24.04 系统上安装和管理 Nginx

1、安装Nginx 在Ubuntu 24.04系统上安装Nginx,可以按照下面的步骤进行: 1.1、 更新系统软件包列表 在安装新软件之前,需要先更新系统的软件包列表,确保获取到最新的软件包信息。打开终端,执行以下命令: …

HarmonyOS4+NEXT星河版入门与项目实战(26)-----版本控制与代码托管

引言 随着移动应用开发技术的不断进步,华为推出的鸿蒙操作系统(HarmonyOS)以及其配套的集成开发环境DevEco Studio逐渐成为开发者关注的焦点。对于新手开发者来说,掌握版本控制和代码托管不仅是提高工作效率的关键,也是团队协作的重要基础。本文将介绍如何在使用DevEco S…

利用Arcgis自己绘制shp文件

1.选择自己想要创建的shp文件的位置 我是直接创建在连接文件夹中 2.右键-新建-shp 3.设置名称、要素类型、空间参考 4、点击创建要素 5、右侧选择图层、创建面 6、开始绘制,双击任意位置结束绘制 之后可以改一下shp文件的名字

【C/C++】深入理解指针(六)

文章目录 深入理解指针(六)1.sizeof和strlen的对比1.1 sizeof1.2 strlen1.3 sizeof和strlen的对⽐ 2.数组和指针笔试题解析2.1 ⼀维数组2.2 字符数组代码1:代码2:代码3:代码4:代码5:代码6: 2.3 ⼆维数组 3.…

探索大语言模型(LLM):语言模型从海量文本中无师自通

文章目录 引言:当语言模型学会“自己教自己”一、自监督学习:从“无标签”中挖掘“有监督”信号二、语言模型的自监督训练范式:两大经典路径1. 掩码语言模型(Masked Language Modeling, MLM)——以BERT为例2. 自回归语…

2025.5.4机器学习笔记:PINN文献阅读

2025.5.4周报 文献阅读题目信息摘要创新点网络架构实验结论不足以及展望 文献阅读 题目信息 题目: Physics-Informed Neural Network Approach for Solving the One-Dimensional Unsteady Shallow-Water Equations in Riverine Systems期刊: Journal o…

Unity Post Processing 小记 【使用泛光实现灯光亮度效果】

一、前言 本篇适用于Unity 2018 - 2019及以上版本,以默认渲染管线为例。文章内容源于个人研究尝试与网络资料收集,可能存在不准确之处。初衷是因新版本制作时老的Bloom插件失效,经研究后分享开启Bloom效果的方法。若在项目中使用Post Proces…

牟乃夏《ArcGIS Engine地理信息系统开发教程》学习笔记3-地图基本操作与实战案例

目录 一、开发环境与框架搭建 二、地图数据加载与文档管理 1. 加载地图文档(MXD) 2. 动态添加数据源 三、地图浏览与交互操作 1. 基础导航功能 2. 书签管理 3. 量测功能 四、要素选择与属性查询 1. 属性查询 2. 空间查询 五、视图同步与鹰眼…

Qt指ModbusTcp协议的使用

Modbus 是一套通信“语言”(协议),而 RS485 / RS232 / TCP 是通信“管道”(物理接口)。 编写modubusTcp程序,避免不了调试,首先用到的两个工具助手 poll是主机,slave是从机。主机也就是发送数据…

探索大语言模型(LLM):自监督学习——从数据内在规律中解锁AI的“自学”密码

文章目录 自监督学习:从数据内在规律中解锁AI的“自学”密码一、自监督学习的技术内核:用数据“自问自答”1. 语言建模:预测下一个单词2. 掩码语言模型(MLM):填补文本空缺3. 句子顺序预测(SOP&a…

CentOS7.9安装Python 3.10.11并包含OpenSSL1.1.1t

1. 安装编译 Python 所需的依赖包 yum -y install gcc make zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel libffi-devel wget2. 安装 OpenSSL 1.1.1 或更新版本 (自定义路径安装的 OpenSSL 1.1.1 不会影响系统原有的…

qt事件过滤与传递机制

当点击 QLabel 时,正常情况下并不会直接触发 MyWidget 的 mousePressEvent 函数,原因在于事件的传递机制和事件过滤器的存在。下面详细分析这个过程: 事件传递机制 在 Qt 里,事件的传递是从子控件往父控件冒泡的。不过&#xff…

ubuntu 安装ollama后,如何让外网访问?

官网下载linux版本:https://ollama.com/download/linux 1、一键安装和运行 curl -fsSL https://ollama.com/install.sh | sh 2、下载和启动deepseek-r1大模型 ollama run deepseek-r1 这种方式的ollama是systemd形式的服务,会随即启动。默认开启了 …

kotlin与MVVM结合使用总结(三)

1. MVVM 架构详细介绍及源码层面理解 整体架构 MVVM(Model - View - ViewModel)架构是为了解决视图和数据模型之间的耦合问题而设计的。它通过引入 ViewModel 作为中间层,实现了视图和数据的分离,提高了代码的可维护性和可测试性…

A系统使用iframe嵌套B系统时登录跨域问题!

我这边两个项目都是独立的,问题是做了跨域配置之后点击登录接口调用成功但是页面没有跳转进去 显示以下报错 这个错误明确指出了问题的核心原因:由于跨站点Cookie设置未正确声明SameSiteNone,导致浏览器拦截了Cookie。这是现代浏览器&#x…

消息唯一ID算法参考

VUE // src/utils/idGenerator.js/*** 雪花算法风格的 ID 生成器**//*** 前缀 w代表web端,m代表手机端**/ const DEFAULT_PREFIX = w; const DEFAULT_TOTAL_LENGTH = 16; const CHARS