久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6924|回復: 15
收起左側(cè)

STM32驅(qū)動WS2812呼吸燈、頻譜,變色變速旋轉(zhuǎn)源程序

  [復制鏈接]
ID:651494 發(fā)表于 2022-9-5 16:43 | 顯示全部樓層 |閱讀模式
網(wǎng)上看到些WS281例程,終究看不下去,動手寫了個來玩,希望能吊打全網(wǎng)你能隨便百度到的相關(guān)例程,源碼工程奉上:
特點:
1,硬件:STM32C8T6小板,WS2812 16leds燈環(huán),資源易得;
2,軟件:PWM+DMA+TIME3處理脈沖數(shù)據(jù)(比SPI選擇的端口多,隨便修改很多口可用)
               TIME4處理顯示花式,不使用delay,不影響主循環(huán)其余進程
               呼吸(算法有趣)
               頻譜(加上音樂AD到的 幅度數(shù)據(jù)即可動態(tài)跟隨)
               變色變速旋轉(zhuǎn)(給你一個定時器基準節(jié)拍,可以無限擴展各種時間,各種變量的控制,靈活使用timer)
               代碼簡潔易懂(對齊和括號強迫癥)
*如果喜歡,請回帖 ,開玩笑啦  :)

單片機源程序如下:
  1. #include "ws281x.h"
  2. #include "delay.h"
  3. #include "timer.h"


  4. u16 pixelBuffer[PIXEL_NUM + RESET_NUM][24] = {0};

  5. void ws281x_show(void)
  6. {               
  7.      DMA_SetCurrDataCounter(DMA1_Channel5,(PIXEL_NUM + RESET_NUM)* 24 );
  8.                                        
  9.             DMA_Cmd(DMA1_Channel5, ENABLE);
  10.      TIM_Cmd(TIM4, ENABLE);
  11.                                 

  12.             while(DMA_GetFlagStatus(DMA1_FLAG_TC5) !=SET);
  13.      DMA_Cmd(DMA1_Channel5, DISABLE );
  14.      DMA_ClearFlag(DMA1_FLAG_TC5);
  15.      TIM_Cmd(TIM4, DISABLE);                                                        
  16. }

  17. void ws281x_closeAll(void)
  18. {
  19.      uint16_t i;
  20.      uint8_t j;  
  21.      for(i = 0; i < PIXEL_NUM; i++)
  22.      {
  23.          for(j = 0; j < 24; j++)
  24.          {
  25.               pixelBuffer[i][j] = WS_LOW;
  26.          }
  27.      }
  28.                                         ws281x_show();
  29. }

  30. uint32_t ws281x_color(uint8_t red, uint8_t green, uint8_t blue)
  31. {
  32.      return ((green << 16) | (red << 8) | blue);
  33. }


  34. void ws281x_setPixelColor(uint16_t n ,uint32_t GRBcolor)
  35. {
  36.      uint8_t i;
  37.                                         if(n < PIXEL_NUM)
  38.      {
  39.           for(i = 0; i < 24; i++)
  40.           {                                                                        
  41.                                                                                      pixelBuffer[n][i] = ((GRBcolor << i) & 0X800000) ? WS_HIGH : WS_LOW;
  42.           }
  43.      }               
  44. }



  45. /**********************************************************************************************************/
  46. // level
  47. //  8               08   09
  48. //  7            07         10
  49. //  6          06             11
  50. //  5         05               12
  51. //  4         04               13
  52. //  3          03             14
  53. //  2            02         15
  54. //  1               01  16
  55. //  0 off            
  56. void ws281x_setPixelColor_ringleds(uint16_t n ,uint32_t GRBcolor)            //PIXEL_NUM:12/16/2*n Ring leds
  57. {
  58.        uint8_t i,k,p;
  59.                                                         
  60.                                                         for(i = 0; i < 24; i++)
  61.                                                  {                        
  62.                                                                                                         for(k = 0;(k < n) && (n <= (PIXEL_NUM / 2));k++)
  63.                                                                                                         {
  64.                                                                                                              pixelBuffer[k][i] = ((GRBcolor << i) & 0X800000) ? WS_HIGH : WS_LOW;
  65.                                                                                                              pixelBuffer[(PIXEL_NUM - 1) - k][i] = ((GRBcolor << i) & 0X800000) ? WS_HIGH : WS_LOW;                                                                                                
  66.                                                                                                         }
  67.                                                                                                         for(p = n;(p < ( PIXEL_NUM - n)) && (n <= (PIXEL_NUM / 2)) ;p++)
  68.                                                                                                         {
  69.                                                                                                              pixelBuffer[p][i]  =   WS_LOW;                                                                                                                                                                                                                                 
  70.                                                                                                         }                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        
  71.                                                         }
  72. }


  73. //  fill the dots one by one with a color on left and right sides at the same time
  74. void ws281x_colorWipe_lr( uint32_t c, uint8_t num)
  75. {
  76.     uint16_t i;
  77.                                 if(num > PIXEL_NUM / 2)
  78.                                 {
  79.                                      num = PIXEL_NUM / 2;
  80.                                 }
  81.     for(i = 0; i < (num + 1); i++)         //
  82.                   {                                                
  83.                                                                 ws281x_setPixelColor_ringleds(i ,c);
  84.                       ws281x_show();
  85.         //delay_ms(wait);          //>        0.05ms                                will should be using timer               
  86.     }
  87. }


  88. //Freq rising or falling lights
  89. void ws281x_colorWipe_freq(uint8_t type)
  90. {        
  91.                                                                                                                
  92.                  switch(type)
  93.                                                                                 {
  94.                                                                                        case 1:
  95.                         ws281x_colorWipe_lr(ws281x_color(50, 0, 0), ws281x_freq_num); // red
  96.                                                                                                                                                                                                 break;
  97.                                                                                               case 2:
  98.                         ws281x_colorWipe_lr(ws281x_color(0, 50, 0), ws281x_freq_num); // green
  99.                                                                                                                                                                                                 break;                                                                                                                                                               
  100.                                                                                                                                         case 3:
  101.                         ws281x_colorWipe_lr(ws281x_color(0, 0, 50), ws281x_freq_num); // Blue
  102.                                                                                                                                                                                                 break;               
  103.                                                                                                                                         case 4:
  104.                         ws281x_colorWipe_lr(ws281x_color(50, 50, 50), ws281x_freq_num); // white
  105.                                                                                                                                                                                                 break;               
  106.                                                                                                                                                                                        
  107.                                                                                                                                 default:
  108.                         ws281x_colorWipe_lr(ws281x_color(50, 0, 0), ws281x_freq_num); // red
  109.                                                                                                                                                                                                 break;                                       
  110.                                                                                 }                                                                                   
  111. }




  112. /***************************************************************************************************/
  113. uint32_t ws281x_colorTran(uint8_t tran,uint8_t color_mode)  //The colour is a transition r/g/b back to r/g/b(color_mode:Red1,Green2,Blue3). space 3
  114. {
  115.      tran = 255 - tran;
  116.      if(tran < 85)
  117.                                         {
  118.                                              switch(color_mode)
  119.                                                                                 {
  120.                                                                                        case 1:
  121.                         return ws281x_color(tran * 3, 0, 0);
  122.                                                                                               case 2:
  123.                         return ws281x_color(0, tran * 3, 0);                                                                                                                                                                                
  124.                                                                                                                                         case 3:
  125.                         return ws281x_color(0, 0, tran * 3);                                                               
  126.                                                                                                                                 default:
  127.                                                                                                                                         return ws281x_color(tran * 3, 0, 0);                                                
  128.                                                                                 }
  129.      }
  130.                                        
  131.      if(tran < 170)
  132.                                         {
  133.           tran -= 85;
  134.                                                                                 switch(color_mode)
  135.                                                                                 {
  136.                                                                                        case 1:
  137.                         return ws281x_color(255, 0, 0);
  138.                                                                                               case 2:
  139.                         return ws281x_color(0,255, 0);                                                                                                                                                                                
  140.                                                                                                                                         case 3:
  141.                         return ws281x_color(0, 0, 255);                                                               
  142.                                                                                                                                 default:
  143.                                                                                                                                         return ws281x_color(255, 0, 0);                                                
  144.                                                                                 }
  145.      }
  146.      tran -= 170;
  147.                                         switch(color_mode)
  148.                                         {
  149.                                                                                                 case 1:
  150.                                                                                                                                                         return ws281x_color(255 - tran * 3, 0, 0);
  151.                                                                                                 case 2:
  152.                                                                                                                                                         return ws281x_color(0, 255 - tran * 3, 0);                                                                                                                                                                                
  153.                                                                                                 case 3:
  154.                                                                                                                                                         return ws281x_color(0, 0, 255 - tran * 3);                                                               
  155.                                                                                         default:
  156.                                                                                                                                                         return ws281x_color(255 - tran * 3, 0, 0);                                                                                                                                                
  157.                                         }
  158. }


  159. void ws281x_colorblnCtrl(uint8_t color_mode)   // ws281x_bln_num use timer,mode:red1/green2/blue3
  160. {
  161.      uint16_t i;

  162.                                                                                         if( !(ws281x_bln_num == ws281x_bln_oldnum))
  163.                                                                                         {
  164.                                                                                                                         for(i = 0; i < PIXEL_NUM; i++)
  165.                                                                                                                         {
  166.                                                                                                                                                         ws281x_setPixelColor(i ,ws281x_colorTran(ws281x_bln_num,color_mode));
  167.                                                                                                                         }
  168.                                                                                                                         ws281x_show();
  169.                                                                                                                         ws281x_bln_oldnum = ws281x_bln_num;
  170.                                                                                         }
  171.                                 
  172. }
  173. /***************************************************************************************************/

  174. void ws281x_setPixelColor_wheel_leds(uint16_t n ,uint32_t GRBcolor)            //n:0~15 whirling leds
  175. {
  176.        uint8_t i,k;
  177.                                                         
  178.                                                         for(i = 0; i < 24; i++)
  179.                                                  {        
  180.                   for(k = 0;k < PIXEL_NUM;k++)
  181.                                                                                                                                                 {                                                                                                                                                                                                        
  182.                                                                                                                                                                                                         pixelBuffer[k][i]  =   WS_LOW;                                                                                                                                                                                         
  183.                                                                                                                                                 }                                                            

  184.                                                                                                              pixelBuffer[n][i] = ((GRBcolor << i) & 0X800000) ? WS_HIGH : WS_LOW;
  185.                                                                                                                                                 if( n < PIXEL_NUM/2)
  186.                                                                                                                                                 {
  187.                                                                                                                                                      pixelBuffer[n + (PIXEL_NUM/2)][i] = ((GRBcolor << i) & 0X800000) ? WS_HIGH : WS_LOW;        
  188.                                                                                                                                                 }
  189.                                                                                                                                                 else
  190.                                                                                                                                                 {
  191.                                                                                                                                                      pixelBuffer[n - (PIXEL_NUM/2)][i] = ((GRBcolor << i) & 0X800000) ? WS_HIGH : WS_LOW;        
  192.                                                                                                                                                 }                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        
  193.                                                         }
  194.                                                         ws281x_show();        
  195. }

  196. void ws281x_display(void)
  197. {
  198.                                      if(ws281x_led_display_mode == 1)
  199.                                                                         {
  200.                                                                         ws281x_colorblnCtrl(ws281x_bln_mode);
  201.                                                                         }
  202.                                                                         
  203.                                                                         if(ws281x_led_display_mode == 2)
  204.                                                                         {
  205.                                                                         ws281x_colorWipe_freq(ws281x_freq_color_type);
  206.                                                                         }
  207.                                                                         if(ws281x_led_display_mode == 3)
  208.                                                                         {
  209.                                                                                                         ws281x_setPixelColor_wheel_leds(ws281x_whirl_index,
  210.                                                                                                                                                                                                                                                                                                                                                                         ws281x_color(color_R[ws281x_whirl_colortran_index],
  211.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 color_G[ws281x_whirl_colortran_index],
  212.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 color_B[ws281x_whirl_colortran_index])) ;        
  213.                                                                         }     
  214. }







  215. /*
  216. void ws281x_setPixelColor_11x44leds(uint16_t n ,uint32_t GRBcolor)            //PIXEL_NUM:11x44 leds  n:0~10
  217. {
  218.        uint8_t i,k,p,q;
  219.                                                         
  220.                                                         for(i = 0; i < 24; i++)
  221.                                                  {                        
  222.                                                                                                         for(k = 0;k < 44;k++)
  223.                                                                                                         {
  224.                                                                                                               for(q = 0 ;q < (n +1);q++)
  225.                                                                                                                                                         {
  226.                                                                                                                                                       pixelBuffer[q + k*11][i] = ((GRBcolor << i) & 0X800000) ? WS_HIGH : WS_LOW;                                                                                                                                                                                
  227.                                                                                                                                                  }
  228.                                                                                                                                                         for(p = 1;p < (10-n);p++)
  229.                                                                                                                                                  {
  230.                                                                                                                                                                                          pixelBuffer[(n + p) + k*11][i]  =   WS_LOW;                                                                                                                                                                                                                                 
  231.                                                                                                                                                  }                                                                                                                                                                                                        
  232.                                                                                                         }                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        
  233.                                                         }
  234. }
  235. */
