本帖最后由 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 多彩显示效果
视频演示:
|