上传文件至 /
commit
159ee68664
|
@ -0,0 +1,181 @@
|
||||||
|
## 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的库管理器中搜索并安装它。使用以下的示例代码:
|
||||||
|
```bash
|
||||||
|
#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的示例程序:
|
||||||
|
|
||||||
|
```c
|
||||||
|
#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库。
|
Loading…
Reference in New Issue