5692浏览
查看: 5692|回复: 5

[ESP8266/ESP32] 03-ESP32开发-ESP-IDF+VSCode-RGB-LED灯

[复制链接]
1、准备工作1.1、硬件模块
  • ESP32-WROVER-E
  • LED
1.2、软件
  • VSCode ESP开发插件
  • ESP-IDF SDK
1.3、连线
RGB LED的三个控制引脚分别连接ESP32开发板的12、14、27号引脚,简图如下:
03-ESP32开发-ESP-IDF+VSCode-RGB-LED灯图1
2、代码2.1、目标
本次要实现如下LED灯光效果:红绿蓝分别闪烁三次->红色呼吸灯->绿色呼吸灯->蓝色呼吸灯->黄色显示最亮、一半亮、最弱亮度。
2.2、步骤
(1)在VSCode中,使用ESP32插件新建项目rgbLED;
(2)在主程序文件中添加如下代码:
  1. #include "driver/ledc.h"
  2. #include "freertos/FreeRTOS.h"
  3. #include "freertos/task.h"
  4. #define LED_RED_CH      LEDC_CHANNEL_0
  5. #define LED_GREEN_CH    LEDC_CHANNEL_1
  6. #define LED_BLUE_CH     LEDC_CHANNEL_2
  7. #define LED_RED_PIN     27
  8. #define LED_GREEN_PIN   14
  9. #define LED_BLUE_PIN    12
  10. void ledc_init()
  11. {
  12.     ledc_timer_config_t ledc_timer = {
  13.         .speed_mode = LEDC_LOW_SPEED_MODE,
  14.         .timer_num = LEDC_TIMER_0,
  15.         .duty_resolution = LEDC_TIMER_13_BIT,
  16.         .freq_hz = 5000,
  17.         .clk_cfg = LEDC_AUTO_CLK
  18.     };
  19.     ESP_ERROR_CHECK(ledc_timer_config(&ledc_timer));
  20.     ledc_channel_config_t ledc_red_chan = {
  21.         .speed_mode = LEDC_LOW_SPEED_MODE,
  22.         .channel = LED_RED_CH,
  23.         .timer_sel = LEDC_TIMER_0,
  24.         .intr_type = LEDC_INTR_DISABLE,
  25.         .gpio_num = LED_RED_PIN,
  26.         .duty = 0,
  27.         .hpoint = 0
  28.     };
  29.     ESP_ERROR_CHECK(ledc_channel_config(&ledc_red_chan));
  30.     ledc_channel_config_t ledc_green_chan = {
  31.         .speed_mode = LEDC_LOW_SPEED_MODE,
  32.         .channel = LED_GREEN_CH,
  33.         .timer_sel = LEDC_TIMER_0,
  34.         .intr_type = LEDC_INTR_DISABLE,
  35.         .gpio_num = LED_GREEN_PIN,
  36.         .duty = 0,
  37.         .hpoint = 0
  38.     };
  39.     ESP_ERROR_CHECK(ledc_channel_config(&ledc_green_chan));
  40.     ledc_channel_config_t ledc_blue_chan = {
  41.         .speed_mode = LEDC_LOW_SPEED_MODE,
  42.         .channel = LED_BLUE_CH,
  43.         .timer_sel = LEDC_TIMER_0,
  44.         .intr_type = LEDC_INTR_DISABLE,
  45.         .gpio_num = LED_BLUE_PIN,
  46.         .duty = 0,
  47.         .hpoint = 0
  48.     };
  49.     ESP_ERROR_CHECK(ledc_channel_config(&ledc_blue_chan));
  50.     ledc_fade_func_install(0);
  51. }
  52. void app_main(void)
  53. {
  54.     ledc_init();
  55.     while(1){
  56.         //blink red
  57.         for(int i=0; i<3; i++){
  58.             ledc_set_duty_and_update(LEDC_LOW_SPEED_MODE,LED_RED_CH,8191,0);
  59.             vTaskDelay(400/portTICK_PERIOD_MS);
  60.             ledc_set_duty_and_update(LEDC_LOW_SPEED_MODE,LED_RED_CH,0,0);
  61.             vTaskDelay(400/portTICK_PERIOD_MS);
  62.         }
  63.         //blink green
  64.         for(int i=0; i<3; i++){
  65.             ledc_set_duty_and_update(LEDC_LOW_SPEED_MODE,LED_GREEN_CH,8191,0);
  66.             vTaskDelay(400/portTICK_PERIOD_MS);
  67.             ledc_set_duty_and_update(LEDC_LOW_SPEED_MODE,LED_GREEN_CH,0,0);
  68.             vTaskDelay(400/portTICK_PERIOD_MS);
  69.         }
  70.         //blink blue
  71.         for(int i=0; i<3; i++){
  72.             ledc_set_duty_and_update(LEDC_LOW_SPEED_MODE,LED_BLUE_CH,8191,0);
  73.             vTaskDelay(400/portTICK_PERIOD_MS);
  74.             ledc_set_duty_and_update(LEDC_LOW_SPEED_MODE,LED_BLUE_CH,0,0);
  75.             vTaskDelay(400/portTICK_PERIOD_MS);
  76.         }
  77.         //fade
  78.         ledc_set_fade_time_and_start(LEDC_LOW_SPEED_MODE,LED_RED_CH,8191,3000,LEDC_FADE_WAIT_DONE);
  79.         ledc_set_fade_time_and_start(LEDC_LOW_SPEED_MODE,LED_RED_CH,0,3000,LEDC_FADE_WAIT_DONE);
  80.         ledc_set_fade_time_and_start(LEDC_LOW_SPEED_MODE,LED_GREEN_CH,8191,3000,LEDC_FADE_WAIT_DONE);
  81.         ledc_set_fade_time_and_start(LEDC_LOW_SPEED_MODE,LED_GREEN_CH,0,3000,LEDC_FADE_WAIT_DONE);
  82.         ledc_set_fade_time_and_start(LEDC_LOW_SPEED_MODE,LED_BLUE_CH,8191,3000,LEDC_FADE_WAIT_DONE);
  83.         ledc_set_fade_time_and_start(LEDC_LOW_SPEED_MODE,LED_BLUE_CH,0,3000,LEDC_FADE_WAIT_DONE);
  84.         //yello color
  85.         ledc_set_duty_and_update(LEDC_LOW_SPEED_MODE,LED_RED_CH,8191,0);
  86.         ledc_set_duty_and_update(LEDC_LOW_SPEED_MODE,LED_GREEN_CH,8191,0);
  87.         ledc_set_duty_and_update(LEDC_LOW_SPEED_MODE,LED_BLUE_CH,0,0);
  88.         vTaskDelay(2000/portTICK_PERIOD_MS);
  89.         ledc_set_duty_and_update(LEDC_LOW_SPEED_MODE,LED_RED_CH,4095,0);
  90.         ledc_set_duty_and_update(LEDC_LOW_SPEED_MODE,LED_GREEN_CH,4095,0);
  91.         ledc_set_duty_and_update(LEDC_LOW_SPEED_MODE,LED_BLUE_CH,0,0);
  92.         vTaskDelay(2000/portTICK_PERIOD_MS);
  93.         ledc_set_duty_and_update(LEDC_LOW_SPEED_MODE,LED_RED_CH,100,0);
  94.         ledc_set_duty_and_update(LEDC_LOW_SPEED_MODE,LED_GREEN_CH,100,0);
  95.         ledc_set_duty_and_update(LEDC_LOW_SPEED_MODE,LED_BLUE_CH,0,0);
  96.         vTaskDelay(2000/portTICK_PERIOD_MS);
  97.         //close
  98.         ledc_stop(LEDC_LOW_SPEED_MODE,LED_RED_CH,0);
  99.         ledc_stop(LEDC_LOW_SPEED_MODE,LED_GREEN_CH,0);
  100.         ledc_stop(LEDC_LOW_SPEED_MODE,LED_BLUE_CH,0);
  101.         vTaskDelay(1000/portTICK_PERIOD_MS);
  102.     }
  103. }
