03-ESP32开发-ESP-IDF+VSCode-RGB-LED

使用ESP-IDF开发方式控制RGB LED灯。

1、准备工作
1.1、硬件模块
  • ESP32-WROVER-E
  • LED
1.2、软件
  • VSCode ESP开发插件
  • ESP-IDF SDK
1.3、连线

RGB LED的三个控制引脚分别连接ESP32开发板的12、14、27号引脚,简图如下:

在这里插入图片描述

2、代码
2.1、目标

本次要实现如下LED灯光效果:红绿蓝分别闪烁三次->红色呼吸灯->绿色呼吸灯->蓝色呼吸灯->黄色显示最亮、一半亮、最弱亮度。

2.2、步骤

(1)在VSCode中,使用ESP32插件新建项目rgbLED;

(2)在主程序文件中添加如下代码:

#include "driver/ledc.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"

#define LED_RED_CH      LEDC_CHANNEL_0
#define LED_GREEN_CH    LEDC_CHANNEL_1
#define LED_BLUE_CH     LEDC_CHANNEL_2

#define LED_RED_PIN     27
#define LED_GREEN_PIN   14
#define LED_BLUE_PIN    12

void ledc_init()
{

    ledc_timer_config_t ledc_timer = {
        .speed_mode = LEDC_LOW_SPEED_MODE,
        .timer_num = LEDC_TIMER_0,
        .duty_resolution = LEDC_TIMER_13_BIT,
        .freq_hz = 5000,
        .clk_cfg = LEDC_AUTO_CLK
    };

    ESP_ERROR_CHECK(ledc_timer_config(&ledc_timer));

    ledc_channel_config_t ledc_red_chan = {
        .speed_mode = LEDC_LOW_SPEED_MODE,
        .channel = LED_RED_CH,
        .timer_sel = LEDC_TIMER_0,
        .intr_type = LEDC_INTR_DISABLE,
        .gpio_num = LED_RED_PIN,
        .duty = 0,
        .hpoint = 0
    };
    ESP_ERROR_CHECK(ledc_channel_config(&ledc_red_chan));

    ledc_channel_config_t ledc_green_chan = {
        .speed_mode = LEDC_LOW_SPEED_MODE,
        .channel = LED_GREEN_CH,
        .timer_sel = LEDC_TIMER_0,
        .intr_type = LEDC_INTR_DISABLE,
        .gpio_num = LED_GREEN_PIN,
        .duty = 0,
        .hpoint = 0
    };
    ESP_ERROR_CHECK(ledc_channel_config(&ledc_green_chan));

    ledc_channel_config_t ledc_blue_chan = {
        .speed_mode = LEDC_LOW_SPEED_MODE,
        .channel = LED_BLUE_CH,
        .timer_sel = LEDC_TIMER_0,
        .intr_type = LEDC_INTR_DISABLE,
        .gpio_num = LED_BLUE_PIN,
        .duty = 0,
        .hpoint = 0
    };
    ESP_ERROR_CHECK(ledc_channel_config(&ledc_blue_chan));

    ledc_fade_func_install(0);
}

