開發板購買鏈接
https://item.taobao.com/item.htm?spm=a2oq0.12575281.0.0.50111deb2Ij1As&ft=t&id=626366733674
開發板簡介
開發環境搭建 windows
原始碼示例:
0_Hello Bug (ESP_LOGX與printf) 工程模板/列印除錯輸出
1_LED LED亮滅控制
2_LED_Task 使用任務方式控制LED
3_LEDC_PWM 使用LEDC來控制LED實作呼吸燈效果
4_ADC_LightR 使用ADC讀取光敏電阻實作光照傳感
5_KEY_Short_Long 按鈕長按短按實作
6_TouchPad_Interrupt 電容觸摸中斷實作
7_WS2812_RMT RGB_LED彩虹變色示例
8_DHT11_RMT 使用RMT實作讀取DHT11溫濕度傳感器
9_SPI_SDCard 使用SPI總線實作TF卡檔案系統示例
10_IIC_ADXL345 使用IIC總線實作讀取ADXL345角度加速度傳感器
11_IIC_AT24C02 使用IIC總線實作小容量資料儲存測驗
12_IR_Rev_RMT 使用RMT實作紅外遙控接收掃碼(NEC)
13_IR_Send_RMT 使用RMT實作紅外資料發送(NEC)
14_WIFI_Scan 附近WIFI信號掃描示例
15_WIFI_AP 創建軟AP示例
16_WIFI_AP_TCP_Server 在軟AP模式下實作TCP服務端
17_WIFI_AP_TCP_Client 在軟AP模式下實作TCP客戶端
18_WIFI_AP_UDP 在軟AP模式下實作UDP通訊
19_WIFI_STA 創建STA站模
20_WIFI_STA_TCP_Server 在站模式STA下實作TCP服務端
21_WIFI_STA_TCP_Client 在站模式STA下實作TCP客戶端
22_WIFI_STA_UDP 在站模式STA下實作UDP通訊
23_LVGL_Test LVGL圖形庫簡單示例
一、硬體設計/原理
按鈕處理,學過51或STM32的應該都會,簡單的while(1)檢測消抖,高級點設定中斷消抖,標記檢測時間計算時長判斷長按短按,這種方法比較常用,ESP32框架庫采用的是FREERTOS,可以利用GPIO的上升下降沿觸發中斷做一個回呼事件,更高級一點,可以更深入去了解ESP32框架庫的使用,
查看開發板原理圖,開發板一共兩個按鈕,一個重啟模塊,一個BOOT按鈕即下載引導按鈕,程式運行程序中BOOT按鈕也可以用作普通按鈕,

二、程式設計
先參考必要頭檔案
// KEY_Short_Long Example
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/queue.h"
#include "driver/gpio.h"
#include "esp_system.h"
#include "esp_log.h"
#include "F:/ESP32/ESP_IDF/esp-idf-v4.2/components/newlib/platform_include/time.h"
定義一個列舉型別
// 定義按下按鈕列舉型別
typedef enum {
KEY_SHORT_PRESS = 1,
KEY_LONG_PRESS,
} alink_key_t;
定義按鈕的GPIO號
#define KEY_GPIO 0 //按鈕連接的GPIO,這里使用BOOT引腳GPIO0
先看主函式,創建一個按鈕處理的任務
// 主函式
void app_main() {
ESP_LOGI(TAG, "APP Start......");
xTaskCreate(key_trigger_Task, "key_trigger_Task", 1024 * 2, NULL, 10, NULL);
}
任務處理函式
// 按鍵中斷任務
void key_trigger_Task(void *arg) {
esp_err_t ret = 0;
KeyInit(KEY_GPIO);
while (1) {
ret = alink_key_scan(portMAX_DELAY);
if (ret == -1)
vTaskDelete(NULL);
switch (ret) {
case KEY_SHORT_PRESS:
ESP_LOGI(TAG,"Button Short Down\r\n");
break;
case KEY_LONG_PRESS:
ESP_LOGI(TAG,"Button Long Down\r\n");
break;
default:
break;
}
}
vTaskDelete(NULL);
}
任務中死回圈檢測按鈕中斷事件和記錄時間點
檢測按鈕中斷事件函式
// 按鍵掃描函式,任務中呼叫
esp_err_t alink_key_scan(TickType_t ticks_to_wait)
{
uint32_t io_num;
BaseType_t press_key = pdFALSE;
BaseType_t release_key = pdFALSE;
int backup_time = 0;
while (1) {
// 接收從訊息佇列發來的訊息
xQueueReceive(gpio_evt_queue, &io_num, ticks_to_wait);
if (gpio_get_level(io_num) == 0) {//當前低電平,記錄下用戶按下按鍵的時間點
press_key = pdTRUE;
backup_time = esp_timer_get_time();
//如果當前GPIO口的電平已經記錄為按下,則開始減去上次按下按鍵的時間點
} else if (press_key) {
//記錄抬升時間點
release_key = pdTRUE;
backup_time = esp_timer_get_time() - backup_time;
}
//近當按下標志位和按鍵彈起標志位都為1時候,才執行回呼
if (press_key & release_key) {
press_key = pdFALSE;
release_key = pdFALSE;
//如果大于1s則回呼長按,否則就短按回呼
if (backup_time > 1000000) {
return KEY_LONG_PRESS;
} else {
return KEY_SHORT_PRESS;
}
}
}
}
不要忘了初始化GPIO和中斷處理函式,這里要把按鈕IO配置為上升下降都觸發中斷
// GPIO中斷處理函式
void IRAM_ATTR gpio_isr_handler(void *arg) {
uint32_t gpio_num = (uint32_t) arg;
xQueueSendFromISR(gpio_evt_queue, &gpio_num, NULL);
}
// 按鍵GPIO初始化
void KeyInit(uint32_t key_gpio_pin) {
//配置GPIO結構體
gpio_config_t io_conf;
io_conf.intr_type = GPIO_INTR_ANYEDGE; // 下降沿和上升沿觸發中斷
io_conf.pin_bit_mask = 1 << key_gpio_pin; // 設定GPIO號
io_conf.mode = GPIO_MODE_INPUT; // 模式輸入
io_conf.pull_up_en = GPIO_PULLUP_ENABLE; // 埠上拉使能
gpio_config(&io_conf);
// 設定GPIO中斷型別
gpio_set_intr_type(key_gpio_pin, GPIO_INTR_ANYEDGE);// 下降沿和上升沿觸發中斷
// 初始化GPIO事件佇列
gpio_evt_queue = xQueueCreate(2, sizeof(uint32_t));
// 安裝GPIO中斷服務
gpio_install_isr_service(0);
// 添加GPIO中斷事件回呼函式
gpio_isr_handler_add(key_gpio_pin, gpio_isr_handler, (void *) key_gpio_pin);
}
三、下載測驗
打開ESP-IDF Command Prompt
cd命令進入此工程目錄
cd F:\ESP32_DevBoard_File\5_KEY_Short_Long
查看電腦設備管理器中開發板的串口號

執行idf.py -p COM9 flash monitor從串口9下載并運行打開口顯示設備除錯資訊 Ctrl+c退出運行
長按和短按開發板上的BOOT按鈕,查看串口列印資訊

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/3255.html
標籤:其他