复制代码

(3)说明:
  • ledc 控制器操作按照如下配置:
    03-ESP32开发-ESP-IDF+VSCode-RGB-LED灯图2

其配置流程为:
:one: 先使用 ledc_timer_config() 配置定时器,设置PWM频率和占空比分辨率;
:two: 再使用ledc_channel_config() 配置通道,将要控制的LED引脚与定时器配置的PWM相关联;
:three: 然后使用ledc_set_duty() 直接设置PWM占空比,或者ledc_set_fade_with_time逐渐改变占空比,以控制LED的亮度;
3、测试3.1、编译和烧录
将硬件连接好,并在VSCode中,使用命令:
idf.py build flash -p COM6
进行编译并通过串口COM6烧写。
3.2、查看效果
可以看到LED按照预期的效果显示。
3.3、波形效果
  • ledc_set_duty_and_update(LEDC_LOW_SPEED_MODE,LED_RED_CH,4095,0); 该函数设置占空比4095,而分辨率设置为13位,因此占空比为50%,其波形图如下:
    03-ESP32开发-ESP-IDF+VSCode-RGB-LED灯图3
  • ledc_set_fade_time_and_start();该函数设置占空比逐渐增加,从0到100%,其效果如下:
    03-ESP32开发-ESP-IDF+VSCode-RGB-LED灯图4
  • 视频教程:


DFSyNpOpqcN  中级技师
 楼主|

发表于 2021-10-9 20:27:32

回复

使用道具 举报

刁雷  初级技匠

发表于 2021-10-9 11:07:42

希望能有更多的esp32的教程
回复

使用道具 举报

刁雷  初级技匠

发表于 2021-10-9 11:08:04

视频教程有链接么
回复

使用道具 举报

DFSyNpOpqcN  中级技师
 楼主|

发表于 2021-10-9 20:29:21

刁雷 发表于 2021-10-9 03:07
希望能有更多的esp32的教程

先来一篇试试水,看有没有人看,MakerInChina.cn 一直都有更新的,需要的可以关注下。
回复

使用道具 举报

刁雷  初级技匠

发表于 2021-10-11 10:31:30

DFSyNpOpqcN 发表于 2021-10-9 20:29
先来一篇试试水,看有没有人看,MakerInChina.cn 一直都有更新的,需要的可以关注下。 ...

已收藏 看来感兴趣的人不是很多
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail