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.pswp.cn/news/903236.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/903236.shtml
英文地址,請注明出處:http://en.pswp.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