void app_main(void)
{

    ledc_init();

    while(1){

        //blink red
        for(int i=0; i<3; i++){
            ledc_set_duty_and_update(LEDC_LOW_SPEED_MODE,LED_RED_CH,8191,0);
            vTaskDelay(400/portTICK_PERIOD_MS);
            ledc_set_duty_and_update(LEDC_LOW_SPEED_MODE,LED_RED_CH,0,0);
            vTaskDelay(400/portTICK_PERIOD_MS);
        }

        //blink green
        for(int i=0; i<3; i++){
            ledc_set_duty_and_update(LEDC_LOW_SPEED_MODE,LED_GREEN_CH,8191,0);
            vTaskDelay(400/portTICK_PERIOD_MS);
            ledc_set_duty_and_update(LEDC_LOW_SPEED_MODE,LED_GREEN_CH,0,0);
            vTaskDelay(400/portTICK_PERIOD_MS);
        }

        //blink blue
        for(int i=0; i<3; i++){
            ledc_set_duty_and_update(LEDC_LOW_SPEED_MODE,LED_BLUE_CH,8191,0);
            vTaskDelay(400/portTICK_PERIOD_MS);
            ledc_set_duty_and_update(LEDC_LOW_SPEED_MODE,LED_BLUE_CH,0,0);
            vTaskDelay(400/portTICK_PERIOD_MS);
        }

        //fade
        ledc_set_fade_time_and_start(LEDC_LOW_SPEED_MODE,LED_RED_CH,8191,3000,LEDC_FADE_WAIT_DONE);
        ledc_set_fade_time_and_start(LEDC_LOW_SPEED_MODE,LED_RED_CH,0,3000,LEDC_FADE_WAIT_DONE);

        ledc_set_fade_time_and_start(LEDC_LOW_SPEED_MODE,LED_GREEN_CH,8191,3000,LEDC_FADE_WAIT_DONE);
        ledc_set_fade_time_and_start(LEDC_LOW_SPEED_MODE,LED_GREEN_CH,0,3000,LEDC_FADE_WAIT_DONE);

        ledc_set_fade_time_and_start(LEDC_LOW_SPEED_MODE,LED_BLUE_CH,8191,3000,LEDC_FADE_WAIT_DONE);
        ledc_set_fade_time_and_start(LEDC_LOW_SPEED_MODE,LED_BLUE_CH,0,3000,LEDC_FADE_WAIT_DONE);

        //yello color
        ledc_set_duty_and_update(LEDC_LOW_SPEED_MODE,LED_RED_CH,8191,0);
        ledc_set_duty_and_update(LEDC_LOW_SPEED_MODE,LED_GREEN_CH,8191,0);
        ledc_set_duty_and_update(LEDC_LOW_SPEED_MODE,LED_BLUE_CH,0,0);
        vTaskDelay(2000/portTICK_PERIOD_MS);

        ledc_set_duty_and_update(LEDC_LOW_SPEED_MODE,LED_RED_CH,4095,0);
        ledc_set_duty_and_update(LEDC_LOW_SPEED_MODE,LED_GREEN_CH,4095,0);
        ledc_set_duty_and_update(LEDC_LOW_SPEED_MODE,LED_BLUE_CH,0,0);
        vTaskDelay(2000/portTICK_PERIOD_MS);

        ledc_set_duty_and_update(LEDC_LOW_SPEED_MODE,LED_RED_CH,100,0);
        ledc_set_duty_and_update(LEDC_LOW_SPEED_MODE,LED_GREEN_CH,100,0);
        ledc_set_duty_and_update(LEDC_LOW_SPEED_MODE,LED_BLUE_CH,0,0);
        vTaskDelay(2000/portTICK_PERIOD_MS);

        //close
        ledc_stop(LEDC_LOW_SPEED_MODE,LED_RED_CH,0);
        ledc_stop(LEDC_LOW_SPEED_MODE,LED_GREEN_CH,0);
        ledc_stop(LEDC_LOW_SPEED_MODE,LED_BLUE_CH,0);
        vTaskDelay(1000/portTICK_PERIOD_MS);

    }
}

(3)说明:

  • ledc 控制器操作按照如下配置:

Key Settings of LED PWM Controller's API

其配置流程为:

1️⃣ 先使用 ledc_timer_config() 配置定时器,设置PWM频率和占空比分辨率;

2️⃣ 再使用ledc_channel_config() 配置通道,将要控制的LED引脚与定时器配置的PWM相关联;

3️⃣ 然后使用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%,其波形图如下:

image-20210925133531531

  • ledc_set_fade_time_and_start();该函数设置占空比逐渐增加,从0到100%,其效果如下:

在这里插入图片描述

  • 视频教程:

https://makerinchina.cn/esp32%e5%bc%80%e5%8f%91-esp-idfvscode-rgb-led/

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ESP-IDF进入相机配置,可以通过以下步骤: 1. 首先,需要在工程配置文件 `sdkconfig` 打开相机驱动选项,将 `CONFIG_ESP32_CAMERA_SUPPORT` 选项设置为 `y`。 2. 接下来,在代码包含相机驱动头文件 `esp_camera.h`,并初始化相机驱动。初始化相机驱动需要先配置相机参数,包括分辨率、像素格式、帧率等。可以通过 `esp_camera_init` 函数来实现。 3. 配置完相机参数后,可以通过 `esp_camera_fb_get` 函数获取相机帧缓存。获取到的帧缓存可以通过 `esp_camera_fb_return` 函数释放。 4. 获取到相机帧缓存后,就可以对图像进行处理或者传输了。 下面是一个简单的示例代码: ``` #include "esp_camera.h" void app_main() { // 初始化相机驱动 camera_config_t config = { .pin_pwdn = -1, .pin_reset = -1, .pin_xclk = 4, .pin_sscb_sda = 18, .pin_sscb_scl = 19, .pin_d7 = 36, .pin_d6 = 37, .pin_d5 = 38, .pin_d4 = 39, .pin_d3 = 35, .pin_d2 = 34, .pin_d1 = 33, .pin_d0 = 32, .pin_vsync = 25, .pin_href = 23, .pin_pclk = 22, .xclk_freq_hz = 20000000, .ledc_timer = LEDC_TIMER_0, .ledc_channel = LEDC_CHANNEL_0, .pixel_format = PIXFORMAT_JPEG, .frame_size = FRAMESIZE_QVGA, .jpeg_quality = 12, .fb_count = 1 }; esp_err_t err = esp_camera_init(&config); if (err != ESP_OK) { printf("Camera init failed with error 0x%x\n", err); return; } // 获取相机帧缓存 camera_fb_t *fb = esp_camera_fb_get(); if (!fb) { printf("Camera capture failed\n"); return; } // 对图像进行处理或者传输 // ... // 释放相机帧缓存 esp_camera_fb_return(fb); } ``` 需要注意的是,不同的相机模块可能需要不同的引脚配置和参数设置,具体可以参考相应的文档。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值