在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

零知開源——使用 GPIO 模擬時序驅動 WS2812B LED 燈帶

PCB56242069 ? 來源:PCB56242069 ? 作者:PCB56242069 ? 2025-02-20 15:43 ? 次閱讀

?利用零知增強版的GPIO 模擬時序

在本教程中,我們將探討如何使用 零知增強版的 GPIO 接口來模擬 WS2812B LED 燈帶的信號傳輸時序,從而實現對單色或多彩 LED 燈帶的控制。這種技術允許我們避開專用驅動庫,直接與硬件進行交互,理解并掌握 WS2812B 的通信機制。

一、工具原料

電腦、Windows系統

零知增強版開發板

Micro-usb

WS2812RGB燈

WS2812B 是一款內含控制器芯片的全彩 LED 燈珠,每個燈珠可以獨立顯示紅、綠、藍三色。它通過單一數據線接收命令,實現高精度顏色控制。

二、硬件連接

零知增強版 WS2812B
5V VCC
GND GND
51 Din

1、硬件連接示意圖

wKgZO2e23SWAbzzcAALcDy1Fozw229.png

2、實際效果

wKgZPGe23SaAUAZ8AARSqJQZKqs239.png

三、傳輸時序和顏色控制

1、信號傳輸時序

WS2812B 的數據傳輸遵循特定的時間序列:

高電平持續時間決定比特值:T1H 和 T0H 分別代表比特 1 和比特 0 的高電平持續時間。

低電平持續時間:T1L 和 T0L。

注:T1H為 800ns,T1L為 450ns 表示 1 比特。

T0H為 400ns,T0L為 850ns 表示 0 比特。

2、顏色控制

控制全局亮度和遵循WS2812B發送的時序:

通過brightness參數調節RGB燈的全局亮度

WS2812B協議發送時序為G -> R -> B

四、代碼驅動

1、相關定義和初始化

?// WS2812B相關定義
#define WS2812B_PIN 51      // WS2812B數據引腳
#define NUM_LEDS 8          // 燈珠數量
#define MAX_BRIGHTNESS 0.5  // 全局亮度調節(范圍:0.0 - 1.0)
 
// WS2812B控制協議時間(根據各自的時序進行修改該定義)
#define T1H 800
#define T1L 450
#define T0H 400
#define T0L 850
 
// 初始化WS2812B引腳
void setupWS2812B() {
    pinMode(WS2812B_PIN, OUTPUT);
    digitalWrite(WS2812B_PIN, LOW);
}
 
// 更精確的納秒延時函數(這里只是示例,實際可能需要更復雜的實現)
// 假設使用了支持納秒級延時的定時器庫
// 這里暫時使用簡單的微秒級延時近似
void delayNanoseconds(unsigned long ns) {
    delayMicroseconds(ns / 1000);
}

2、控制顏色和發送相關數據

?
// 發送一個比特
void WS2812B_SendBit(bool bitVal) {
    if (bitVal) {
        // 發送邏輯1
        digitalWrite(WS2812B_PIN, HIGH);
        delayNanoseconds(T1H);
        digitalWrite(WS2812B_PIN, LOW);
        delayNanoseconds(T1L);
    } else {
        // 發送邏輯0
        digitalWrite(WS2812B_PIN, HIGH);
        delayNanoseconds(T0H);
        digitalWrite(WS2812B_PIN, LOW);
        delayNanoseconds(T0L);
    }
}