復制代碼

效果視頻
https://v.qq.com/x/page/u3354xdptxh.html

原理圖: 無
仿真: 無
Keil代碼下載: 程序.7z (180.19 KB, 下載次數(shù): 376)

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

ID:271166 發(fā)表于 2022-9-6 09:29 | 顯示全部樓層
看一看,研究下。
回復

使用道具 舉報

ID:371387 發(fā)表于 2022-9-7 11:25 | 顯示全部樓層
不寫注釋,真是一個不好的習慣
回復

使用道具 舉報

ID:262 發(fā)表于 2022-9-7 23:39 | 顯示全部樓層
好資料,51黑有你更精彩!!!
回復

使用道具 舉報

ID:958310 發(fā)表于 2022-11-8 14:22 | 顯示全部樓層
很牛的WS281驅(qū)動例程
回復

使用道具 舉報

ID:697462 發(fā)表于 2023-2-23 20:38 | 顯示全部樓層
原理圖能繼續(xù)分享一下嗎?
回復

使用道具 舉報

ID:731155 發(fā)表于 2023-2-24 09:33 | 顯示全部樓層
效果很贊,感謝分享,收藏備用
回復

使用道具 舉報

ID:698161 發(fā)表于 2023-3-27 14:19 | 顯示全部樓層
沙發(fā),收藏備用
回復

