STM32F103控制WS2812 5050RGB灯

本文介绍了WS2812智能LED光源的特性,包括内置信号整形、256级亮度调节、1677万种颜色显示、串行级联接口及远距离传输能力。还展示了如何使用C语言编程控制单个像素和整帧,并演示了流水灯效果的实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

WS2812智能外控集成LED光源:

  • 控制电路与RGB芯片集成在一个5050封装的元器件中,构成一个完整的外空像素点。
  • 内置信号整形电路,任何一个像素点收到信号后经过波形整形再输出,保证线路波形畸变不会累加。
  • 内置上电复位和掉电复位电路。
  • 每个像素点的三基色颜色可实现256级亮度显示,完成16777216种颜色的全真彩色显示,扫描频率不低于400Hz/S。
  • 串行级联接口,能通过一根信号线完成数据的接收与解码。
  • 任意两点传输距离在不超过5米是无需增加任何电路。
  • 当刷新速率30帧/秒时,低速模式级联数不小于512点,高速模式不小于1024点。
  • 数据发送速度可达800Kbps。
  • 光的颜色高度一致,性价比高。
    在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

/*
 * ws2812.h
 *
 *  Created on: May 6, 2021
 *      Author: song'yu'long
 */

#ifndef INC_WS2812_H_
#define INC_WS2812_H_
#include <stdio.h>

#define COLOR_BLACK		(0x000000)
#define COLOR_WHITE		(0xffffff)
#define COLOR_RED		(0xff0000)
#define COLOR_GREEN		(0x00ff00)
#define COLOR_YELLOW	(0x0000ff)


void ws2812_onepixel(unsigned int color);
void ws2812_oneframe(void);

void ws2812_waterflow(void);
#endif /* INC_WS2812_H_ */
/*
 * ws2812.c
 *
 *  Created on: May 6, 2021
 *      Author: song'yu'long
 */

#include "gpio.h"
#include "ws2812.h"
#include "main.h"

#define DIN_PORT	GPIOB		//5050RGB WS2812-DIN Port
#define DIN_PIN		GPIO_PIN_9  //5050RGB WS2812-DIN Pin

#define LEDS_NUM	(9)
unsigned int rgbflow[][LEDS_NUM]={
	{COLOR_RED,COLOR_RED,COLOR_RED,COLOR_GREEN,COLOR_GREEN,COLOR_GREEN,COLOR_YELLOW,COLOR_YELLOW,COLOR_YELLOW},
	{COLOR_RED,COLOR_RED,COLOR_GREEN,COLOR_GREEN,COLOR_GREEN,COLOR_YELLOW,COLOR_YELLOW,COLOR_YELLOW,COLOR_RED},
	{COLOR_RED,COLOR_GREEN,COLOR_GREEN,COLOR_GREEN,COLOR_YELLOW,COLOR_YELLOW,COLOR_YELLOW,COLOR_RED,COLOR_RED},
	{COLOR_GREEN,COLOR_GREEN,COLOR_GREEN,COLOR_YELLOW,COLOR_YELLOW,COLOR_YELLOW,COLOR_RED,COLOR_RED,COLOR_RED},
	{COLOR_GREEN,COLOR_GREEN,COLOR_YELLOW,COLOR_YELLOW,COLOR_YELLOW,COLOR_RED,COLOR_RED,COLOR_RED,COLOR_GREEN},
	{COLOR_GREEN,COLOR_YELLOW,COLOR_YELLOW,COLOR_YELLOW,COLOR_RED,COLOR_RED,COLOR_RED,COLOR_GREEN,COLOR_GREEN},
	{COLOR_YELLOW,COLOR_YELLOW,COLOR_YELLOW,COLOR_RED,COLOR_RED,COLOR_RED,COLOR_GREEN,COLOR_GREEN,COLOR_GREEN},
	{COLOR_YELLOW,COLOR_YELLOW,COLOR_RED,COLOR_RED,COLOR_RED,COLOR_GREEN,COLOR_GREEN,COLOR_GREEN,COLOR_YELLOW},
	{COLOR_YELLOW,COLOR_RED,COLOR_RED,COLOR_RED,COLOR_GREEN,COLOR_GREEN,COLOR_GREEN,COLOR_YELLOW,COLOR_YELLOW},
};





/*
 * @brief nop延时
 */
void delay_xnop(int x)
{
	while(x--)
	{
		asm("nop");
	}
}

/*
 * @brief WS2812 写入一个像素颜色
 * @param color:颜色RGB值#RRGGBB, 如0xff0000红色
 * @return none
 */
