通过以下方式控制 WS2812B_RGB Lamp STONE 显示模组

本文记录了使用 WS2812B_RGB 灯控制的过程 STONE 显示模块。
RGB灯是我们日常生活中经常见到的一种灯。 广泛应用于城市夜景、灯光秀、室内照明、辅助照明、广告模组照明、夜光字、柜台照明、商场照明、珠宝展示柜照明等。

本项目是通过以下方式实现RGB灯控制 STONE 显示模块:

  1. 控制灯光的颜色
  2. 控制灯光的亮度
  3. 控制灯的四种模式

控制-WS2812B_RGB-lamp-by-STONE-显示模块

STONE 控制TFT-LCD显示模块

新的 STONE STVC070WT-01 是一款7英寸的显示模组,分辨率为800*480。 该显示模块可从官网购买 STONE. 通讯方式为uart-rs232和uart-ttl。 开发方法很简单,MCU只需要发送指令到 STONE 显示模块通过UART控制显示内容。 同样的原理,当用户触摸 STONE 显示模块,显示模块也通过UART向MCU发送相关指令,MCU再控制设备(本项目中WS2812B_RGB灯)。

7英寸 STONE STVC070WT-01

下图是我收到的包装和配件:

控制-WS2812B_RGB-lamp-by-STONE-显示模块

控制-WS2812B_RGB-lamp-by-STONE-显示模块

列表:

  1. 连接和接口
  2. USB转TTL转接板
  3. U盘(含开发资料)
  4. 微型USB数据线
  5. USB转接板
  6. STONE STVC070WT-01显示模块
  7. 12V电源适配器

的功能 STONE 控制显示模块

STVC070WT-01是一款TFT显示和触摸控制器。它包括处理器、控制程序、驱动器、闪存、RS232/RS485/TTL端口、触摸屏、电源等,是一个功能强大的显示系统
操作系统简单,可由任何单片机控制。
STVC070WT-01可用于执行所有基本功能,如文本显示、图像显示、曲线显示、触摸功能、视频和音频功能等。

  • 内置 Cortex CPU 和驱动程序
  • 可由任何单片机控制
  • 显示图片/文字/曲线
  • 65536彩色TFT显示屏
  • 可以触摸
  • RS232/ RS485/ TTL UART接口和USB接口
  • 宽电压范围

POWx STONE TFT-LCD控制显示工作原理

TFT-LCD模组通过指令(十六进制代码)与客户的MCU进行通信,MCU根据收到的指令控制连接的设备工作。

控制-WS2812B_RGB-lamp-by-STONE-显示模块

开发步骤为 STONE 控制显示模块

使用方法 STONE的 TFT-LCD 模块只需 3 个步骤:

  1. 设计一组漂亮的图形用户界面。
  2. 通过 RS232、RS485 或 TTL 直接连接到客户端的 MCU。
  3. 编写一个简单的程序,由单片机命令控制TFT-LCD模块。 (十六进制)。

TFT LCD 模块串行命令帧由 5 个数据块组成,所有串行命令或数据均以十六进制格式表示。 MSB 模式下的数据传输。 例如,对于 0x1234, 先发送 0x12, 然后 0x34.

应用场景 STONE TFT-LCD控制显示模块

新的 STONE 控制显示模块广泛应用于各种工业领域,如 医疗美容设备工程机械, 和 车辆当量u投资电子仪器工业控制系统电力行业民用电子设备自动化设备交通运输或是.

用户界面图像设计 STONE 控制TFT-LCD

使用Photoshop设计的界面如下:

控制-WS2812B_RGB-lamp-by-STONE-显示模块 控制-WS2812B_RGB-lamp-by-STONE-显示模块

第一张是主屏画面,第二张是按键按下时的效果。

使用方法 STONE 工具箱 生成LCD模块配置文件

控制-WS2812B_RGB-lamp-by-STONE-显示模块

点击箭头所指的按钮生成配置文件,然后将配置文件下载到显示模块中,即可显示我们设计的UI界面。

接线和焊接

完成了上面的触控显示控制之后,我们就可以专注于MCU和WS2812B_RGB灯具的开发了。
但在此之前,我们需要做一些焊接。

接线图

控制-WS2812B_RGB-lamp-by-STONE-显示模块

电源适配器为12V,需要给电源供电 STONE STVC070WT-01 显示模块并通过 dc-dc 降压将电压降低到 2812v,为 MCU 模块和 WS5B_RGB 灯供电。

项目中使用的配件

控制-WS2812B_RGB-lamp-by-STONE-显示模块

主要配件有

  1. STM32F103C8R6模块
  2. 直流-直流降压模块
  3. UART连接

