首页 > 其他分享 >微雪ESP32-S3-Zreo学习笔记之WS2812

微雪ESP32-S3-Zreo学习笔记之WS2812

时间:2024-01-25 19:12:34浏览次数:38  
标签:微雪 led ESP S3 ESP32 rgb strip include uint32

板载WS2812

板载1颗WS2812连接IO21

软件下载

  1. ESP32-S3-Zero没有板载USB转串口,无法实现自动下载。
  2. 下载软件时要按住Boot按键再上电,此时电脑会识别到一个USB模拟的COM口,可用于下载软件。

开发环境

编程环境是使用的esp-idf-4.4.2;

安装esp-idf-5.0.2、esp-idf-5.1.2都不能正常使用。

参考教程

https://www.bilibili.com/video/BV1jC4y1W7CZ/?vd_source=916baa0bb6d7382ed550867f84a7d155

参考例程

参考例程是"led_strip"

例程存储路径"ESP-IDF\Espressif\frameworks\esp-idf-v4.4.2\examples\peripherals\rmt\led_strip"

代码

/* USB Example

   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.
*/

// DESCRIPTION:
// This example contains minimal code to make ESP32-S2 based device
// recognizable by USB-host devices as a USB Serial Device printing output from
// the application.

#include <stdio.h>
#include <stdlib.h>
#include <sys/reent.h>
#include "esp_log.h"
#include "esp_vfs.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "tinyusb.h"
#include "tusb_cdc_acm.h"
#include "tusb_console.h"
#include "sdkconfig.h"
#include "esp_err.h"

#include "esp_log.h"
#include "driver/rmt.h"
#include "led_strip.h"

static const char *TAG = "Main";
static const char *HelloTAG = "Hello";
static const char *WS2812TAG = "WS2812";

#define RMT_TX_CHANNEL RMT_CHANNEL_0

#define EXAMPLE_CHASE_SPEED_MS (10)
#define MY_CONFIG_EXAMPLE_RMT_TX_GPIO			(21)
#define MY_CONFIG_EXAMPLE_STRIP_LED_NUMBER		(1)

/**
 * @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;
    }
}

static void ws2812_task(void *arg)
{
    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(MY_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(MY_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(WS2812TAG, "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(WS2812TAG, "LED Rainbow Chase Start");
    while (true) {
        for (int i = 0; i < 3; i++) {
            for (int j = i; j < MY_CONFIG_EXAMPLE_STRIP_LED_NUMBER; j += 3) {
                // Build RGB values
                hue = j * 360 / MY_CONFIG_EXAMPLE_STRIP_LED_NUMBER + start_rgb;
                led_strip_hsv2rgb(hue, 100, 30, &red, &green, &blue);/*param1:色调;param2:饱和度;param3:明度;*/
                // 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(200 / portTICK_PERIOD_MS);
            //vTaskDelay(pdMS_TO_TICKS(EXAMPLE_CHASE_SPEED_MS));
            strip->clear(strip, 50);
			vTaskDelay(200 / portTICK_PERIOD_MS);
            //vTaskDelay(pdMS_TO_TICKS(EXAMPLE_CHASE_SPEED_MS));
        }
        start_rgb += 20;
    }
}

static void hello_task(void *arg)
{
	static int cnt = 0;
	ESP_LOGI(HelloTAG, "Enter hello task.");
    while (1) {
		if(cnt % 2){
			ESP_LOGI(HelloTAG, "Odd num : %d.",cnt);
		}
		else{
			ESP_LOGI(HelloTAG, "Even num : %d.",cnt);
		}
        if(cnt >= 0xFFFFFFFF){
            cnt = 0;
        }
        else{
            cnt++;
        }
        vTaskDelay(2000 / portTICK_PERIOD_MS);
    }
}

void app_main(void)
{
    /* Setting TinyUSB up */
    tinyusb_config_t tusb_cfg = { 0 }; // the configuration uses default values
    ESP_ERROR_CHECK(tinyusb_driver_install(&tusb_cfg));
    tinyusb_config_cdcacm_t amc_cfg = { 0 }; // the configuration uses default values
    ESP_ERROR_CHECK(tusb_cdc_acm_init(&amc_cfg));
	esp_tusb_init_console(TINYUSB_CDC_ACM_0); // log to usb
	
	vTaskDelay(2000 / portTICK_PERIOD_MS);
	
	ESP_LOGI(TAG, "APP Version 1.00");
	ESP_LOGI(TAG, "USB initialization DONE");
	xTaskCreatePinnedToCore(hello_task, "stats", 4096, NULL, 3, NULL, tskNO_AFFINITY);/*启动hello_task*/
	xTaskCreatePinnedToCore(ws2812_task, "stats", 4096, NULL, 3, NULL, tskNO_AFFINITY);/*启动ws2812_task*/
    while (1) {
        ESP_LOGI(TAG, "log -> USB");
        vTaskDelay(1000 / portTICK_PERIOD_MS);
        fprintf(stdout, "example: print -> stdout\n");
        vTaskDelay(1000 / portTICK_PERIOD_MS);
        fprintf(stderr, "example: print -> stderr\n");
        vTaskDelay(1000 / portTICK_PERIOD_MS);
    }
}

