-
关注嘉友创科技公众号
- 源码地址:https://github.com/HX-IoT/ESP32-Developer-Guide
- ESP32开发指南QQ群:824870185,内有pdf版,排版整洁。
学习目的及目标
掌握LED灯电路设计:控制方式
掌握ESP32库函数对IO配置的相关参数设置
掌握ESP32库函数对IO控制的操作
编写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的GPIO接口介绍
设置IO模式函数:gpio_set_pull_mode();
函数原型 | esp_err_t gpio_set_pull_mode ( gpio_num_t gpio_num, gpio_pull_mode_t pull ) |
函数功能 | 设置IO模式 |
参数 | [in]gpio_num:引脚编号,0~34(存在部分) [in]pull:IO模式,可以设置: GPIO_MODE_DISABLE:不输入不输出 GPIO_MODE_INPUT:输入模式 GPIO_MODE_OUTPUT:输出模式 GPIO_MODE_OUTPUT_OD:开漏输出模式 GPIO_MODE_INPUT_OUTPUT_OD:开漏输入输出模式 GPIO_MODE_INPUT_OUTPUT:输入输出模式
|
返回值 | ESP_OK:成功 ESP_ERR_INVALID_ARG : 参数错误 |
设置IO输出值函数:gpio_set_level();
函数原型 | esp_err_t gpio_set_level ( gpio_num_t gpio_num, uint32_t level ) |
函数功能 | 设置IO输出值 |
参数 | [in]gpio_num:引脚编号,0~34(存在部分) [in]pull:IO模式,可以设置: 0:输出低 1:输出高
|
返回值 | ESP_OK:成功 ESP_ERR_INVALID_ARG : 参数错误 |
更多更详细接口请参考官方指南。
代码编写
闪灯代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | #include <stdio.h> #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "driver/gpio.h" #include "sdkconfig.h" #define LED_R_IO 2 #define LED_G_IO 18 #define LED_B_IO 19 void app_main() { //选择IO gpio_pad_select_gpio(LED_R_IO); //设置IO为输出 gpio_set_direction(LED_R_IO, GPIO_MODE_OUTPUT); while(1) { //红灯亮 gpio_set_level(LED_R_IO, 0); vTaskDelay(100 / portTICK_PERIOD_MS); //红灯灭 gpio_set_level(LED_R_IO, 1); vTaskDelay(100 / portTICK_PERIOD_MS); } } |
流水灯的源码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | void app_main() { //选择IO gpio_pad_select_gpio(LED_R_IO); gpio_pad_select_gpio(LED_G_IO); gpio_pad_select_gpio(LED_B_IO); //设置IO为输出 gpio_set_direction(LED_R_IO, GPIO_MODE_OUTPUT); gpio_set_direction(LED_G_IO, GPIO_MODE_OUTPUT); gpio_set_direction(LED_B_IO, GPIO_MODE_OUTPUT); while(1) { //只点亮红灯 gpio_set_level(LED_R_IO, 0); gpio_set_level(LED_G_IO, 1); gpio_set_level(LED_B_IO, 1); vTaskDelay(100 / portTICK_PERIOD_MS); //只点亮绿灯 gpio_set_level(LED_R_IO, 1); gpio_set_level(LED_G_IO, 0); gpio_set_level(LED_B_IO, 1); vTaskDelay(100 / portTICK_PERIOD_MS); //只点亮蓝灯 gpio_set_level(LED_R_IO, 1); gpio_set_level(LED_G_IO, 1); gpio_set_level(LED_B_IO, 0); vTaskDelay(100 / portTICK_PERIOD_MS); } } |
硬件连接
开发板默认已经连接好LED,下载程序即可,使用其他开发板需要修改程序或者修改硬件连接皆可。
效果展示
闪灯:红灯100ms取反一次
流水灯:红绿蓝100ms循环点亮
驱动LED灯总结
上面的方法是使用库函数配置GPIO,也可以使用结构体进行配置,先设置结构体参数,再使用结构体配置IO,实现功能一样。
源码地址:https://github.com/xiaolongba/wireless-tech