stm32单片机控制ws2812 灯
时间: 2023-09-01 13:02:13 浏览: 91
stm32单片机可以通过其内部的GPIO引脚控制ws2812灯。ws2812灯是一种基于Neopixel的RGB LED,它可以通过一根串行数据线进行控制。控制ws2812灯的主要方法包括通过发送特定的序列来控制灯的亮度、颜色和模式。
在stm32单片机上,我们可以选择一个合适的GPIO引脚,并将其设置为输出模式。然后,我们可以使用stm32的硬件定时器和中断来确保产生正确的时间序列来控制ws2812灯。
在控制ws2812灯时,我们需要生成适当的时序信号。通常,ws2812灯使用高电平信号表示逻辑1,低电平信号表示逻辑0。我们可以使用定时器来产生相应的时序信号,并设置适当的时间间隔以确保正确的数据传输。
在代码实现上,我们需要确定每个像素的RGB值,并将其编码为一个24位的数据。然后,我们将数据逐位传输到ws2812灯上,通过控制数据引脚的电平来发送数据。发送数据的速率和时序要满足ws2812灯的要求。
使用stm32单片机控制ws2812灯可以实现各种灯光效果,比如颜色渐变、闪烁、呼吸等。可以根据具体需求编写相应的代码来实现特定的灯光效果。
总结起来,通过使用stm32单片机的GPIO引脚、定时器和中断,我们可以控制ws2812灯的亮度、颜色和模式。这样我们就可以实现各种有趣的灯光效果,并为我们的项目增添视觉效果。
相关问题
基于stm32单片机的ws2812b跑马灯代码
以下是基于STM32单片机的WS2812B跑马灯代码:
```c
#include "stm32f10x.h"
#include "delay.h"
#define LED_NUM 60 //WS2812B灯珠个数
#define HIGH 80 //高电平时间,单位us(根据自己的实际情况调整)
#define LOW 35 //低电平时间,单位us(根据自己的实际情况调整)
uint8_t led_data[LED_NUM*3]={0}; //存储WS2812B数据的数组
/*发送一个WS2812B数据*/
void ws2812b_send(uint8_t data)
{
for(uint8_t i=0;i<8;i++)
{
if((data<<i)&0x80)
{
GPIO_SetBits(GPIOA,GPIO_Pin_5); //输出高电平
delay_us(HIGH);
GPIO_ResetBits(GPIOA,GPIO_Pin_5); //输出低电平
delay_us(LOW);
}
else
{
GPIO_SetBits(GPIOA,GPIO_Pin_5); //输出高电平
delay_us(LOW);
GPIO_ResetBits(GPIOA,GPIO_Pin_5); //输出低电平
delay_us(HIGH);
}
}
}
/*发送一个WS2812B灯珠的数据*/
void ws2812b_send_led(uint8_t r,uint8_t g,uint8_t b)
{
ws2812b_send(g); //先发送G数据
ws2812b_send(r); //再发送R数据
ws2812b_send(b); //最后发送B数据
}
/*初始化WS2812B灯珠*/
void ws2812b_init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
int main()
{
ws2812b_init(); //初始化WS2812B灯珠
while(1)
{
/*跑马灯效果,不断循环*/
for(uint8_t i=0;i<LED_NUM;i++)
{
for(uint8_t j=0;j<LED_NUM;j++)
{
led_data[j*3]=0;
led_data[j*3+1]=0;
led_data[j*3+2]=0;
}
led_data[i*3]=255;
ws2812b_send_led(led_data[i*3],led_data[i*3+1],led_data[i*3+2]);
delay_ms(100); //延时100ms
}
}
}
```
这段代码通过STM32单片机控制WS2812B灯珠实现了跑马灯效果。首先需要定义WS2812B灯珠的个数、高电平时间和低电平时间,然后定义一个数组来存储WS2812B数据。发送一个WS2812B数据的函数中,通过移位运算和位运算来实现数据的发送。发送一个WS2812B灯珠的数据的函数中,先发送G数据,再发送R数据,最后发送B数据。初始化函数中,需要初始化GPIO口为输出模式。在主函数中,通过循环实现跑马灯效果,即不断循环发送WS2812B数据。需要注意的是,由于WS2812B灯珠的驱动电流较大,因此需要外接电源进行供电。
来一套基于STM32单片机控制WS2812实现10种灯光效果的代码
好的,以下是基于STM32单片机控制WS2812实现10种灯光效果的代码,仅供参考:
```
#include "stm32f10x.h"
/*********** WS2812灯带控制IO口配置 ***********/
#define WS2812_GPIO_PORT GPIOB
#define WS2812_GPIO_PIN GPIO_Pin_0
/*********** WS2812灯带控制参数配置 ***********/
#define LED_NUM 10 // 灯珠数量
#define COLOR_NUM 3 // 颜色数量
#define LED_TOTAL (LED_NUM * COLOR_NUM) // 灯总数
#define RESET_TIME 300 // 重置时间(单位:us)
/*********** 颜色定义 ***********/
#define RED 0xFF0000 // 红色
#define GREEN 0x00FF00 // 绿色
#define BLUE 0x0000FF // 蓝色
#define YELLOW 0xFFFF00 // 黄色
#define MAGENTA 0xFF00FF // 品红
#define CYAN 0x00FFFF // 青色
#define WHITE 0xFFFFFF // 白色
#define BLACK 0x000000 // 黑色
/*********** 函数声明 ***********/
void delay_us(uint32_t us);
void WS2812_SendData(uint32_t data);
void WS2812_SendColor(uint32_t color);
void WS2812_SendDataArray(uint32_t *array, uint16_t len);
void WS2812_SetAllColor(uint32_t color);
void WS2812_Rainbow();
void WS2812_FadeInOut(uint32_t c, uint8_t wait);
void WS2812_TheaterChaseRainbow(uint8_t wait);
void WS2812_RainbowCycle(uint8_t wait);
void WS2812_TheaterChase(uint32_t c, uint8_t wait);
/*********** 主函数 ***********/
int main(void)
{
uint32_t color;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); // 使能GPIOB时钟
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = WS2812_GPIO_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(WS2812_GPIO_PORT, &GPIO_InitStructure); // 配置GPIO口
while (1)
{
WS2812_SetAllColor(RED); // 灯带全亮红色
delay_us(RESET_TIME); // 重置时间
WS2812_SetAllColor(GREEN); // 灯带全亮绿色
delay_us(RESET_TIME); // 重置时间
WS2812_SetAllColor(BLUE); // 灯带全亮蓝色
delay_us(RESET_TIME); // 重置时间
color = YELLOW;
WS2812_FadeInOut(color, 50); // 呼吸黄色
WS2812_FadeInOut(color, 50);
WS2812_FadeInOut(color, 50);
WS2812_Rainbow(); // 彩虹效果
color = CYAN;
WS2812_TheaterChase(color, 50); // 彩虹跑道
color = MAGENTA;
WS2812_TheaterChase(color, 50);
color = YELLOW;
WS2812_TheaterChase(color, 50);
WS2812_RainbowCycle(20); // 彩虹循环
WS2812_TheaterChaseRainbow(50); // 彩虹跑道
}
}
/*********** 延时函数 ***********/
void delay_us(uint32_t us)
{
while(us--)
{
__NOP();
__NOP();
}
}
/*********** 发送数据函数 ***********/
void WS2812_SendData(uint32_t data)
{
uint8_t i;
for(i = 0; i < 24; i++)
{
if(data & 0x800000)
{
WS2812_GPIO_PORT->BSRR = WS2812_GPIO_PIN;
delay_us(0.7);
WS2812_GPIO_PORT->BRR = WS2812_GPIO_PIN;
delay_us(0.6);
}
else
{
WS2812_GPIO_PORT->BSRR = WS2812_GPIO_PIN;
delay_us(0.35);
WS2812_GPIO_PORT->BRR = WS2812_GPIO_PIN;
delay_us(0.8);
}
data <<= 1;
}
}
/*********** 发送颜色函数 ***********/
void WS2812_SendColor(uint32_t color)
{
uint8_t i;
for(i = 0; i < 8; i++)
{
if(color & 0x80)
{
WS2812_GPIO_PORT->BSRR = WS2812_GPIO_PIN;
delay_us(0.7);
WS2812_GPIO_PORT->BRR = WS2812_GPIO_PIN;
delay_us(0.6);
}
else
{
WS2812_GPIO_PORT->BSRR = WS2812_GPIO_PIN;
delay_us(0.35);
WS2812_GPIO_PORT->BRR = WS2812_GPIO_PIN;
delay_us(0.8);
}
color <<= 1;
}
}
/*********** 发送数据数组函数 ***********/
void WS2812_SendDataArray(uint32_t *array, uint16_t len)
{
uint16_t i;
for(i = 0; i < len; i++)
{
WS2812_SendColor(array[i]);
}
}
/*********** 设置所有灯珠颜色函数 ***********/
void WS2812_SetAllColor(uint32_t color)
{
uint32_t array[LED_TOTAL];
uint16_t i;
for(i = 0; i < LED_NUM; i++)
{
array[i * COLOR_NUM] = color;
array[i * COLOR_NUM + 1] = color;
array[i * COLOR_NUM + 2] = color;
}
WS2812_SendDataArray(array, LED_TOTAL);
}
/*********** 彩虹效果函数 ***********/
void WS2812_Rainbow()
{
uint32_t array[LED_TOTAL];
uint16_t i, j;
uint8_t r, g, b;
for(j = 0; j < 256; j++) // hue
{
for(i = 0; i < LED_NUM; i++)
{
HsvToRgb(j, 255, 255, &r, &g, &b);
array[i * COLOR_NUM] = (uint32_t)g << 16 | (uint32_t)r << 8 | b;
HsvToRgb(j + 128, 255, 255, &r, &g, &b);
array[i * COLOR_NUM + 1] = (uint32_t)g << 16 | (uint32_t)r << 8 | b;
HsvToRgb(j + 64, 255, 255, &r, &g, &b);
array[i * COLOR_NUM + 2] = (uint32_t)g << 16 | (uint32_t)r << 8 | b;
}
WS2812_SendDataArray(array, LED_TOTAL);
delay_us(20000);
}
}
/*********** 呼吸效果函数 ***********/
void WS2812_FadeInOut(uint32_t c, uint8_t wait)
{
uint8_t r, g, b;
uint16_t i, j;
for(j = 0; j < 256; j++)
{
r = (c & 0xFF0000) >> 16;
g = (c & 0x00FF00) >> 8;
b = (c & 0x0000FF);
for(i = 0; i < LED_NUM; i++)
{
WS2812_SendColor(((uint32_t)r * j / 255) << 16 | ((uint32_t)g * j / 255) << 8 | ((uint32_t)b * j / 255));
}
delay_us(wait * 1000 / 256);
}
for(j = 255; j > 0; j--)
{
r = (c & 0xFF0000) >> 16;
g = (c & 0x00FF00) >> 8;
b = (c & 0x0000FF);
for(i = 0; i < LED_NUM; i++)
{
WS2812_SendColor(((uint32_t)r * j / 255) << 16 | ((uint32_t)g * j / 255) << 8 | ((uint32_t)b * j / 255));
}
delay_us(wait * 1000 / 256);
}
}
/*********** 彩虹跑道函数 ***********/
void WS2812_TheaterChaseRainbow(uint8_t wait)
{
uint32_t array[LED_TOTAL];
uint16_t i, j;
uint8_t r, g, b;
for(j = 0; j < 256; j++) // hue
{
for(i = 0; i < LED_NUM; i += 3)
{
HsvToRgb(j, 255, 255, &r, &g, &b);
array[i] = (uint32_t)g << 16 | (uint32_t)r << 8 | b;
HsvToRgb(j + 128, 255, 255, &r, &g, &b);
array[i + 1] = (uint32_t)g << 16 | (uint32_t)r << 8 | b;
HsvToRgb(j + 64, 255, 255, &r, &g, &b);
array[i + 2] = (uint32_t)g << 16 | (uint32_t)r << 8 | b;
}
WS2812_SendDataArray(array, LED_TOTAL);
delay_us(wait * 1000);
}
}
/*********** 彩虹循环函数 ***********/
void WS2812_RainbowCycle(uint8_t wait)
{
uint32_t array[LED_TOTAL];
uint16_t i, j;
uint8_t r, g, b;
for(j = 0; j < 256 * 5; j++) // 5 cycles of all colors on wheel
{
for(i = 0; i < LED_NUM; i++)
{
HsvToRgb(((i * 256 / LED_NUM) + j) & 255, 255, 255, &r, &g, &b);
array[i * COLOR_NUM] = (uint32_t)g << 16 | (uint32_t)r << 8 | b;
HsvToRgb(((i * 256 / LED_NUM) + j + 128) & 255, 255, 255, &r, &g, &b);
array[i * COLOR_NUM + 1] = (uint32_t)g << 16 | (uint32_t)r << 8 | b;
HsvToRgb(((i * 256 / LED_NUM) + j + 64) & 255, 255, 255, &r, &g, &b);
array[i * COLOR_NUM + 2] = (uint32_t)g << 16 | (uint32_t)r << 8 | b;
}
WS2812_SendDataArray(array, LED_TOTAL);
delay_us(wait * 1000);
}
}
/*********** 彩虹跑道函数 ***********/
void WS2812_TheaterChase(uint32_t c, uint8_t wait)
{
uint32_t array[LED_TOTAL];
uint16_t i, j;
for(j = 0; j < 10; j++) // do 10 cycles of chasing
{
for(i = 0; i < LED_NUM; i += 3)
{
array[i * COLOR_NUM] = c;
array[i * COLOR_NUM + 1] = c;
array[i * COLOR_NUM + 2] = c;
}
WS2812_SendDataArray(array, LED_TOTAL);
delay_us(wait * 1000);
for(i = 0; i < LED_NUM; i += 3)
{
array[i * COLOR_NUM] = 0;
array[i * COLOR_NUM + 1] = 0;
array[i * COLOR_NUM + 2] = 0;
}
WS2812_SendDataArray(array, LED_TOTAL);
}
}
/*********** HSV转RGB函数 ***********/
void HsvToRgb(uint16_t h, uint8_t s, uint8_t v, uint8_t *r, uint8_t *g, uint8_t *b)
{
uint8_t region, remainder, p, q, t;
if(s == 0)
{
*r = v;
*g = v;
*b = v;
return;
}
region = h / 43;
remainder = (h - (region * 43)) * 6;
p = (v * (255 - s)) >> 8;
q = (v * (255 - ((s * remainder) >> 8))) >> 8;
t = (v * (255 - ((s * (255 - remainder)) >> 8))) >> 8;
switch(region)
{
case 0:
*r = v;
*g = t;
*b = p;
break;
case 1:
*r = q;
*g = v;
*b = p;
break;
case 2:
*r = p;
*g = v;
*b = t;
break;
case 3:
*r = p;
*g = q;
*b = v;
break;
case 4:
*r = t;
*g = p;
*b = v;
break;
default:
*r = v;
*g = p;
*b = q;
break;
}
}
```
由于代码较长,注释也比较详细,这里就不做过多解释了。
相关推荐
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)