使用道具 舉報

ID:587318 發(fā)表于 2023-9-13 06:06 | 顯示全部樓層
下載來看看,確實很牛···還帶變速的,謝謝樓主分享,學習學習
回復

使用道具 舉報

ID:276663 發(fā)表于 2023-11-10 09:45 | 顯示全部樓層
幅度的動態(tài)跟隨,請大佬詳解
回復

使用道具 舉報

ID:398094 發(fā)表于 2023-11-22 09:28 | 顯示全部樓層
不寫注釋,真是一個不好的習慣
回復

使用道具 舉報

ID:1043068 發(fā)表于 2023-12-19 17:54 | 顯示全部樓層
就沖你這句吊打一切,無論能不能點亮,都要給你點贊
回復

使用道具 舉報

ID:1106184 發(fā)表于 2023-12-25 11:20 | 顯示全部樓層
博主,求求了,原理圖可以分享一下嗎
回復

使用道具 舉報

ID:651494 發(fā)表于 2023-12-26 15:43 | 顯示全部樓層
啦啦啦ajih 發(fā)表于 2023-12-25 11:20
博主,求求了,原理圖可以分享一下嗎

某一個寶買塊16 RGB的燈環(huán),然后買塊最小系統(tǒng)STM32F103C8T6板,再買個ST LINK下載小板,總共應該50元左右吧,把燈環(huán)輸入接電源+5V,GND,燈環(huán)數(shù)據(jù)輸入焊點DATA接最小系統(tǒng)板的PB8腳,然后編譯程序下載到單片機,再上電就可以看效果了,電路圖,你買這些小板老板都會給你圖紙的
回復