由于通信方式 STONE STVC070WT-01默认为uart-TTL,我们不需要RS232接口进行连接。 去掉 RS232 接口:

控制-WS2812B_RGB-lamp-by-STONE-显示模块

焊接

将这些零件焊接在一起,效果如下:

控制-WS2812B_RGB-lamp-by-STONE-显示模块

控制-WS2812B_RGB-lamp-by-STONE-显示模块

有3个接口,如上图。

当这部分准备好后,您可以对 MCU 进行编程。 但在我们这样做之前,我们需要确定如何驱动 WS2812B_RGB 灯。

WS2812B

WS2812B 实际上是一个RGB驱动芯片。 控制电路和RGB芯片集成在一个5050封装的元器件中,形成一个完整的像素点。 内置信号整形电路,任何像素点接收到的信号经过波形整形后输出,保证了电路累积的波形失真。 内置上电复位和断电复位电路。 每个像素的颜色可以实现256级亮度显示,完成16777216色的全彩显示,串口,可以通过一条信号线完成数据接收和解码。 任意两点之间的传输距离不超过5米,无需任何附加电路。 刷新率为30帧/秒时,低速模式的级联数不少于512点,高速模式的级联数不少于1024点。 数据传输速度高达8Kbps。光色高度一致,性价比高。

控制-WS2812B_RGB-lamp-by-STONE-显示模块

控制-WS2812B_RGB-lamp-by-STONE-显示模块

  1. DOUT:  数据输出,控制数据信号输出
  2. DIN:  数据输入、控制数据信号输入
  3. VCC:  逻辑电源、控制电路电源
  4. NC 
  5. VDD:  电源、LED电源
  6. VSS: GND

控制-WS2812B_RGB-lamp-by-STONE-显示模块

应用领域

LED全彩灯串、LED全彩模组、LED全彩软灯条硬灯条、LED护栏管、LED点光源、LED像素屏、LED异形屏、各种电子产品、电器设备运行马灯。

WS2812 驱动程序

WS2812的驱动方式很简单。 MCU只需一根信号线即可完成亮度和色彩控制。

控制-WS2812B_RGB-lamp-by-STONE-显示模块

控制-WS2812B_RGB-lamp-by-STONE-显示模块

STM32驱动代码

#include "../BOARD/ws2812/ws2812.h"
#include "usart.h"
#include "delay.h"
uint8_t PIXEL_NUM=60;
#define RGB_LED GPIO_Pin_7
#define RGB_LED_HIGH (GPIO_SetBits(GPIOA,RGB_LED))
#define RGB_LED_LOW (GPIO_ResetBits(GPIOA,RGB_LED))
void RGB_LED_Init(void)
{
GPIO_InitTypeDef  GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_SetBits(GPIOA,GPIO_Pin_7);
}
/********************************************************/
//
/********************************************************/
void RGB_LED_Write0(void)
{
RGB_LED_HIGH;
__nop();__nop();__nop();__nop();__nop();__nop();
RGB_LED_LOW;
__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();
__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();
__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();
__nop();__nop();
}
/********************************************************/
//
/********************************************************/
void RGB_LED_Write1(void)
{
RGB_LED_HIGH;
__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();
__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();
__nop();__nop();
RGB_LED_LOW;
__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();
__nop();__nop();
}
void RGB_LED_Reset(void)
{
RGB_LED_LOW;
delay_us(80);
}
void RGB_LED_Write_Byte(uint8_t byte)
{
uint8_t i;
for(i=0;i<8;i++)
{
if(byte&0x80)
{
RGB_LED_Write1();
}
else
{
RGB_LED_Write0();
}
byte <<= 1;
}
}
void RGB_LED_Write_24Bits(uint8_t red,uint8_t green,uint8_t blue)
{
uint16_t i=0;
for( i=0;i<pixel_num;i++)< span=""></pixel_num;i++)<>
{
RGB_LED_Write_Byte(green);
RGB_LED_Write_Byte(red);
RGB_LED_Write_Byte(blue);
}
}
void RGB_LED_Write_24Bits_Efect(uint8_t red,uint8_t green,uint8_t blue)
{
RGB_LED_Write_Byte(green);
RGB_LED_Write_Byte(red);
RGB_LED_Write_Byte(blue);
}
void RGB_LED_Red(void)
{
uint8_t i;
//4?LED???
for(i=0;i<pixel_num;i++)< span=""></pixel_num;i++)<>
{
RGB_LED_Write_24Bits(0, 0xff, 0);
}
}
void RGB_LED_Green(void)
{
uint8_t i;
for(i=0;i<pixel_num;i++)< span=""></pixel_num;i++)<>
{
RGB_LED_Write_24Bits(0xff, 0, 0);
}
}
void RGB_LED_Blue(void)
{
uint8_t i;
for(i=0;i<pixel_num;i++)< span=""></pixel_num;i++)<>
{
RGB_LED_Write_24Bits(0x40, 0x50, 0);
}
}
#ifndef __WS2812_H
#define __WS2812_H
#include "stm32f10x.h"
//#define PIXEL_NUM 120
extern uint8_t PIXEL_NUM;
#define WS_HIGH 0XF8
#define WS_LOW  0XE0
#define RED_COLOR     0x07
#define GREEN_COLOR    0x08
#define BLUE_COLOR  0x09
#define WHITE_COLOR  0x06
#define LED_ALL_ONOFF  0x01
#define BLINK1         0x0A
#define BLINK2         0x0B
#define BLINK3         0x0C
#define BLINK4         0x0D
#define LightOn      0x00
#define LightOff     0x01
void RGB_LED_Reset(void);
void RGB_LED_Init(void);
void RGB_LED_Reset(void);
void RGB_LED_Write_24Bits(uint8_t red,uint8_t green,uint8_t blue);
void RGB_LED_Write_24Bits_effect(uint8_t red,uint8_t green,uint8_t blue);
uint32_t ws281x_wheel(uint8_t wheelPos);
void RGB_LED_Write_24Bits_Efect(uint8_t green,uint8_t red,uint8_t blue);
#endif /* __WS2812_H */