// 發送一個字節
void WS2812B_SendByte(uint8_t byte) {
    for (int i = 7; i >= 0; i--) {
        WS2812B_SendBit(byte & (1  R -> B
    WS2812B_SendByte(green);
    WS2812B_SendByte(red);
    WS2812B_SendByte(blue);
}

3、實現流水燈、呼吸燈等功能

?
// 效果:彩虹追逐
void rainbowChaseEffect(uint8_t wait) {
    for (int offset = 0; offset < 255; offset++) {
        for (int i = 0; i < NUM_LEDS; i++) {
            int hue = (i * 255 / NUM_LEDS + offset) % 255;
            uint8_t r = 0, g = 0, b = 0;
            if (hue < 85) {
                r = 255 - hue * 3;
                g = hue * 3;
                b = 0;
            } else if (hue < 170) {
                hue -= 85;
                r = 0;
                g = 255 - hue * 3;
                b = hue * 3;
            } else {
                hue -= 170;
                r = hue * 3;
                g = 0;
                b = 255 - hue * 3;
            }
            WS2812B_SendColor(r, g, b, MAX_BRIGHTNESS);
        }
        delay(wait);
    }
}

// 呼吸燈效果
void breathAndFlow(uint8_t red, uint8_t green, uint8_t blue, uint8_t steps, uint16_t period, uint8_t wait, uint8_t iterations) {
    int ledStep[NUM_LEDS]; // 為每個 LED 創建一個步驟計數器
    for (int i = 0; i < NUM_LEDS; i++) {
        ledStep[i] = 0; // 初始化每個LED的步進
    }

    uint8_t cycleCounter = 0; // 添加循環計數器

    while (cycleCounter < iterations) { // 有限循環,迭代指定次數
        for (int i = 0; i < NUM_LEDS; i++) {
            // 計算當前 LED 的亮度比例
            float brightness = (sin(ledStep[i] * (M_PI / (steps))) + 1) / 2;
            WS2812B_SendColor(red, green, blue, brightness); // 使用計算出的亮度

            // 更新 LED 的步驟計數器,模擬呼吸效果
            ledStep[i] = (ledStep[i] + 1) % (steps * 2); // 確保計數器在達到兩倍步驟后重置

            // 計算每個步驟的時間間隔
            delayMicroseconds(period / steps);
        }
       
        // 在一輪呼吸之后關閉所有燈
        clearAllLeds();

        // 增加循環計數器
        cycleCounter++;

        // 根據需要添加延遲,雖然這不是必須的
        delay(wait);
    }
}

// 增加一個狀態變量來記錄是否有顏色覆蓋
bool isCovered = false;

// 流水燈
void ShampEffect(uint8_t red, uint8_t green, uint8_t blue, uint8_t trailDecay, uint8_t wait) {
    // 特殊處理第一個燈
    WS2812B_SendColor(red, green, blue, MAX_BRIGHTNESS);
    // 從第二個燈開始的索引為1
    for (int i = 0; i < NUM_LEDS; i++) {
        for (int j = 0; j <= NUM_LEDS; j++) {
            if (i - j == 0) {
                if (!isCovered) {
                    // 如果沒有被覆蓋,設置為綠色
                    WS2812B_SendColor(0, 0, 0, MAX_BRIGHTNESS);
                } else {
                    WS2812B_SendColor(red, green, blue, MAX_BRIGHTNESS);
                }
            } else {
                WS2812B_SendColor(0, 0, 0, MAX_BRIGHTNESS * trailDecay / 255.0);
            }
        }
        if (i == NUM_LEDS - 1) {
            // 當到達最后一個燈時,標記為已覆蓋
            isCovered = true;
        }
        delay(wait);
    }
}

4、控制燈的狀態

?
// 設置特定位置燈珠顏色
void setLedColor(uint8_t pos, uint8_t red, uint8_t green, uint8_t blue, float brightness) {
    if (pos < NUM_LEDS) {
        // 只發送前面燈珠的關閉信號,直到要設置顏色的燈珠位置
        for (int i = 0; i < pos; i++) {
            WS2812B_SendColor(0, 0, 0, 0);
        }
        // 設置目標燈珠顏色
        WS2812B_SendColor(red, green, blue, brightness);
        // 發送后面燈珠的關閉信號,從目標燈珠的下一個位置開始
        for (int i = pos + 1; i < NUM_LEDS; i++) {
            WS2812B_SendColor(0, 0, 0, 0);
        }
    }
}

// 設置所有燈珠顏色
void setAllLeds(uint8_t red, uint8_t green, uint8_t blue, float brightness) {
    clearAllLeds();// 先清除所有燈珠,確保沒有雜色
    for (int i = 0; i < NUM_LEDS; i++) {
        WS2812B_SendColor(red, green, blue, brightness);
    }
}

// 清除所有燈珠
void clearAllLeds() {
    for (int i = 0; i < NUM_LEDS * 3; i++) {
        WS2812B_SendByte(0);
    }
}

?

5、主循環

?
// 初始化
void setup() {
    setupWS2812B();
    clearAllLeds();  // 確保燈帶初始狀態關閉
}

// 主循環
void loop() {
    uint8_t Count = 0;
    //clearAllLeds();
    // 設置第六個燈珠為藍色
    //setLedColor(5, 0, 0, 255, MAX_BRIGHTNESS);
    //delay(500);
    while(Count < 10)
    {
      ShampEffect(0, 0, random(255), 256, 200);
      Count ++;
    }
   
    //rainbowChaseEffect(1000);
    breathAndFlow(0,255,0,5,50,100,100);
}

五、成果展示

將上訴代碼驗證后上傳到零知板,可以看到以下流水燈、呼吸燈等測試結果。

https://live.csdn.net/v/437153?spm=1001.2014.3001.5501
?

wKgZO2e23SaAcUrnAAEr8LvRUJ459.jpeg使用 GPIO 模擬時序驅動 WS2812B LED 燈帶


審核編輯 黃宇

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • led
    led
    +關注

    關注

    242

    文章

    23426

    瀏覽量

    664385
  • 燈帶
    +關注

    關注

    0

    文章

    19

    瀏覽量

    8954
  • 開源
    +關注

    關注

    3

    文章

    3442

    瀏覽量

    42824
收藏 人收藏

    評論

    相關推薦

    使用 GPIO 模擬時序驅動 WS2812B LED

    GPIO
    PCB56242069
    發布于 :2025年02月20日 14:47:01

    開源——使用 GPIO 模擬時序驅動 WS2812B LED

    ); breathAndFlow(0,255,0,5,50,100,100); } 五、成果展示將上訴代碼驗證后上傳到板,可以看到以下流水燈、呼吸等測試結果。 ? 使用 GPIO
    發表于 02-20 14:31

    開源——網頁控制WS2812B

    本帖最后由 PCB56242069 于 2025-2-20 15:33 編輯 ESP Color Picker\");client.println(\"Change Color \");client.println(\"\");client.println(\"
    發表于 02-19 18:50

    開源——玩轉WS2812B條模塊

    WS2812RGB 通過標準開發板平臺上驅動WS28
    發表于 02-19 17:25

    開源——玩轉WS2812B條模塊

    WS2812RGB ????? 通過標準開發板平臺上驅動
    的頭像 發表于 02-19 15:09 ?136次閱讀
    <b class='flag-5'>零</b><b class='flag-5'>知</b><b class='flag-5'>開源</b>——玩轉<b class='flag-5'>WS2812B</b><b class='flag-5'>燈</b>條模塊

    標準板點亮WS2812B

    電路板
    PCB56242069
    發布于 :2025年02月19日 15:04:46

    【敏矽微ME32G070開發板免費體驗】點亮WS2812B

    一、簡介 板上集成了8顆RGB彩燈,但只需用到一個GPIO口,這是如何做到的呢?這節我們就點亮WS2812B展開話題。WS2812B是一個集控制電路與發光電路于一體的智能外控LED光源
    發表于 01-07 23:58

    基于瑞薩FPB-RA4E2智能床頭燈項目——1編譯環境搭建與點亮驅動ws2812全彩LED

    /*ws2812b珠數量*/ #defineWS2812B_AMOUNT16 typedefstruct { uint8_tR; uint8_tG; uint8_tB
    發表于 11-22 21:34

    論如何使用WS2812以及類似

    ? ?WS2812 LED珠,這是一種非常流行的可尋址RGB LED。每個WS2812 LED
    的頭像 發表于 09-30 15:11 ?709次閱讀
    論如何使用<b class='flag-5'>WS2812</b>以及類似<b class='flag-5'>燈</b>珠

    在AvaotaA1全志T527開發板上驅動WS2812 RGB LCD

    對應 R,G,B 三種顏色)數據,剩余的數據經過內部整形處理電路整形放大后通過 DO 端口開始轉發輸出給下一個級聯的 LED 。因此,每經過一個 LED ,數據減少 24bit。 WS28
    發表于 07-22 10:45

    ESP32-S3控制WS2812顯示異常如何解決?

    本人用ESP32S3設計一款產品,在用ESP32-S3控制WS2812時出現多顯示異常,珠無法正常顯示。(顏色和位置都不對),異常率
    發表于 06-05 06:17

    【Vision Board創客營連載體驗】利用 OpenMV 實現 AprilTag 跟蹤以及通過串口通訊控制 Arduino 驅動 LED

    作為下位機接收坐標信息并將信息轉化為 LED 矩陣坐標,再通過 FastLED 庫實現對 WS2812b LED 操控。 開發現況
    發表于 05-31 00:01

    STM32F030 MDA+PWM驅動ws2812b,起始的50US的低電平是怎么產生?

    STM32F030 MDA+PWM 驅動 ws2812b,起始的50US的低電平怎么產生? 現在dma+pwm,倒是可以產生一個800K hz的驅動數據,但是WS2812要求有50US
    發表于 04-12 07:23

    STM32F051C8 PA0不能以DMA的方式輸出PWM,沒有正確波形輸出是哪里出了問題?

    實現功能:用STM32F051C8的PA0驅動WS2812B 彩色LED條; 實現方法和工具:1.使用Cubemx 生成代碼;2.配置PA0,PA0為PWM輸出; 配置方式:打開Cu
    發表于 03-13 06:20

    麥爵士madrix麥覺仕幻彩燈條的基本認識以及測點編程調試方法解析

    第一,幻彩的分類幻彩(,點光源,線條)可以分為3大類,第一種是單線SPI/TTL協議,最常見就是VVC(正極)-DAT(數據線)-GND。海外最知名的型號是WS2812B相比來說
    的頭像 發表于 02-27 20:58 ?5811次閱讀
    麥爵士madrix麥覺仕幻彩燈條<b class='flag-5'>燈</b><b class='flag-5'>帶</b>的基本認識以及測點編程調試方法解析
    主站蜘蛛池模板: 国产自产视频在线观看香蕉 | 午夜手机看片 | 性 色 黄 一级| 激情六月天婷婷 | 狠狠色综合久久婷婷 | 双性受粗大撑开白浊 | 日韩一级片在线播放 | 日韩三级免费看 | bt种子搜索在线 | 日本一道高清不卡免费 | 日日日天天射天天干视频 | 午夜看一级特黄a大片黑 | 欧美色图狠狠干 | 免费h视频| 久久国内视频 | 亚洲电影天堂网 | 欧美高清免费一级在线 | 一区| 日本三级三级三级免费看 | 美女扒开尿口让男生添 漫画 | 亚洲免费黄色网 | 色站视频| 五月天婷婷网站 | 一级毛片真人免费观看 | 日本口工禁漫画无遮挡全彩 | 人人97| 免费中国jlzzjlzz在线播放 | 色婷婷色丁香 | 丁香月婷婷 | 欧美一级视频在线 | 四虎影视在线影院在线观看 | 国产在线观看黄色 | 国产精品丝袜在线观看 | 中文字幕一二三四区2021 | 国产精品高清久久久久久久 | 夜夜操夜夜操 | 亚洲午夜精品久久久久久人妖 | 97理论三级九七午夜在线观看 | 三级黄色a | 日韩三级| 人人草人 |