日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ESP32 + ESP-IDF |GPIO 03 - 定时器轮询按钮的状态,控制LED亮或者灭

發布時間:2025/3/15 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ESP32 + ESP-IDF |GPIO 03 - 定时器轮询按钮的状态,控制LED亮或者灭 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、前言


前面兩個章節使用了GPIO的輸出功能,本章節介紹如何使用ESP32上GPIO的輸入功能。

通過一個簡單的實驗來學習這個功能:

1、開啟一個定時器(上一章節學習了),定時器以每100ms的周期來輪詢gpio26的電平(按鈕被按下 = 電平0,按鈕沒有被按下 = 電平1)。

2、當按鈕被按下時,gpio27輸出電平0,讓led亮起來。當按鈕沒有被按下時,gpio27輸出電平1,讓led熄滅了。

實驗視頻:

ESP-IDF打印出來的信息:

這個實驗的代碼只是演示GPIO的輸入功能,并不能用于實際項目上,在實際的項目上應該加上軟件濾波的代碼。

二、VSCODE + ESP-IDF


2.1、快速創建項目

按照第一章節的方式創建一個sample_project的模版。

2.2、選擇串口通道,ESP芯片型號

還是按照第一章節的方式來選擇串口通道與ESP芯片信號

三、電路



1、gpio26設置輸出模式,當gpio26設置電平0時,led燈亮起來。反之,LED就熄滅了。
2、gpio27設置輸入模式與設置上拉模式,當按鈕按下時,gpio27被拉至電平0。反之,gpio27被內部電阻上拉至電平1。

四、代碼


4.1、頭文件


跟上一章節一樣。

4.2、全局變量


增加一個變量buttom_state,用于保存按鈕的狀態。

4.3、app_main( )函數

  • 函數gpio_set_direction( )將gpio27設置為輸入模式。
  • 函數gpio_set_pull_mode( )將gpio27設置為上拉模式。

4.4、定時器回調函數

  • 函數gpio_set_level( )獲取gpio27的電平狀態。

4.5、實驗代碼

#include <stdio.h> #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "driver/gpio.h" #include "esp_log.h" #include "esp_timer.h"/* 定時器1回調函數 */ void timer1_Callback(void *arg); /* 用于保存按鈕的狀態 */ uint16_t buttom_state = 0; static const char *TAG = "a buttom contorl a LED"; static esp_timer_handle_t timer1_handler; /* 定時器1的句柄 *//* 定時器1的參數 */ static esp_timer_create_args_t timer_Once_Obj = {.name = "Timer_NUM_1", /* 定時器的名稱 */.arg = NULL, /* 傳遞給回調函數的參數 */.callback = &timer1_Callback, /* 回調函數 */ };void app_main(void) {ESP_LOGI(TAG, "Example configured to blink GPIO LED!");/* 復位GPIO的狀態 */gpio_reset_pin(26);gpio_reset_pin(27);/* 設置GPIO27為輸入模式 */gpio_set_direction(27,GPIO_MODE_INPUT);/* 設置GPIO27為上拉模式 */gpio_set_pull_mode(27,GPIO_PULLUP_ONLY);/* 設置GPIO26為輸出模式 */gpio_set_direction(26,GPIO_MODE_OUTPUT);/* 初始化定時器 */esp_timer_init(); /* 創建定時器1 */esp_timer_create(&timer_Once_Obj,&timer1_handler);/* 啟動定時器1(周期性) */esp_timer_start_periodic(timer1_handler,100 * 1000);while(1){vTaskDelay(300 / portTICK_PERIOD_MS); /* 延時300ms */}}/* 定時器1回調函數 */ void timer1_Callback(void *arg) {buttom_state = gpio_get_level(27); /* 獲取gpio的電平狀態,gpio=0時,表示按鈕被按下,gpio=1時,表示按鈕沒有被按下 */ESP_LOGI(TAG, "the state of buttom is %d",buttom_state);/* 如果按鈕被按下,LED亮起來 */if(0 == buttom_state)gpio_set_level(26,0);/* 否則LED熄滅 */elsegpio_set_level(26,1); }

五、相關API


5.1、gpio_set_direction( )

5.2、gpio_set_pull_mode( )

5.3、gpio_get_level( )

總結

以上是生活随笔為你收集整理的ESP32 + ESP-IDF |GPIO 03 - 定时器轮询按钮的状态,控制LED亮或者灭的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。