使用道具 舉報

ID:1093034 發(fā)表于 2024-2-29 11:47 | 顯示全部樓層
怎么玩啊,兄弟盟
回復

使用道具 舉報

ID:208271 發(fā)表于 2024-3-1 14:21 | 顯示全部樓層
感謝樓主!用C8T6測試過,程序完全可用,有三種模式,2812接PB8口,定時器自動切換模式,燈的數(shù)量不限,直接改參數(shù)即可。只是注釋確實太少,勉強看懂一點,再看看。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲国产一区视频 | 91看片免费版 | 久免费视频 | 国产一在线观看 | 久久成人av | 欧美日韩在线看 | 黄色一级视频免费 | 欧美精品成人 | 欧美视频免费 | 欧美一级一 | 日本电影免费完整观看 | 81精品国产乱码久久久久久 | 美女天天操| 欧美精品久久久久 | 国产成人在线视频 | 精国产品一区二区三区 | 久久久久久一区 | 欧美一区二区三区国产精品 | 久久中文字幕视频 | 成人在线观看黄 | 五月婷婷 六月丁香 | 国产精品揄拍一区二区 | 天堂视频一区 | aaa在线 | 色狠狠一区 | 国产伦精品一区二区三区高清 | 亚洲一区精品在线 | 成人免费视频观看视频 | 日韩精品成人在线 | 亚洲国产一区二区三区 | 综合色影院 | 天天插天天操 | 国产精品性做久久久久久 | 亚洲国产一区二区三区 | 亚洲男人的天堂网站 | 中文在线播放 | 亚洲精品一二区 | 欧洲一区视频 | 日本网站免费观看 | 欧美网站一区二区 | 欧美黑人一区 |