mirror of
https://github.com/espressif/esp-idf.git
synced 2024-10-05 20:47:46 -04:00
117 lines
3.3 KiB
C
117 lines
3.3 KiB
C
|
/* RMT example -- RGB LED Strip
|
||
|
|
||
|
This example code is in the Public Domain (or CC0 licensed, at your option.)
|
||
|
|
||
|
Unless required by applicable law or agreed to in writing, this
|
||
|
software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
|
||
|
CONDITIONS OF ANY KIND, either express or implied.
|
||
|
*/
|
||
|
#include "sdkconfig.h"
|
||
|
#include "freertos/FreeRTOS.h"
|
||
|
#include "freertos/task.h"
|
||
|
#include "esp_log.h"
|
||
|
#include "driver/rmt.h"
|
||
|
#include "led_strip.h"
|
||
|
|
||
|
static const char *TAG = "example";
|
||
|
|
||
|
#define RMT_TX_CHANNEL RMT_CHANNEL_0
|
||
|
|
||
|
#define EXAMPLE_CHASE_SPEED_MS (10)
|
||
|
|
||
|
/**
|
||
|
* @brief Simple helper function, converting HSV color space to RGB color space
|
||
|
*
|
||
|
* Wiki: https://en.wikipedia.org/wiki/HSL_and_HSV
|
||
|
*
|
||
|
*/
|
||
|
void led_strip_hsv2rgb(uint32_t h, uint32_t s, uint32_t v, uint32_t *r, uint32_t *g, uint32_t *b)
|
||
|
{
|
||
|
h %= 360; // h -> [0,360]
|
||
|
uint32_t rgb_max = v * 2.55f;
|
||
|
uint32_t rgb_min = rgb_max * (100 - s) / 100.0f;
|
||
|
|
||
|
uint32_t i = h / 60;
|
||
|
uint32_t diff = h % 60;
|
||
|
|
||
|
// RGB adjustment amount by hue
|
||
|
uint32_t rgb_adj = (rgb_max - rgb_min) * diff / 60;
|
||
|
|
||
|
switch (i) {
|
||
|
case 0:
|
||
|
*r = rgb_max;
|
||
|
*g = rgb_min + rgb_adj;
|
||
|
*b = rgb_min;
|
||
|
break;
|
||
|
case 1:
|
||
|
*r = rgb_max - rgb_adj;
|
||
|
*g = rgb_max;
|
||
|
*b = rgb_min;
|
||
|
break;
|
||
|
case 2:
|
||
|
*r = rgb_min;
|
||
|
*g = rgb_max;
|
||
|
*b = rgb_min + rgb_adj;
|
||
|
break;
|
||
|
case 3:
|
||
|
*r = rgb_min;
|
||
|
*g = rgb_max - rgb_adj;
|
||
|
*b = rgb_max;
|
||
|
break;
|
||
|
case 4:
|
||
|
*r = rgb_min + rgb_adj;
|
||
|
*g = rgb_min;
|
||
|
*b = rgb_max;
|
||
|
break;
|
||
|
default:
|
||
|
*r = rgb_max;
|
||
|
*g = rgb_min;
|
||
|
*b = rgb_max - rgb_adj;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void app_main(void)
|
||
|
{
|
||
|
uint32_t red = 0;
|
||
|
uint32_t green = 0;
|
||
|
uint32_t blue = 0;
|
||
|
uint16_t hue = 0;
|
||
|
uint16_t start_rgb = 0;
|
||
|
|
||
|
rmt_config_t config = RMT_DEFAULT_CONFIG_TX(CONFIG_EXAMPLE_RMT_TX_GPIO, RMT_TX_CHANNEL);
|
||
|
// set counter clock to 40MHz
|
||
|
config.clk_div = 2;
|
||
|
|
||
|
ESP_ERROR_CHECK(rmt_config(&config));
|
||
|
ESP_ERROR_CHECK(rmt_driver_install(config.channel, 0, 0));
|
||
|
|
||
|
// install ws2812 driver
|
||
|
led_strip_config_t strip_config = LED_STRIP_DEFAULT_CONFIG(CONFIG_EXAMPLE_STRIP_LED_NUMBER, (led_strip_dev_t)config.channel);
|
||
|
led_strip_t *strip = led_strip_new_rmt_ws2812(&strip_config);
|
||
|
if (!strip) {
|
||
|
ESP_LOGE(TAG, "install WS2812 driver failed");
|
||
|
}
|
||
|
// Clear LED strip (turn off all LEDs)
|
||
|
ESP_ERROR_CHECK(strip->clear(strip, 100));
|
||
|
// Show simple rainbow chasing pattern
|
||
|
ESP_LOGI(TAG, "LED Rainbow Chase Start");
|
||
|
while (true) {
|
||
|
for (int i = 0; i < 3; i++) {
|
||
|
for (int j = i; j < CONFIG_EXAMPLE_STRIP_LED_NUMBER; j += 3) {
|
||
|
// Build RGB values
|
||
|
hue = j * 360 / CONFIG_EXAMPLE_STRIP_LED_NUMBER + start_rgb;
|
||
|
led_strip_hsv2rgb(hue, 100, 100, &red, &green, &blue);
|
||
|
// Write RGB values to strip driver
|
||
|
ESP_ERROR_CHECK(strip->set_pixel(strip, j, red, green, blue));
|
||
|
}
|
||
|
// Flush RGB values to LEDs
|
||
|
ESP_ERROR_CHECK(strip->refresh(strip, 100));
|
||
|
vTaskDelay(pdMS_TO_TICKS(EXAMPLE_CHASE_SPEED_MS));
|
||
|
strip->clear(strip, 50);
|
||
|
vTaskDelay(pdMS_TO_TICKS(EXAMPLE_CHASE_SPEED_MS));
|
||
|
}
|
||
|
start_rgb += 60;
|
||
|
}
|
||
|
}
|