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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2376|回復: 5
打印 上一主題 下一主題
收起左側

WS2812如何用單片機程序調光?求指導思路

[復制鏈接]
跳轉到指定樓層
樓主
ID:1015077 發表于 2022-5-15 22:05 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
100黑幣
看網上說改變RGB值就可以,但是改變RGB值后顏色不也會跟著變嗎?目前主要是用STC15系列單片機來控制2812,想做一個四檔亮度,上電最亮,用按鍵控制,按下一次就降低一個亮度檔次

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:824490 發表于 2022-5-16 09:01 | 只看該作者
正常來講,RGB這3個顏色的值一樣就能出白光。所以,改變亮度就要RGB同減同加就OK了
回復

使用道具 舉報

板凳
ID:844772 發表于 2022-5-16 09:09 | 只看該作者
人眼對RGB三色的敏感不同,所以即使相同的比例的變化,顏色也會變化的,你只要求四擋,其實很容易通過查色板或用ps等軟件上,查不同色對應的RGB值,然后你再微調就行了。
回復

使用道具 舉報

地板
ID:136485 發表于 2022-5-16 11:25 | 只看該作者
#include <STC15F2K60S2.H>
#include "intrins.h"

sbit WS2812 = P1^7;

#define numLEDs 8   //燈的個數
unsigned char buf_R[numLEDs] = {0};//顏色緩存
unsigned char buf_G[numLEDs] = {0};
unsigned char buf_B[numLEDs] = {0};

void RGB_Set_Up();  //送0碼
void RGB_Set_Down(); //送1碼



void HAL_Delay(unsigned int t)
{
                unsigned int x,y;
          for(x=114;x>0;x--)
          for(y=t;y>0;y--);
}


         
//復位延時
void Delay50us()                //@22.1184MHz
{
        unsigned char i, j;

        _nop_();
        _nop_();
        i = 2;
        j = 15;
        do
        {
                while (--j);
        } while (--i);
}


//1碼,高電平850ns 低電平400ns 誤差正負150ns
void RGB_Set_Up()
{
                WS2812 = 1;
          //經過邏輯分析儀調試的的延時
                _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
          _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();_nop_();
                WS2812 = 0;
}

//1碼,高電平400ns 低電平850ns 誤差正負150ns
void RGB_Set_Down()
{
                WS2812 = 1;
          //經過邏輯分析儀調試的的延時
                _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();  
                WS2812 = 0;
}

//發送24位數據
void Send_2811_24bits(unsigned char G8,unsigned char R8,unsigned char B8)
{
          
          unsigned int n = 0;
          //發送G8位
                for(n=0;n<8;n++)
                {
                        G8<<=n;
                        if(G8&0x80 == 0x80)
                        {
                                RGB_Set_Up();
                        }
                        else  
                        {
                          RGB_Set_Down();
                        }
                }
                //發送R8位
                for(n=0;n<8;n++)
                {
                        R8<<=n;
                        if(R8&0x80 == 0x80)
                        {
                                RGB_Set_Up();
                        }
                        else  
                        {
                                RGB_Set_Down();
                        }
                       
                }
                //發送B8位
          for(n=0;n<8;n++)
                {
                        B8<<=n;
                        if(B8&0x80 == 0x80)
                        {
                                RGB_Set_Up();
                        }
                        else  
                        {
                          RGB_Set_Down();
                        }
                }
}
//復位碼
void RGB_Rst()
{
                WS2812 = 0;
                Delay50us();
}
//把24位數據GRB碼轉RGB
void Set_Colour(unsigned char r,unsigned char g,unsigned char b)
{
          unsigned char i;
                for(i=0;i<numLEDs;i++)
          {
                                buf_R[i] = r; //緩沖
                          buf_G[i] = g;
                          buf_B[i] = b;
                }
                for(i=0;i<numLEDs;i++)
                {
                        Send_2811_24bits(buf_G[i],buf_R[i],buf_B[i]);//發送顯示
                }
}
//某一個點顯示的顏色
void SetPointColour(unsigned int num,unsigned char r,unsigned char g,unsigned char b)
{
          unsigned char i;
                for(i=0;i<numLEDs;i++)
          {
                                buf_R[num] = r;//緩沖
                          buf_G[num] = g;
                          buf_B[num] = b;
                }
                for(i=0;i<numLEDs;i++)
                {
                        Send_2811_24bits(buf_G[i],buf_R[i],buf_B[i]);//發送顯示
                }
}

//顏色交換24位不拆分發
void SetPixelColor(unsigned char num,unsigned long c)
{
          unsigned char i;
                for(i=0;i<numLEDs;i++)
          {
                                buf_R[num] = (unsigned char)(c>>16);
                          buf_G[num] = (unsigned char)(c>>8);
                          buf_B[num] = (unsigned char)(c);
                }
                for(i=0;i<numLEDs;i++)
                {
                        Send_2811_24bits(buf_G[i],buf_R[i],buf_B[i]);
                }
}

//復位
void PixelUpdate()
{
        RGB_Rst();
}
//顏色
unsigned long Color(unsigned char r, unsigned char g, unsigned char b)
{
  return ((unsigned long)r << 16) | ((unsigned long)g <<  8) | b;
}

