ESP32 + ESP-IDF |GPIO 03 - 定时器轮询按钮的状态,控制LED亮或者灭
生活随笔
收集整理的這篇文章主要介紹了
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亮或者灭的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php输出excel表格乱码和第一个0不
- 下一篇: JQuery和php方面的填空题,PHP