-
关注嘉友创科技公众号
- 源码地址: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