//顏色算法
unsigned long Wheel(unsigned char WheelPos)
{
  WheelPos = 255 - WheelPos;
  if(WheelPos < 85)
        {
    return Color(255 - WheelPos * 3, 0, WheelPos * 3);
  }
  if(WheelPos < 170) {
    WheelPos -= 85;
    return Color(0, WheelPos * 3, 255 - WheelPos * 3);
  }
  WheelPos -= 170;
  return Color(WheelPos * 3, 255 - WheelPos * 3, 0);
}

//彩虹
void rainbow(unsigned int wait)
{
  unsigned int i, j;

  for(j=0; j<256; j++)
        {
    for(i=0; i<numLEDs; i++)
                {
      SetPixelColor(i, Wheel((i+j) & 255));
    }
                PixelUpdate();
    HAL_Delay(wait);
  }
}

//稍微不同的是,這使得彩虹均勻分布
void rainbowCycle(unsigned int wait)
{
  unsigned int i, j;

  for(j=0;j<256*5;j++)
        { // 5 cycles of all colors on wheel  車輪上所有顏色的5個循環
    for(i=0;i<numLEDs;i++)
         {
     SetPixelColor(i, Wheel(((i * 256 / numLEDs) + j) & 255));
    }
          PixelUpdate();
    HAL_Delay (wait);
  }
}

//Theatre-style crawling lights.呼吸燈
void theaterChase(unsigned long c, unsigned int wait)
{
        int j,q;
        unsigned int i;
  for (j=0; j<10; j++)
        {  //do 10 cycles of chasing  做10個循環
    for (q=0; q < 3; q++)
                {
      for (i=0; i<numLEDs; i=i+3)
                        {
        SetPixelColor(i+q, c);    //turn every third pixel on  把每一個第三個像素
      }
                        PixelUpdate();
      HAL_Delay(wait);

      for (i=0; i<numLEDs; i=i+3)
                        {
       SetPixelColor(i+q, 0);        //turn every third pixel off   把每一個第三個像素關掉
      }
                        PixelUpdate();
    }
  }
}

//Theatre-style crawling lights with rainbow effect
//帶有彩虹效果的戲劇式爬行燈
void theaterChaseRainbow(unsigned int wait)
{
        int j,q;
        unsigned int i;
  for (j=0; j < 256; j++)
        {     // cycle all 256 colors in the wheel 在輪子上循環所有256色
    for (q=0; q < 3; q++)
                {
      for (i=0; i < numLEDs; i=i+3)
                        {
        SetPixelColor(i+q, Wheel( (i+j) % 255));    //turn every third pixel off 把每一個第三個像素
      }
      PixelUpdate();

      HAL_Delay(wait);

      for (i=0; i < numLEDs; i=i+3)
                        {
        SetPixelColor(i+q, 0);        //turn every third pixel off  把每一個第三個像素關掉
      }
    }
  }
}

// Fill the dots one after the other with a color
//用一種顏色填充這些圓點
void colorWipe(unsigned long c, unsigned int wait)
{
        unsigned int i=0;
  for( i=0; i<numLEDs; i++)
        {
    SetPixelColor(i, c);
    PixelUpdate();
    HAL_Delay(wait);
  }
}

void main()
{
          
                while(1)
                {
                          rainbow(45);
        rainbowCycle(40);
        theaterChase(Color(0,0,255),80); // Blue
                          theaterChase(Color(0,255,0),80); // Blue
                          theaterChase(Color(255,0,0),80); // Blue
                    theaterChaseRainbow(40);
                                colorWipe(255,255);
                }
}
回復

使用道具 舉報

5#
ID:609524 發表于 2022-5-16 21:43 | 只看該作者
剛好我最近在搞這個東西,可以通過rgb轉hvs,然后再hvs轉回rgb,就可以純色調光了
回復

使用道具 舉報

6#
ID:609524 發表于 2022-5-16 21:47 | 只看該作者
楊天想 發表于 2022-5-16 21:43
剛好我最近在搞這個東西,可以通過rgb轉hvs,然后再hvs轉回rgb,就可以純色調光了

說錯了是hsv
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 四色成人av永久网址 | 久久精品a级毛片 | 黄 色 毛片免费 | 精精国产xxxx视频在线野外 | 欧美九九 | 久久久久久久国产精品视频 | 久草资源在线 | 欧美精品久久久久 | 欧美日韩亚洲国产 | 玖玖国产精品视频 | 国产剧情一区 | 午夜精品久久久久久久久久久久 | 日韩另类| 精品国产乱码久久久久久丨区2区 | 免费精品 | 国产色片 | 日本久久视频 | 国产一区中文字幕 | 一区二区三区国产精品 | 亚洲国产视频一区二区 | 免费一级毛片 | 久久精品一 | 日本精品一区二区三区在线观看 | 国产精品永久免费 | 国产欧美一区二区三区日本久久久 | 国产毛片毛片 | 国产视频二区在线观看 | 国产小视频精品 | 日本超碰| 国产粉嫩尤物极品99综合精品 | 精品国产欧美 | 精品三级在线观看 | 狼色网 | 日本三级在线视频 | 九九九色| 精品一级 | av天天看 | 久久久久一区二区三区 | 91 久久 | 欧美一级片久久 | 97高清国语自产拍 |