编译错误

  1. 找不到头文件led_strip.h,文件路径"ESP-IDF\Espressif\frameworks\esp-idf-v4.4.2\components\tinyusb\tinyusb\hw\bsp\esp32s3\components\led_strip\include",将该路径下的led_strip.h文件复制到新工程main文件夹下
  2. 未定义的led_strip_new_rmt_ws2812,找不到这个函数的定义,经查找该函数定义在led_strip_rmt_ws2812.c中,该文件路径"E:\Setup\ESP-IDF\Espressif\frameworks\esp-idf-v4.4.2\components\tinyusb\tinyusb\hw\bsp\esp32s3\components\led_strip\src",将该路径下的led_strip_rmt_ws2812.c文件复制到新工程main文件夹下,修改main文件夹下的CMakeLists.txt添加led_strip_rmt_ws2812.c

现象

  1. 软件下载完毕后,按下reset按键,电脑会重新识别USB模拟的串口,因此串口号可能会改变;

  2. 连接串口后,可以看到相应的打印信息;

  3. RGB彩灯闪烁;

标签:微雪,led,ESP,S3,ESP32,rgb,strip,include,uint32
From: https://www.cnblogs.com/baiyh5329/p/17987952

相关文章

  • ESP32-S3 通过USB Serial更新固件
    本文主要介绍ESP32-S3在ubuntu20.04下通过ESP32-S3的USBSerial更新固件的方法以及遇到的问题的解决方法。现在市面上ESP32-S3的开发板,大多都是ESP32-S3搭配一个USB-To-Serial桥芯片(CP210X、CH340等)来使用,硬件上再设计一个自动烧录电路(如下所示),以达到通过串口实现固件更新的......
  • NanoFramework操作ESP32(一)_基础元器件篇(二十二)_DHT11温湿度传感器
    一、元器件介绍1、针脚用途编号名称功能1VCC电源正2TRIG触发控制信号输入3ECHO回响信号输出4GND电源地2、电气参数 二、示例代码1、代码:元器件的针脚ESP32模块的针脚VCC;供电脚+5VTRIG;发送脚IO17ECHO;接收脚IO16GND......
  • 微雪ESP32-S3-Zreo学习笔记之USB串口
    软件下载ESP32-S3-Zero没有板载USB转串口,无法实现自动下载。下载软件时要按住Boot按键再上电,此时电脑会识别到一个USB模拟的COM口,可用于下载软件。开发环境编程环境是使用的esp-idf-4.4.2;值得注意的是在此之前安装了esp-idf-5.0.2、esp-idf-5.1.2都不能正常使用,安装好后使......
  • 无涯教程-CSS3 - 用户界面
    用户界面属性允许您将任何元素更改为几个标准用户界面元素之一。CSS3用户界面中使用的一些常用属性。Sr.No.Value&Remark1appearance用于允许用户将元素制作为用户界面元素。2box-sizing允许用户以清晰的方式将元素固定在区域上。3icon用于在区域上提供图标。......
  • 无涯教程-CSS3 - 多列布局
    CSS3可以将文本内容设计成像报纸一样的多列布局。一些最常用的多列属性,如下所示-Sr.No.Value&Remark1column-count 指定元素应该被分割的列数。2column-fill指定如何填充列3column-gap 指定列与列之间的间隙4column-rule所有column-rule-*属性的简......
  • 无涯教程-CSS3 - 字体属性(Font)
    Web字体用于允许CSS中的字体,这些字体未在本地系统上安装。Sr.No.Font&Remark1TrueTypeFonts(TTF)TrueType是Apple和Microsoft在1980年代后期开发的轮廓字体标准,它成为Windows和MAC操作系统最常用的字体。2OpenTypeFonts(OTF)OpenType是Microsoft开发的可缩放计......
  • 无涯教程-CSS3 - 渐变属性(Gradients)
    渐变显示两种或更多种颜色的组合,如下所示-线性渐变线性渐变用于以线性格式(如从上到下)排列两种或多种颜色。Toptobottom(从上到下)<html><head><style>#grad1{height:100px;background:-webkit-linear-gradient(pink,......
  • 无涯教程-CSS3 - 颜色属性(Color)
    CSS3支持以下其他颜色属性-RGBA颜色HSL颜色HSLA颜色Opacity透明RGBA代表RedGreenBlueAlpha。它是CSS2的扩展,Alpha指定颜色的透明度,参数是0.0到1.0之间的数字。RGBA的示例语法如下所示-#d1{background-color:rgba(255,0,0,0.5);}#d2{background-colo......
  • 无涯教程-CSS3 - boarder-image属性
    CSSBorderimage属性用于向某些元素添加图像边界。边界图像的示例语法如下-#borderimg{border:10pxsolidtransparent;padding:15px;}最常用的值如下所示-Sr.No.Value&Remark1border-image-source用于设置图像路径2border-image-slice用于切片边......
  • 无涯教程-CSS3 - border-radius属性
    CSS3圆角用于通过使用border-radius 属性为正文或文本添加特殊的彩色圆角,语法如下-#rcorners7{border-radius:60px/15px;background:#FF0000;padding:20px;width:200px;height:150px;}下表显示了圆角的可能值,如下所示:Sr.No.Value&Remark1......