YD-ESP32-S3-WS2812/README.md

6.7 KiB
Raw Permalink Blame History

WS2812简介

WS2812是一种智能集成LED光源它在5050封装内集成有控制电路和RGB芯片形成完整像素点控制¹。WS2812的级联控制协议非常简单通过一根信号线就可以进行串行异步信号发送¹。并不是高电平就能点亮的东东!!!!!!

WS2812的控制主要基于以下几个方面

  1. 工作电压根据WS2812的数据手册它的工作电压范围在输入信号电压在工作电压VDD±0.5V范围内¹。

  2. 控制协议WS2812的级联控制协议非常简单。通过一根信号线就可以进行串行异步信号发送。在串行通讯中使用不同高低电平脉冲表示数据0,1编码¹。

  3. RGB参数每个RGB灯都有256亮度级别可以形成中颜色刷新频率不低于400Hz¹。

  4. SPI控制利用硬件SPI控制WS2812的显示。使用了高频三极管9018作为输出接口反向器确定合适的电阻参数验证了驱动方案的硬件和软件的可行性¹。

  5. STM32 HAL SPI控制使用STM32 HAL SPI控制WS2812 (B) LED可选用DMA²。

  6. Arduino控制利用arduino控制灯带包括库下载、示例演示和自己编写代码³。

以上就是对WS2812控制的简单介绍希望对你有所帮助。如果你需要更详细的信息可以查阅相关的手册或者教程。

在Arduino环境中使用ESP32控制WS2812

安装FastLED库。你可以在Arduino IDE的库管理器中搜索并安装它。使用以下的示例代码

#include "FastLED.h"

#define NUM_LEDS 1 // LED灯珠数量
#define DATA_PIN 48 // Arduino输出控制信号引脚 根据需要修改 38 16 8等
#define LED_TYPE WS2812 // LED灯环型号
#define COLOR_ORDER GRB // RGB灯珠中红色、绿色、蓝色LED的排列顺序

uint8_t max_bright = 128; // LED亮度控制变量可使用数值为 0  255 数值越大则光带亮度越高
CRGB leds[NUM_LEDS]; // 建立灯带leds
char i= 0; //led灯的点亮序号

void setup() {
  LEDS.addLeds<LED_TYPE, DATA_PIN, COLOR_ORDER>(leds, NUM_LEDS); // 初始化灯带
  FastLED.setBrightness(max_bright); // 设置灯带亮度
}

void loop() {
  if (i == NUM_LEDS) {
    i = 0;
  }
  leds[i] = CRGB::Red; // i= 0 设置灯带中第一个灯珠颜色为红色leds[0]为第一个灯珠leds[1]为第二个灯珠
  FastLED.show(); // 更新LED色彩
  delay(50); // 等待500毫秒
  leds[i] = CRGB::Black; // 设置灯带中第一个灯珠熄灭
  FastLED.show(); // 更新LED色彩
  delay(50); // 等待500毫秒
  i++;
}

这段代码会使LED灯珠按顺序点亮并熄灭形成一个流动的红色光点。你可以根据需要修改这段代码实现不同的效果。

注意这段代码中的DATA_PIN定义了Arduino的输出控制信号引脚你需要将其连接到LED灯环的DI端。NUM_LEDS定义了LED灯珠的数量你需要根据实际的LED灯珠数量进行修改1。此外你还需要确保你的电源可以提供足够的电流来驱动所有的LED灯珠。如果电流不足可能会导致颜色失真或其他问题。

使用PlatformIO编写的简单代码用于控制ESP32-S3点亮WS2812

这个代码将使WS2812 LED显示红色。

#include <Adafruit_NeoPixel.h>

#define PIN        48 //  根据需要修改  38 16 8
#define NUMPIXELS  1

Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);

void setup() {
  pixels.begin();
}

void loop() {
  pixels.setPixelColor(0, pixels.Color(255,0,0)); // 红色
  pixels.show();
  delay(1000);
}

