ESP32用SDK创建用LED PWM控制器实现的RGB七彩渐变程序
时间: 2024-05-12 08:20:49 浏览: 13
以下是ESP32用SDK创建用LED PWM控制器实现的RGB七彩渐变程序的示例代码:
```c
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"
#include "driver/ledc.h"
#define RED_PIN 25
#define GREEN_PIN 26
#define BLUE_PIN 27
#define LEDC_CH_NUM 3
#define LEDC_FREQ_HZ 5000
#define LEDC_RESOLUTION 8
void led_pwm_init()
{
ledc_timer_config_t timer_conf;
timer_conf.duty_resolution = LEDC_RESOLUTION;
timer_conf.freq_hz = LEDC_FREQ_HZ;
timer_conf.speed_mode = LEDC_HIGH_SPEED_MODE;
timer_conf.timer_num = LEDC_TIMER_0;
ledc_timer_config(&timer_conf);
ledc_channel_config_t ch_conf[LEDC_CH_NUM];
ch_conf[0].channel = LEDC_CHANNEL_0;
ch_conf[0].duty = 0;
ch_conf[0].gpio_num = RED_PIN;
ch_conf[0].speed_mode = LEDC_HIGH_SPEED_MODE;
ch_conf[0].timer_sel = LEDC_TIMER_0;
ch_conf[1].channel = LEDC_CHANNEL_1;
ch_conf[1].duty = 0;
ch_conf[1].gpio_num = GREEN_PIN;
ch_conf[1].speed_mode = LEDC_HIGH_SPEED_MODE;
ch_conf[1].timer_sel = LEDC_TIMER_0;
ch_conf[2].channel = LEDC_CHANNEL_2;
ch_conf[2].duty = 0;
ch_conf[2].gpio_num = BLUE_PIN;
ch_conf[2].speed_mode = LEDC_HIGH_SPEED_MODE;
ch_conf[2].timer_sel = LEDC_TIMER_0;
for (int i = 0; i < LEDC_CH_NUM; i++) {
ledc_channel_config(&ch_conf[i]);
}
}
void rgb_fade()
{
int step = 5;
int r = 255, g = 0, b = 0;
while (1) {
for (int i = 0; i < 51; i++) {
ledc_set_duty(LEDC_HIGH_SPEED_MODE, LEDC_CHANNEL_0, r);
ledc_update_duty(LEDC_HIGH_SPEED_MODE, LEDC_CHANNEL_0);
ledc_set_duty(LEDC_HIGH_SPEED_MODE, LEDC_CHANNEL_1, g);
ledc_update_duty(LEDC_HIGH_SPEED_MODE, LEDC_CHANNEL_1);
ledc_set_duty(LEDC_HIGH_SPEED_MODE, LEDC_CHANNEL_2, b);
ledc_update_duty(LEDC_HIGH_SPEED_MODE, LEDC_CHANNEL_2);
vTaskDelay(20 / portTICK_PERIOD_MS);
r -= step;
g += step;
}
for (int i = 0; i < 51; i++) {
ledc_set_duty(LEDC_HIGH_SPEED_MODE, LEDC_CHANNEL_0, r);
ledc_update_duty(LEDC_HIGH_SPEED_MODE, LEDC_CHANNEL_0);
ledc_set_duty(LEDC_HIGH_SPEED_MODE, LEDC_CHANNEL_1, g);
ledc_update_duty(LEDC_HIGH_SPEED_MODE, LEDC_CHANNEL_1);
ledc_set_duty(LEDC_HIGH_SPEED_MODE, LEDC_CHANNEL_2, b);
ledc_update_duty(LEDC_HIGH_SPEED_MODE, LEDC_CHANNEL_2);
vTaskDelay(20 / portTICK_PERIOD_MS);
g -= step;
b += step;
}
for (int i = 0; i < 51; i++) {
ledc_set_duty(LEDC_HIGH_SPEED_MODE, LEDC_CHANNEL_0, r);
ledc_update_duty(LEDC_HIGH_SPEED_MODE, LEDC_CHANNEL_0);
ledc_set_duty(LEDC_HIGH_SPEED_MODE, LEDC_CHANNEL_1, g);
ledc_update_duty(LEDC_HIGH_SPEED_MODE, LEDC_CHANNEL_1);
ledc_set_duty(LEDC_HIGH_SPEED_MODE, LEDC_CHANNEL_2, b);
ledc_update_duty(LEDC_HIGH_SPEED_MODE, LEDC_CHANNEL_2);
vTaskDelay(20 / portTICK_PERIOD_MS);
r += step;
b -= step;
}
}
}
void app_main()
{
led_pwm_init();
xTaskCreate(rgb_fade, "rgb_fade", 2048, NULL, 5, NULL);
}
```
这个程序实现了一个RGB七彩渐变效果。首先,我们使用`led_pwm_init()`函数初始化三个LED PWM通道,分别对应红、绿、蓝三个颜色。然后,我们使用`rgb_fade()`函数实现RGB七彩渐变效果。在这个函数中,我们使用三个变量`r`、`g`、`b`来代表红、绿、蓝三个颜色的亮度,使用`step`变量代表每次变化的步长。在每次循环中,我们先对红色进行减少、绿色进行增加,然后对绿色进行减少、蓝色进行增加,最后对红色进行增加、蓝色进行减少,这样就实现了一个RGB七彩渐变效果。在每次变化后,我们使用`ledc_set_duty()`函数和`ledc_update_duty()`函数来更新三个LED PWM通道的亮度,然后使用`vTaskDelay()`函数来等待一段时间,以实现比较平滑的变化效果。最后,我们在`app_main()`函数中创建一个任务来运行`rgb_fade()`函数。