void ws2812_onepixel(unsigned int color)
{
	// WS2812 颜色数据格式 G7~G0,R7~R0,B7~B0, RGB=>GRB
	unsigned int tmp = (((color&0x00ff00)<<8)|((color&0xff0000)>>8)|(color&0xff));

	// T0H 0码,高电平时间 	0.35us	±150ns
	// T0L 0码,低电平时间	0.80us	±150ns
	// T1H 1码,高电平时间 	0.70us	±150ns
	// T1L 1码,低电平时间	0.60us	±150ns
	// RES 帧单位,低电平时间 	50us以上

	// 注意:因使用STM32库函数操作GPIO,满足不了最小电平反转时间,后来改为寄存器操作即可满足!STM32  8MHz晶振,72MHz主频。
	int i=0;
	for(i=23; i>=0; i--)
	{
		if ((tmp>>i)&0x01) {
			DIN_PORT->BSRR = DIN_PIN;
			DIN_PORT->BSRR = DIN_PIN;
			DIN_PORT->BSRR = DIN_PIN;
			DIN_PORT->BSRR = DIN_PIN;
			DIN_PORT->BSRR = DIN_PIN;
			delay_xnop(6);

			DIN_PORT->BRR = DIN_PIN;
			delay_xnop(1);

		} else {
			DIN_PORT->BSRR = DIN_PIN;
			DIN_PORT->BSRR = DIN_PIN;
			DIN_PORT->BSRR = DIN_PIN;

			DIN_PORT->BRR = DIN_PIN;
			DIN_PORT->BRR = DIN_PIN;
			DIN_PORT->BRR = DIN_PIN;
		}
	}
}


/*
 * @brief WS2812 写入一个帧间隔
 * @param none
 * @note  DIN Low  RES:>50us
 * @return none
 */
void ws2812_oneframe(void)
{
	HAL_GPIO_WritePin(DIN_PORT, DIN_PIN, GPIO_PIN_RESET);
	delay_xnop(500);
}

void ws2812_waterflow(void)
{
	int i=0,j=0;
	for (i=0; i<(sizeof(rgbflow)/sizeof(rgbflow[0])); i++)
	{
		for(j=0; j<LEDS_NUM; j++)
		{
			ws2812_onepixel(rgbflow[i][j]);
		}
		ws2812_oneframe();
		HAL_Delay(60);
	}
}

/* USER CODE END Header_StartDefaultTask */
void StartDefaultTask(void *argument)
{
  /* USER CODE BEGIN StartDefaultTask */
  /* Infinite loop */
  for(;;)
  {
	  // 流水灯测试9LED
	  ws2812_waterflow();

#if 0
	//TODO:UPDATE RGB LED
	ws2812_onepixel(0xff0000);
	ws2812_onepixel(0xff0000);
	ws2812_onepixel(0xff0000);
	ws2812_onepixel(0x00ff00);
	ws2812_onepixel(0x00ff00);
	ws2812_onepixel(0x00ff00);
	ws2812_onepixel(0x0000ff);
	ws2812_onepixel(0x0000ff);
	ws2812_onepixel(0x0000ff);
	ws2812_oneframe();
	osDelay(500);


	ws2812_onepixel(0x00ff00);
	ws2812_onepixel(0x00ff00);
	ws2812_onepixel(0x00ff00);
	ws2812_onepixel(0x0000ff);
	ws2812_onepixel(0x0000ff);
	ws2812_onepixel(0x0000ff);
	ws2812_onepixel(0xff0000);
	ws2812_onepixel(0xff0000);
	ws2812_onepixel(0xff0000);
	ws2812_oneframe();
	osDelay(500);


	ws2812_onepixel(0x0000ff);
	ws2812_onepixel(0x0000ff);
	ws2812_onepixel(0x0000ff);
	ws2812_onepixel(0xff0000);
	ws2812_onepixel(0xff0000);
	ws2812_onepixel(0xff0000);
	ws2812_onepixel(0x00ff00);
	ws2812_onepixel(0x00ff00);
	ws2812_onepixel(0x00ff00);
	ws2812_oneframe();
	osDelay(500);
#endif

  }
  /* USER CODE END StartDefaultTask */
}

main.h和gpio.h是IDE配置工具自动生成的:

main.h

/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file           : main.h
  * @brief          : Header for main.c file.
  *                   This file contains the common defines of the application.
  ******************************************************************************
  * @attention
  *
  * <h2><center>&copy; Copyright (c) 2021 STMicroelectronics.
  * All rights reserved.</center></h2>
  *
  * This software component is licensed by ST under BSD 3-Clause license,
  * the "License"; You may not use this file except in compliance with the
  * License. You may obtain a copy of the License at:
  *                        opensource.org/licenses/BSD-3-Clause
  *
  ******************************************************************************
  */
/* USER CODE END Header */

/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __MAIN_H
#define __MAIN_H

#ifdef __cplusplus
extern "C" {
#endif

/* Includes ------------------------------------------------------------------*/
#include "stm32f1xx_hal.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */

/* USER CODE END Includes */

/* Exported types ------------------------------------------------------------*/
/* USER CODE BEGIN ET */

/* USER CODE END ET */

/* Exported constants --------------------------------------------------------*/
/* USER CODE BEGIN EC */

/* USER CODE END EC */

/* Exported macro ------------------------------------------------------------*/
/* USER CODE BEGIN EM */

/* USER CODE END EM */

/* Exported functions prototypes ---------------------------------------------*/
void Error_Handler(void);

/* USER CODE BEGIN EFP */

/* USER CODE END EFP */

/* Private defines -----------------------------------------------------------*/
/* USER CODE BEGIN Private defines */

/* USER CODE END Private defines */

#ifdef __cplusplus
}
#endif

