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