在这段代码中我们首先包含了Adafruit_NeoPixel库这是一个用于控制像WS2812这样的RGB LED的库。然后我们定义了连接到WS2812的引脚在这里是引脚15以及我们要控制的像素数量在这里是1

在setup()函数中我们初始化了像素对象。在loop()函数中,我们将像素设置为红色,然后显示它,然后等待一秒。

使用micropython编写的简单代码用于控制ESP32-S3点亮WS2812

这是一段测试W2812的Micropython代码

from machine import Pin
from neopixel import NeoPixel

pin = Pin(48, Pin.OUT)#ESP32-S3 48PIN ESP32-C3 8PIN ESP32 16PIN ESP32-S2 18PIN
np = NeoPixel(pin, 1)   
np[0] = (10,0,0) #R B G max 255 255 255
np.write()              
r, g, b = np[0]

使用IDF编写的简单代码用于控制ESP32-S3点亮WS2812

以下是一个使用ESP-IDF开发环境的ESP32-S3控制WS2812的示例程序

#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"
#include "esp_system.h"

#define LED_NUM 8 // WS2812灯的数量
#define LED_GPIO 48 // WS2812数据输入引脚号根据需要修改
#define LED_COLOR_NUM 3 // 每个WS2812 LED的三个颜色通道数

// WS2812灯的颜色数组
uint8_t led_color[LED_NUM][LED_COLOR_NUM] = {
    {255, 0, 0}, // 红色
    {0, 255, 0}, // 绿色
    {0, 0, 255}, // 蓝色
    {255, 255, 0}, // 黄色
    {0, 255, 255}, // 青色
    {255, 0, 255}, // 紫色
    {255, 255, 255}, // 白色
    {0, 0, 0} // 关闭
};

// 将颜色值转换为占空比
uint32_t color_to_duty(uint8_t color) {
    if (color == 0) {
        return 21;
    } else if (color == 255) {
        return 76;
    } else {
        return (uint32_t)(21 + (color * 0.147));
    }
}

// 更新WS2812灯的颜色
void update_led_color() {
    uint8_t data[LED_NUM * LED_COLOR_NUM];
    for (int i = 0; i < LED_NUM; i++) {
        uint32_t r_duty = color_to_duty(led_color[i][0]);
        uint32_t g_duty = color_to_duty(led_color[i][1]);
        uint32_t b_duty = color_to_duty(led_color[i][2]);

        // 将RGB颜色值转换为占空比
        for (int j = 0; j < 8; j++) {
            data[(i * 24) + j] = (g_duty >> (7 - j)) & 0x01;
            data[(i * 24) + 8 + j] = (r_duty >> (7 - j)) & 0x01;
            data[(i * 24) + 16 + j] = (b_duty >> (7 - j)) & 0x01;
        }
    }

    // 发送WS2812数据
    gpio_set_direction(LED_GPIO, GPIO_MODE_OUTPUT);
    for (int i = 0; i < LED_NUM * LED_COLOR_NUM; i++) {
        if (data[i] == 1) {
            gpio_set_level(LED_GPIO, 1);
            ets_delay_us(0.7);
            gpio_set_level(LED_GPIO, 0);
            ets_delay_us(0.35);
        } else {
            gpio_set_level(LED_GPIO, 1);
            ets_delay_us(0.35);
            gpio_set_level(LED_GPIO, 0);
            ets_delay_us(0.7);
        }
    }
}

void app_main() {
    while (1) {
        // 更新WS2812灯的颜色
        update_led_color();
        // 延时100毫秒
        vTaskDelay(100 / portTICK_PERIOD_MS);
    }
}

这个程序使用了一个简单的算法将颜色值转换为占空比然后通过GPIO控制WS2812灯的数据输入引脚。请注意这个程序可能需要根据你的硬件环境进行适当的修改。如果你使用的是Arduino环境你可能需要使用FastLED库。