-
關注嘉友創科技公衆号
- 源碼位址:https://github.com/HX-IoT/ESP32-Developer-Guide
- ESP32開發指南QQ群:824870185,内有pdf版,排版整潔。
學習目的及目标
- 掌握LED燈電路設計:控制方式
- 掌握ESP32定時器的庫函數
- 編寫LED閃爍燈程式
硬體設計及原理
本實驗闆連接配接了一個 RGB彩燈,RGB彩燈實際上由三盞分别為紅色、綠色、藍色的 LED 燈組成,通過控制 RGB顔色強度的組合,可以混合出各種色彩,此章隻學習如何開關,調色放在PWM章學習。
這些 LED 燈的陰極都是通過0歐姆電阻連接配接到ESP32的 GPIO引腳,隻要我們控制 GPIO引腳的電平輸出狀态,即可控制 LED 燈的亮滅。圖中去掉0歐姆電阻,可以切斷和單片機的連接配接,釋放這個GPIO。3個LED燈占用ESP32的引腳如下:
LED标号 | LED顔色 | 接至ESP32的引腳 |
LP2A | 紅色 | IO2 |
LP2B | 綠色 | IO18 |
LP2C | 藍色 | IO19 |
若您使用的實驗闆 LED 燈的連接配接方式或引腳不一樣,隻需根據我們的工程修改引腳即可,程式的控制原理相同。
軟體設計
代碼邏輯
ESP32的軟定時器接口介紹
建立定時器函數:esp_timer_create();
函數原型 | esp_err_t esp_timer_create ( const esp_timer_create_args_t* create_args, esp_timer_handle_t* out_handle ) |
函數功能 | 建立定時器函數 |
參數 | [in]create_args:定時器結構體 typedef struct { esp_timer_cb_t callback; //定時器時間到回調 void* arg; //要傳入回調的參數 esp_timer_dispatch_t dispatch_method; //從任務或ISR調用回調 const char* name; //定時器名稱,esp_timer_dump函數使用 } esp_timer_create_args_t; [in]out_handle:定時器句柄 |
傳回值 | ESP_OK:成功 ESP_ERR_INVALID_ARG : 參數錯誤 ESP_ERR_INVALID_STATE:定時器已經運作 |
啟動單次定時器函數:esp_timer_start_once();基本同下
啟動周期定時器函數:esp_timer_start_periodic();
函數原型 | esp_err_t esp_timer_start_periodic ( esp_timer_handle_t timer, uint64_t period ) |
函數功能 | 啟動周期定時器 |
參數 | [in]timer:定時器句柄 [in]period:定時周期,機關微秒,1000表示1ms |
傳回值 | ESP_OK:成功 ESP_ERR_INVALID_ARG : 參數錯誤 ESP_ERR_INVALID_STATE:定時器已經運作 |
停止定時器函數:esp_timer_stop();
函數原型 | esp_err_t esp_timer_stop ( esp_timer_handle_t timer ); |
函數功能 | 停止定時器 |
參數 | [in]timer:定時器句柄 |
傳回值 | ESP_OK:成功 ESP_ERR_INVALID_STATE:定時器已經停止 |
删除定時器函數:esp_timer_delete();
函數原型 | esp_err_t esp_timer_delete ( esp_timer_handle_t timer ); |
函數功能 | 删除定時器 |
參數 | [in]gpio_num:引腳編号,0~34(存在部分) [in]pull:IO模式,可以設定: 0:輸出低 1:輸出高 |
傳回值 | ESP_OK:成功 ESP_ERR_INVALID_ARG : 參數錯誤 |
擷取定時器時間函數:esp_timer_get_time();
函數原型 | int64_t esp_timer_get_time() |
函數功能 | 設定IO輸出值 |
參數 | none |
傳回值 | 自調用esp計時器init以來的微秒數(通常在應用程式啟動的早期發生) |
更多更詳細接口請參考官方指南。
代碼編寫
定時器配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | void app_main() { //選擇IO gpio_pad_select_gpio(LED_R_IO); //設定IO為輸出 gpio_set_direction(LED_R_IO, GPIO_MODE_OUTPUT); //定時器結構體初始化 esp_timer_create_args_t fw_timer = { .callback = &fw_timer_cb, //回調函數 .arg = NULL, //參數 .name = "fw_timer" //定時器名稱 }; //定時器建立、啟動 esp_err_t err = esp_timer_create(&fw_timer, &fw_timer_handle); err = esp_timer_start_periodic(fw_timer_handle, 1000 * 1000);//1秒回調 if(err == ESP_OK) { printf("fw timer cteate and start ok!\r\n"); } } |
定時器回調函數
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | void fw_timer_cb(void *arg) { //擷取時間戳 int64_t tick = esp_timer_get_time(); printf("timer cnt = %lld \r\n", tick); if (tick > 50000000) //50秒結束 { //定時器暫停、删除 esp_timer_stop(fw_timer_handle); esp_timer_delete(fw_timer_handle); printf("timer stop and delete!!! \r\n"); //重新開機 esp_restart(); } gpio_set_level(LED_R_IO, 0); vTaskDelay(100 / portTICK_PERIOD_MS); gpio_set_level(LED_R_IO, 1); vTaskDelay(100 / portTICK_PERIOD_MS); } |
硬體連接配接
開發闆預設已經連接配接好LED,下載下傳程式即可,使用其他開發闆需要修改程式或者修改硬體連接配接皆可。
效果展示
紅燈1000ms閃一次
定時器總結
主要學習ESP32軟定時器的使用,方法很簡單。建立》開始》回調,可擷取時間,也可以停止》暫停。
源碼位址:https://github.com/HX-IoT/ESP32-Developer-Guide