本帖最后由 jinglixixi 于 2022-11-10 00:48 编辑
AVR64DD32开发板支持对WS2812彩灯的控制,可以指定彩灯的个数并通过编程来改变彩灯的显示效果。 这里采用的是一款有12个灯珠的环形模块,其静态显示效果如图1所示。 图1 色彩切换显示效果
其设置色彩的函数为: - static void WriteNeopixel(color_t color)
- {
- TCA0_Start();
- SPI0_ByteExchange(color.greenChannel);
- SPI0_ByteExchange(color.redChannel);
- SPI0_ByteExchange(color.blueChannel);
- TCA0_Stop();
- }
在指定灯珠个数的情况下,通过下面的函数可打量多个灯珠,其程序为: - static void WriteLEDsString(const color_t *frame)
- {
- uint8_t i;
- for(i = 0; i < NUMBER_OF_LEDS; i++)
- {
- WriteNeopixel(frame[i]);
- }
- }
要使用灯珠循环切换色彩的主程序为: - void main(void)
- {
- uint8_t i;
- color_t R1 = {100, 0, 0};
- color_t G1 = {0, 100, 0};
- color_t B1 = {0, 0, 100};
- while (1)
- {
- for(i = 0; i < 12; i++)
- {
- WriteNeopixel(R1);
- }
- _delay_ms(2000);
- for(i = 0; i < 11; i++)
- {
- WriteNeopixel(G1);
- }
- _delay_ms(2000);
- for(i = 0; i < 12; i++)
- {
- WriteNeopixel(B1);
- }
- _delay_ms(2000);
- }
- }
另外,还可实现彩灯的循环旋转效果和循环推进和收缩效果,见图2和图3所示。 图2 旋转效果 图3 渐进效果
实现色彩渐进的主程序为: - void main(void)
- {
- uint8_t i,j;
- color_t R1 = {100, 0, 0};
- color_t G1 = {0, 100, 0};
- color_t B1 = {0, 0, 100};
- color_t H1 = {0, 0, 0};
- while (1)
- {
- for(i = 0; i < 11; i++)
- {
- WriteNeopixel(H1);
- }
- _delay_ms(500);
- for(j = 0; j < 11; j++)
- {
- for(i = 0; i < 11; i++)
- {
- if(i<=j) WriteNeopixel(G1);
- }
- _delay_ms(1000);
- }
- }
- }
此外,还可以实现色彩的组合显示效果,见图4所示。 图4 多彩显示效果
视频演示:
|