#endif /* __MAIN_H */

/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

gpio.h

/**
  ******************************************************************************
  * @file    gpio.h
  * @brief   This file contains all the function prototypes for
  *          the gpio.c file
  ******************************************************************************
  * @attention
  *
  * <h2><center>&copy; Copyright (c) 2021 STMicroelectronics.
  * All rights reserved.</center></h2>
  *
  * This software component is licensed by ST under Ultimate Liberty license
  * SLA0044, the "License"; You may not use this file except in compliance with
  * the License. You may obtain a copy of the License at:
  *                             www.st.com/SLA0044
  *
  ******************************************************************************
  */
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __GPIO_H__
#define __GPIO_H__

#ifdef __cplusplus
extern "C" {
#endif

/* Includes ------------------------------------------------------------------*/
#include "main.h"

/* USER CODE BEGIN Includes */

/* USER CODE END Includes */

/* USER CODE BEGIN Private defines */

/* USER CODE END Private defines */

void MX_GPIO_Init(void);

/* USER CODE BEGIN Prototypes */

/* USER CODE END Prototypes */

#ifdef __cplusplus
}
#endif
#endif /*__ GPIO_H__ */

/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

WS2812B简介: 新一代的RGB5050控制电路与RGB芯片集成在一个5050封装的元器件中,构成一个完整的外控像素点。 ● 内置信号整形电路,任何一个像素点收到信号后经过波形整形再输出,保证线路波形畸变不会累加。 ● 内置上电复位和掉电复位电路。 ● 每个像素点的三基色颜色可实现256级亮度显示,完成16777216种颜色的全真色彩显示,扫描频率不低于400Hz/s。 ● 串行级联接口,能通过一根信号线完成数据的接收与解码。 ● 任意两点传传输距离在不超过5米时无需增加任何电路。 ● 当刷新速率30帧/秒时,低速模式级联数不小于512点,高速模式不小于1024点。 ● 数据发送速度可达800Kbps。 ● 光的颜色高度一致,性价比高。 基于STM32驱动WS2812B设计案例概述: 使用了STM32L011D4P6设计了最小系统板,电源部分前级采用TI高效率开关电源芯片TPS563200将12V转换为5V,再由低压差LDO AMS1117-3.3转换为3.3V给单片机供电,STM32使用了PWM来模拟24bit数字信号,驱动了WS2812B,达到LED颜色,亮度可控的目的。详细介绍及程序文件详见附件内容。 工程采用CubeMX生成,使用的是ST最新的HAL库,需要使用keil5及以上版本打开,CubeMX版本需要16.0及以上,下载地址:https://www.st.com/content/st_com ... -long-promo_feb2014; 安利下个人空间:https://club.gizwits.com/home.php?mod=space&uid=7261 优酷视频:https://player.youku.com/player.php/sid/XMTc0ODA0NDYwMA==/v.swf 三点说明: WS2812B为5V供电,5V逻辑器件,因此需要电平转换IC; RGB5050 最大60mA电流,单色时为20mA.因此应根据珠的多少设计合适的电源; 本设计采用TI开关电源芯片TPS563200,最大3A电流输出能力。 STM32驱动WS2812B电路板截图:
### ESP32 控制 WS2812 5050 RGB LED 示例代码和教程 #### 使用 FastLED 库实现简单光效果 为了简化开发过程并提高效率,推荐使用 `FastLED` 库来控制 WS2812B LED 带。该库提供了丰富的功能接口,可以轻松创建复杂的光效果。 安装 FastLED 库的方法是在 Arduino IDE 的库管理器中搜索 "FastLED" 并点击安装按钮即可完成安装[^1]。 下面是一个基本的例子,展示如何利用 FastLED 库让单颗或一组 WS2812B 发光: ```cpp #include <FastLED.h> // 定义数据线连接到哪个 GPIO 引脚以及的数量 #define DATA_PIN 17 #define NUM_LEDS 15 CRGB leds[NUM_LEDS]; void setup() { // 设置亮度范围为最大值的一半 FastLED.setBrightness(127); // 初始化 LED 数组 FastLED.addLeds<WS2812, DATA_PIN, GRB>(leds, NUM_LEDS).setCorrection(TypicalLEDStrip); } void loop() { static uint8_t startIndex = 0; FillGradientRainbow(leds, NUM_LEDS, startIndex, 75); startIndex += 1; FastLED.show(); delay(20); } ``` 这段程序会使得所有的 LED 像彩虹一样循环渐变颜色[^3]。 对于更高级的应用场景,比如模拟子弹发射或者流星拖尾的效果,则可以通过调整特定位置上的像素色彩强度来达成目的。例如,在按下某个物理按键时触发一次性的动画序列,使指定数量的连续 LED 逐渐亮起再慢慢熄灭,形成类似射击游戏中的视觉反馈或是夜空中划过的彗星轨迹。 #### 关键要点总结 - 数据传输采用单总线协议; - 内置微控制器负责处理通信细节; - 支持多种调光模式与动态显示方案;
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SongYuLong的博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值