STM32F103C8T6

网上有很多关于这款芯片的资料和开发文档。 下面简单介绍一下这款芯片。
这是STM32F103C8T6的开发板,购买链接:
https://www.st.com/en/microcontrollers-microprocessors/stm32f103c8.html

控制-WS2812B_RGB-lamp-by-STONE-显示模块

控制-WS2812B_RGB-lamp-by-STONE-显示模块

这个芯片我就不多说了。 芯片下载代码为j-link,如下图:

控制-WS2812B_RGB-lamp-by-STONE-显示模块

这是一个简单版的j-link,只支持SWD模式调试和下载,不支持JTAG。 但是对于STM32芯片的开发,SWD调试方法就足够了。

将代码下载到STM32芯片。

保证j-link和STM32F103C8T6的接线正确,然后在KEIL开发环境下就可以识别芯片了:

控制-WS2812B_RGB-lamp-by-STONE-显示模块

点击下载按钮,将代码下载到芯片:

控制-WS2812B_RGB-lamp-by-STONE-显示模块

STM32代码

显示屏中的按钮和文字都有相应的地址。 本项目中,显示屏组件的地址如下:

#define RED_COLOR     0x07
#define ICON_WHITE_ADDR  0x02
#define ICON_RED_ADDR    0x03
#define ICON_GREEN_ADDR  0x04
#define ICON_BLUE_ADDR   0x05
#define TEXT_RED_ADDR         0x07
#define TEXT_GREEN_ADDR       0x08
#define TEXT_BLUE_ADDR        0x09
#define TEXT_WHITE_ADDR       0x06
#define SWITCH_ONOFF_ADDR     0x01
#define ICON_ON          0x01
#define ICON_OFF         0x00
u8 data_send[8]=  {0xA5, 0x5A, 0x05, 0x82, 0x00, 0x00, 0x00,0x00};
Data sent to the display screen should be sent according to the corresponding format:
U8 data_send[8]= {0xA5, 0x5A, 0x05, 0x82, 0x00,0x00,0x00,0x00};
Data [4]\ data[5] is the high and low order of component addresses.
Data [6]\ data[7] is the data to be displayed by the component.
The main logical code will be provided below:
#include "stm32f10x.h"
#include "usart.h"
#include "delay.h"
#include "../BOARD/ws2812/ws2812.h"
struct RGB_COLOR
{
u8 C_RED;
u8 C_GREEN;
u8 C_BLUE;
u8 C_WHITE;
u8 C_RED_FLAG;
u8 C_GREEN_FLAG;
u8 C_BLUE_FLAG;
};
#define ICON_WHITE_ADDR  0x02
#define ICON_RED_ADDR    0x03
#define ICON_GREEN_ADDR  0x04
#define ICON_BLUE_ADDR   0x05
#define TEXT_RED_ADDR         0x07
#define TEXT_GREEN_ADDR       0x08
#define TEXT_BLUE_ADDR        0x09
#define TEXT_WHITE_ADDR       0x06
#define SWITCH_ONOFF_ADDR     0x01
#define ICON_ON          0x01
#define ICON_OFF         0x00
u8 data_send[8]=  {0xA5, 0x5A, 0x05, 0x82, 0x00, 0x00, 0x00,0x00};
void UART1_Send_Array(u8 send_array[],unsigned char num)
{
u8 i=0;
while(i<num)< span=""></num)<>
{
USART_SendData(USART1,send_array[i]);
while( USART_GetFlagStatus(USART1,USART_FLAG_TC)!= SET);
i++;
}
}
int main(void)
{
uart_init(115200);
delay_init();
struct RGB_COLOR USER_RGB_COLOR;
USER_RGB_COLOR.C_BLUE=0;
USER_RGB_COLOR.C_GREEN=0;
USER_RGB_COLOR.C_RED=0;
USER_RGB_COLOR.C_RED_FLAG=1;
USER_RGB_COLOR.C_GREEN_FLAG=1;
USER_RGB_COLOR.C_BLUE_FLAG=1;
u16 k,q;
u8 BLINK_2=0;
u8 USER_R=0,USER_G=0,USER_B=0,COLOR_TYPE=0,COLOR_DIR=0;
u8 blink_type=0;
u16 times=0;
RGB_LED_Init();
while(1)
{
if(USART_RX_END)
{
switch (USART_RX_BUF[5])
{
case 0x33:
PIXEL_NUM=USART_RX_BUF[8];
break;
case LED_ALL_ONOFF:
blink_type=0;
if(USART_RX_BUF[8]==0)
{
data_send[5]=ICON_RED_ADDR;
data_send[7]=ICON_OFF;
UART1_Send_Array(data_send,8);
data_send[5]=TEXT_RED_ADDR;
data_send[7]=0x00;
UART1_Send_Array(data_send,8);
data_send[5]=ICON_GREEN_ADDR;
data_send[7]=ICON_OFF;
UART1_Send_Array(data_send,8);
data_send[5]=TEXT_GREEN_ADDR;
data_send[7]=0x00;
UART1_Send_Array(data_send,8);
data_send[5]=ICON_BLUE_ADDR;
data_send[7]=ICON_OFF;
UART1_Send_Array(data_send,8);
data_send[5]=TEXT_BLUE_ADDR;
data_send[7]=0x00;
UART1_Send_Array(data_send,8);
USER_RGB_COLOR.C_BLUE=0;
USER_RGB_COLOR.C_GREEN=0;
USER_RGB_COLOR.C_RED=0;
data_send[5]=ICON_WHITE_ADDR;
data_send[7]=ICON_OFF;
UART1_Send_Array(data_send,8);
data_send[5]=TEXT_WHITE_ADDR;
data_send[7]=0x00;
UART1_Send_Array(data_send,8);
USER_RGB_COLOR.C_WHITE=0;
}
else
{
USER_RGB_COLOR.C_BLUE=0x32;
USER_RGB_COLOR.C_GREEN=0x10;
USER_RGB_COLOR.C_RED=0x24;
USER_RGB_COLOR.C_RED_FLAG=0;
USER_RGB_COLOR.C_GREEN_FLAG=0;
USER_RGB_COLOR.C_BLUE_FLAG=0;
data_send[5]=ICON_RED_ADDR;
data_send[7]=ICON_ON;
UART1_Send_Array(data_send,8);
data_send[5]=TEXT_RED_ADDR;
data_send[7]=0x24;
UART1_Send_Array(data_send,8);
data_send[5]=ICON_GREEN_ADDR;
data_send[7]=ICON_ON;
UART1_Send_Array(data_send,8);
data_send[5]=TEXT_GREEN_ADDR;
data_send[7]=0x10;
UART1_Send_Array(data_send,8);
data_send[5]=ICON_BLUE_ADDR;
data_send[7]=ICON_ON;
UART1_Send_Array(data_send,8);
data_send[5]=TEXT_BLUE_ADDR;
data_send[7]=0x32;
UART1_Send_Array(data_send,8);
}
RGB_LED_Write_24Bits(USER_RGB_COLOR.C_RED, USER_RGB_COLOR.C_GREEN, USER_RGB_COLOR.C_BLUE);
break;
case RED_COLOR:
blink_type=0;
if(USER_RGB_COLOR.C_RED_FLAG==1)
{
if(USART_RX_BUF[8]==0)
break;
}
data_send[5]=ICON_WHITE_ADDR;
data_send[7]=ICON_OFF;
UART1_Send_Array(data_send,8);
data_send[5]=TEXT_WHITE_ADDR;
data_send[7]=0x00;
UART1_Send_Array(data_send,8);
USER_RGB_COLOR.C_WHITE=0;
data_send[5]=SWITCH_ONOFF_ADDR;
data_send[7]=ICON_ON;
UART1_Send_Array(data_send,8);
data_send[5]=ICON_RED_ADDR;
if(USART_RX_BUF[8]>0)data_send[7]=ICON_ON;
else data_send[7]=ICON_OFF;
UART1_Send_Array(data_send,8);
USER_RGB_COLOR.C_RED=USART_RX_BUF[8];
USER_RGB_COLOR.C_RED_FLAG=0;
if(USER_RGB_COLOR.C_RED==0)USER_RGB_COLOR.C_RED_FLAG=1;
if((USER_RGB_COLOR.C_RED==0x00)&&(USER_RGB_COLOR.C_GREEN==0x00)&&(USER_RGB_COLOR.C_BLUE==0x00)&&(USER_RGB_COLOR.C_WHITE==0x00))
{
data_send[5]=SWITCH_ONOFF_ADDR;
data_send[7]=ICON_OFF;
UART1_Send_Array(data_send,8);
}
RGB_LED_Write_24Bits(USER_RGB_COLOR.C_RED, USER_RGB_COLOR.C_GREEN, USER_RGB_COLOR.C_BLUE); // Red
break;
case GREEN_COLOR:
blink_type=0;
if(USER_RGB_COLOR.C_GREEN_FLAG==1)
{
if(USART_RX_BUF[8]==0)
break;
}
data_send[5]=ICON_GREEN_ADDR;
if(USART_RX_BUF[8]>0)data_send[7]=ICON_ON;
else data_send[7]=ICON_OFF;
UART1_Send_Array(data_send,8);
data_send[5]=ICON_WHITE_ADDR;
data_send[7]=ICON_OFF;
UART1_Send_Array(data_send,8);
data_send[5]=TEXT_WHITE_ADDR;
data_send[7]=0x00;
UART1_Send_Array(data_send,8);
USER_RGB_COLOR.C_WHITE=0;
data_send[5]=SWITCH_ONOFF_ADDR;
data_send[7]=ICON_ON;
UART1_Send_Array(data_send,8);
USER_RGB_COLOR.C_GREEN=USART_RX_BUF[8];
USER_RGB_COLOR.C_GREEN_FLAG=0;
if(USER_RGB_COLOR.C_GREEN==0)USER_RGB_COLOR.C_GREEN_FLAG=1;
if((USER_RGB_COLOR.C_RED==0x00)&&(USER_RGB_COLOR.C_GREEN==0x00)&&(USER_RGB_COLOR.C_BLUE==0x00)&&(USER_RGB_COLOR.C_WHITE==0x00))
{
data_send[5]=SWITCH_ONOFF_ADDR;
data_send[7]=ICON_OFF;
UART1_Send_Array(data_send,8);
}
RGB_LED_Write_24Bits(USER_RGB_COLOR.C_RED, USER_RGB_COLOR.C_GREEN, USER_RGB_COLOR.C_BLUE);  // Green
break;
case BLUE_COLOR:
blink_type=0;
if(USER_RGB_COLOR.C_BLUE_FLAG==1)
{
if(USART_RX_BUF[8]==0)
break;
}
data_send[5]=ICON_BLUE_ADDR;
if(USART_RX_BUF[8]>0)data_send[7]=ICON_ON;
else data_send[7]=ICON_OFF;
UART1_Send_Array(data_send,8);
data_send[5]=ICON_WHITE_ADDR;
data_send[7]=ICON_OFF;
UART1_Send_Array(data_send,8);
data_send[5]=TEXT_WHITE_ADDR;
data_send[7]=0x00;
UART1_Send_Array(data_send,8);
USER_RGB_COLOR.C_WHITE=0;
data_send[5]=SWITCH_ONOFF_ADDR;
data_send[7]=ICON_ON;
UART1_Send_Array(data_send,8);
USER_RGB_COLOR.C_BLUE=USART_RX_BUF[8];
USER_RGB_COLOR.C_BLUE_FLAG=0;
if(USER_RGB_COLOR.C_BLUE==0)USER_RGB_COLOR.C_BLUE_FLAG=1;
if((USER_RGB_COLOR.C_RED==0x00)&&(USER_RGB_COLOR.C_GREEN==0x00)&&(USER_RGB_COLOR.C_BLUE==0x00)&&(USER_RGB_COLOR.C_WHITE==0x00))
{
data_send[5]=SWITCH_ONOFF_ADDR;
data_send[7]=ICON_OFF;
UART1_Send_Array(data_send,8);
}
RGB_LED_Write_24Bits(USER_RGB_COLOR.C_RED, USER_RGB_COLOR.C_GREEN, USER_RGB_COLOR.C_BLUE); // Blue
break;
case WHITE_COLOR:
blink_type=0;
data_send[5]=ICON_WHITE_ADDR;
if(USART_RX_BUF[8]>0)data_send[7]=ICON_ON;
else data_send[7]=ICON_OFF;
UART1_Send_Array(data_send,8);
data_send[5]=ICON_RED_ADDR;
data_send[7]=ICON_OFF;
UART1_Send_Array(data_send,8);
data_send[5]=TEXT_RED_ADDR;
data_send[7]=0x00;
UART1_Send_Array(data_send,8);
data_send[5]=ICON_GREEN_ADDR;
data_send[7]=ICON_OFF;
UART1_Send_Array(data_send,8);
data_send[5]=TEXT_GREEN_ADDR;
data_send[7]=0x00;
UART1_Send_Array(data_send,8);
data_send[5]=ICON_BLUE_ADDR;
data_send[7]=ICON_OFF;
UART1_Send_Array(data_send,8);
data_send[5]=TEXT_BLUE_ADDR;
data_send[7]=0x00;
UART1_Send_Array(data_send,8);
USER_RGB_COLOR.C_BLUE=0;
USER_RGB_COLOR.C_GREEN=0;
USER_RGB_COLOR.C_RED=0;
USER_RGB_COLOR.C_RED_FLAG=1;
USER_RGB_COLOR.C_GREEN_FLAG=1;
USER_RGB_COLOR.C_BLUE_FLAG=1;
data_send[5]=SWITCH_ONOFF_ADDR;
data_send[7]=ICON_ON;
UART1_Send_Array(data_send,8);
USER_RGB_COLOR.C_WHITE=USART_RX_BUF[8];
if((USER_RGB_COLOR.C_RED==0x00)&&(USER_RGB_COLOR.C_GREEN==0x00)&&(USER_RGB_COLOR.C_BLUE==0x00)&&(USER_RGB_COLOR.C_WHITE==0x00))
{
data_send[5]=SWITCH_ONOFF_ADDR;
data_send[7]=ICON_OFF;
UART1_Send_Array(data_send,8);
}
RGB_LED_Write_24Bits(USER_RGB_COLOR.C_WHITE, USER_RGB_COLOR.C_WHITE, USER_RGB_COLOR.C_WHITE);
break;
case BLINK1:
blink_type=1;
data_send[5]=ICON_RED_ADDR;
data_send[7]=ICON_OFF;
UART1_Send_Array(data_send,8);
data_send[5]=TEXT_RED_ADDR;
data_send[7]=0x00;
UART1_Send_Array(data_send,8);
data_send[5]=ICON_GREEN_ADDR;
data_send[7]=ICON_OFF;
UART1_Send_Array(data_send,8);
data_send[5]=TEXT_GREEN_ADDR;
data_send[7]=0x00;
UART1_Send_Array(data_send,8);
data_send[5]=ICON_BLUE_ADDR;
data_send[7]=ICON_OFF;
UART1_Send_Array(data_send,8);
data_send[5]=TEXT_BLUE_ADDR;
data_send[7]=0x00;
UART1_Send_Array(data_send,8);
USER_RGB_COLOR.C_BLUE=0;
USER_RGB_COLOR.C_GREEN=0;
USER_RGB_COLOR.C_RED=0;
data_send[5]=ICON_WHITE_ADDR;
data_send[7]=ICON_OFF;
UART1_Send_Array(data_send,8);
data_send[5]=TEXT_WHITE_ADDR;
data_send[7]=0x00;
UART1_Send_Array(data_send,8);
USER_RGB_COLOR.C_WHITE=0;
data_send[5]=SWITCH_ONOFF_ADDR;
data_send[7]=ICON_ON;
UART1_Send_Array(data_send,8);
break;
case BLINK2:
blink_type=2;
data_send[5]=ICON_RED_ADDR;
data_send[7]=ICON_OFF;
UART1_Send_Array(data_send,8);
data_send[5]=TEXT_RED_ADDR;
data_send[7]=0x00;
UART1_Send_Array(data_send,8);
data_send[5]=ICON_GREEN_ADDR;
data_send[7]=ICON_OFF;
UART1_Send_Array(data_send,8);
data_send[5]=TEXT_GREEN_ADDR;
data_send[7]=0x00;
UART1_Send_Array(data_send,8);
data_send[5]=ICON_BLUE_ADDR;
data_send[7]=ICON_OFF;
UART1_Send_Array(data_send,8);
data_send[5]=TEXT_BLUE_ADDR;
data_send[7]=0x00;
UART1_Send_Array(data_send,8);
USER_RGB_COLOR.C_BLUE=0;
USER_RGB_COLOR.C_GREEN=0;
USER_RGB_COLOR.C_RED=0;
data_send[5]=ICON_WHITE_ADDR;
data_send[7]=ICON_OFF;
UART1_Send_Array(data_send,8);
data_send[5]=TEXT_WHITE_ADDR;
data_send[7]=0x00;
UART1_Send_Array(data_send,8);
USER_RGB_COLOR.C_WHITE=0;
data_send[5]=SWITCH_ONOFF_ADDR;
data_send[7]=ICON_ON;
UART1_Send_Array(data_send,8);
break;
case BLINK3:
blink_type=3;
data_send[5]=ICON_RED_ADDR;
data_send[7]=ICON_OFF;
UART1_Send_Array(data_send,8);
data_send[5]=TEXT_RED_ADDR;
data_send[7]=0x00;
UART1_Send_Array(data_send,8);
data_send[5]=ICON_GREEN_ADDR;
data_send[7]=ICON_OFF;
UART1_Send_Array(data_send,8);
data_send[5]=TEXT_GREEN_ADDR;
data_send[7]=0x00;
UART1_Send_Array(data_send,8);
data_send[5]=ICON_BLUE_ADDR;
data_send[7]=ICON_OFF;
UART1_Send_Array(data_send,8);
data_send[5]=TEXT_BLUE_ADDR;
data_send[7]=0x00;
UART1_Send_Array(data_send,8);
USER_RGB_COLOR.C_BLUE=0;
USER_RGB_COLOR.C_GREEN=0;
USER_RGB_COLOR.C_RED=0;
// USER_RGB_COLOR.C_RED_FLAG=1;
// USER_RGB_COLOR.C_GREEN_FLAG=1;
// USER_RGB_COLOR.C_BLUE_FLAG=1;
data_send[5]=ICON_WHITE_ADDR;
data_send[7]=ICON_OFF;
UART1_Send_Array(data_send,8);
data_send[5]=TEXT_WHITE_ADDR;
data_send[7]=0x00;
UART1_Send_Array(data_send,8);
USER_RGB_COLOR.C_WHITE=0;
data_send[5]=SWITCH_ONOFF_ADDR;
data_send[7]=ICON_ON;
UART1_Send_Array(data_send,8);
break;
case BLINK4:
blink_type=4;
data_send[5]=ICON_RED_ADDR;
data_send[7]=ICON_OFF;
UART1_Send_Array(data_send,8);
data_send[5]=TEXT_RED_ADDR;
data_send[7]=0x00;
UART1_Send_Array(data_send,8);
data_send[5]=ICON_GREEN_ADDR;
data_send[7]=ICON_OFF;
UART1_Send_Array(data_send,8);
data_send[5]=TEXT_GREEN_ADDR;
data_send[7]=0x00;
UART1_Send_Array(data_send,8);
data_send[5]=ICON_BLUE_ADDR;
data_send[7]=ICON_OFF;
UART1_Send_Array(data_send,8);
data_send[5]=TEXT_BLUE_ADDR;
data_send[7]=0x00;
UART1_Send_Array(data_send,8);
USER_RGB_COLOR.C_BLUE=0;
USER_RGB_COLOR.C_GREEN=0;
USER_RGB_COLOR.C_RED=0;
data_send[5]=ICON_WHITE_ADDR;
data_send[7]=ICON_OFF;
UART1_Send_Array(data_send,8);
data_send[5]=TEXT_WHITE_ADDR;
data_send[7]=0x00;
UART1_Send_Array(data_send,8);
USER_RGB_COLOR.C_WHITE=0;
data_send[5]=SWITCH_ONOFF_ADDR;
data_send[7]=ICON_ON;
UART1_Send_Array(data_send,8);
break;
default:
USART_RX_END=0;
USART_RX_STA=0;
break;
}
USART_RX_STA=0;
USART_RX_END=0;
}
else
{
if(blink_type==1)
{
times++;
if(times>=14)
{
times=0;
if(COLOR_DIR==0)
{
if(COLOR_TYPE==0)
{
USER_R++;
USER_G=0;
USER_B=0;
}
else if(COLOR_TYPE==1)
{
USER_R=0;
USER_G++;
USER_B=0;
}
else if(COLOR_TYPE==2)
{
USER_R=0;
USER_G=0;
USER_B++;
}
else if(COLOR_TYPE==3)
{
USER_R++;
USER_G++;
USER_B=0;
}
else if(COLOR_TYPE==4)
{
USER_R=0;
USER_G++;
USER_B++;
}
else if(COLOR_TYPE==5)
{
USER_R++;
USER_G=0;
USER_B++;
}
if((USER_R>=250)||(USER_G>=250)||(USER_B>=250))
{
COLOR_DIR=1;
}
}
else
{
if(COLOR_TYPE==0)
{
USER_R--;
USER_G=0;
USER_B=0;
}
else if(COLOR_TYPE==1)
{
USER_R=0;
USER_G--;
USER_B=0;
}
else if(COLOR_TYPE==2)
{
USER_R=0;
USER_G=0;
USER_B--;
}
else if(COLOR_TYPE==3)
{
USER_R--;
USER_G--;
USER_B=0;
}
else if(COLOR_TYPE==4)
{
USER_R=0;
USER_G--;
USER_B--;
}
else if(COLOR_TYPE==5)
{
USER_R--;
USER_G=0;
USER_B--;
}
if((USER_R==0x02)||(USER_G==0x02)||(USER_B==0x02))
{
COLOR_DIR=0;
COLOR_TYPE++;
if(COLOR_TYPE>5)
COLOR_TYPE=0;
}
}
RGB_LED_Write_24Bits(USER_R,USER_G,USER_B);
}
delay_ms(1);
}
else if(blink_type==2)
{
k++;
if(k>=150)
{
k=0;
q=200;
{
BLINK_2++;
if(BLINK_2>8)BLINK_2=0;
}
if(BLINK_2==0)
RGB_LED_Write_24Bits(q,0,0);
else if(BLINK_2==1)
RGB_LED_Write_24Bits(0,q,0);
else if(BLINK_2==2)
RGB_LED_Write_24Bits(0,0,q);
else if(BLINK_2==3)
RGB_LED_Write_24Bits(q,q,0);
else if(BLINK_2==4)
RGB_LED_Write_24Bits(0,q,q);
else if(BLINK_2==5)
RGB_LED_Write_24Bits(q,0,q);
else if(BLINK_2==6)
RGB_LED_Write_24Bits(q-100,q,0);
else if(BLINK_2==7)
RGB_LED_Write_24Bits(0,q-80,q);
else if(BLINK_2==8)
RGB_LED_Write_24Bits(q,0,q-120);
else if(BLINK_2==9)
RGB_LED_Write_24Bits(40,q-100,q-70);
else if(BLINK_2==10)
RGB_LED_Write_24Bits(q,100,q-80);
}
delay_ms(1);
}
else if(blink_type==3)
{
k++;
if(k>=1000)
{
k=0;
{
BLINK_2++;
if(BLINK_2>5)BLINK_2=0;
}
{
if(BLINK_2==0)
RGB_LED_Write_24Bits(q,0,0);
else if(BLINK_2==1)
RGB_LED_Write_24Bits(0,q,0);
else if(BLINK_2==2)
RGB_LED_Write_24Bits(0,0,q);
else if(BLINK_2==3)
RGB_LED_Write_24Bits(q,q,0);
else if(BLINK_2==4)
RGB_LED_Write_24Bits(0,q,q);
else if(BLINK_2==5)
RGB_LED_Write_24Bits(q,0,q);
}
}
delay_ms(1);
}
else if(blink_type==4)
{
k++;
if(k>=500)
{
k=0;
q=0;
BLINK_2++;
if(BLINK_2>5)BLINK_2=0;
}
q++;
if(q>=250)q=0;
if(BLINK_2==0)
RGB_LED_Write_24Bits(q,0,0);
else if(BLINK_2==1)
RGB_LED_Write_24Bits(0,q,0);
else if(BLINK_2==2)
RGB_LED_Write_24Bits(0,0,q);
else if(BLINK_2==3)
RGB_LED_Write_24Bits(q,q,0);
else if(BLINK_2==4)
RGB_LED_Write_24Bits(0,q,q);
else if(BLINK_2==5)
RGB_LED_Write_24Bits(q,0,q);
delay_ms(1);
}
else
{
}
}
}
}

最后将代码下载到STM32芯片中,将完成的电路板连接到控制显示屏,保证供电稳定。 然后RGB灯的亮度和颜色可以通过控制 STONE 控制显示模块。
最终的硬件连接图

控制-WS2812B_RGB-lamp-by-STONE-显示模块

运行效果

控制-WS2812B_RGB-lamp-by-STONE-显示模块

控制-WS2812B_RGB-lamp-by-STONE-显示模块

滚动到顶部