ESP32學習筆記:WS2812B驅動

?????? WS2812B是一款貼片RGB燈。由于采用了單總線通訊,所以需要特別關注下它的通訊時序。

?????

調試細節:

?????? 本來以為會是一個比較簡單的調試,結果還是花了很長時間才調試完成。

?????? 首先是關于ESP32的納秒級延時確定,當時按照空指令始終調試不出來。之前在STM32平臺上的nop()函數也不知道怎么用。

?????? 后來發掘出了一個比較簡單的辦法。就是一個個試,然后在main函數中按照1S的頻率打印調試信息來倒推ns級別的延時是否可靠。

?????? 注意:在ESP32不能使用空語句加;來進行空指令延時,需要使用操作語句。

unsigned long ns_delay_value = 0;void delay_100_ns(int data)
{unsigned char i;ns_delay_value = 0;for(i = 0; i < data; i++){ns_delay_value++;}
}void delay_1_us()
{delay_100_ns(10);
}void delay_1_ms()
{long i;for(i = 0; i < 1000; i++){delay_1_us();}
}void delay_1_s()
{long i;for(i = 0; i < 1000; i++){delay_1_ms();}
}

??????? 然后在main函數中按照1S的頻率打印調試信息:

while(1){printf("ws2812B demo system run ...\n");
//        vTaskDelay(1000 / portTICK_PERIOD_MS);delay_1_s();}

?????? 基本確定了ns級別延時后,就可以按照時序來寫ws2812的驅動函數啦。

*WS2812B Drive*/
#define WS2812B_GPIO               8
#define WS2812B_GPIO_ACTIVE_LEVEL  1
#define ws2812b_pin_set()          gpio_set_level(WS2812B_GPIO, 1)
#define ws2812b_pin_rst()          gpio_set_level(WS2812B_GPIO, 0)void ws2812b_writebyte(unsigned char data)
{unsigned char i;for(i = 0; i < 8; i++){if(data & 0X80){ws2812b_pin_set();delay_100_ns(3);ws2812b_pin_rst();delay_100_ns(3);}else{ws2812b_pin_set();delay_100_ns(1);ws2812b_pin_rst();delay_100_ns(3);}data <<= 1;}
}void ws2812b_write_rgb(unsigned char red_value, unsigned char green_value, unsigned char blue_value)
{ws2812b_writebyte(red_value);ws2812b_writebyte(green_value);ws2812b_writebyte(blue_value);
}

?????? 后來發現依然無法驅動,到了晚上才發現自己犯了一個低級錯誤。ESP32的IO口沒有進行初始化配置!

void ws2812b_gpio_init(void)
{gpio_config_t gpio_conf;gpio_conf.intr_type = GPIO_INTR_DISABLE;gpio_conf.mode = GPIO_MODE_OUTPUT;gpio_conf.pin_bit_mask = (1ULL << WS2812B_GPIO);if (WS2812B_GPIO_ACTIVE_LEVEL) {gpio_conf.pull_down_en = GPIO_PULLDOWN_DISABLE;gpio_conf.pull_up_en = GPIO_PULLUP_DISABLE;} else {gpio_conf.pull_down_en = GPIO_PULLDOWN_DISABLE;gpio_conf.pull_up_en = GPIO_PULLUP_ENABLE;}gpio_config(&gpio_conf);
}

?????? 配置完IO口就可以進行WS2812B驅動啦。不過還是出現了一些小bug,比如初始化第一次點燈,綠色燈珠總是會不受控制地自動點亮!后來發現在IO初始化函數前預先執行一次點亮指令就可以消除這個bug!Nice!

void app_main(void)
{ws2812b_write_rgb(0, 255, 0);ws2812b_gpio_init();delay_1_s();ws2812b_write_rgb(20, 20, 20);while(1){printf("ws2812B demo system run ...\n");
//        vTaskDelay(1000 / portTICK_PERIOD_MS);delay_1_s();}
}

???????

?????? 至此,ESP32對于WS2812B的驅動函數就調試完成啦。

?????? 對于這個說起來簡單但是異常曲折的小demo項目積累了如下經驗:

????? 1.ESP32的IO也是需要進行初始化配置的。

????? 2.MCU的單指令確實能夠進行粗略的ns級延時,為后續調試一些芯片時序提供了新的方法。

????? 3.ESP32的GPIO8需要使用一個10K電阻上拉3.3V,否則無法進行程序下載。

2023-05-04 細節補充

????? 1.在后續demo項目完善該驅動時,發現會出現初始化后,在別處點燈時,依然會出現亮出綠燈現象。

???? 后來增加了燈珠的復位函數:

void ws2812b_write_reset(void)
{unsigned int i = 0;ws2812b_pin_rst();for(i = 0; i < 300; i++){delay_1_us();}}

?????? 然后初始化變更為:

ws2812b_write_rgb(0, 255, 0);
ws2812b_gpio_init();
ws2812b_write_reset();
ws2812b_write_rgb(20, 20, 20);

?????? 如果需要在別的函數位置電燈,擇執行以下函數即可,親測有效。

ws2812b_write_rgb(0, 0, 0);
ws2812b_write_reset();
ws2812b_write_rgb(0, 0, 20);

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/13777.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/13777.shtml
英文地址,請注明出處:http://en.pswp.cn/web/13777.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux中的計劃任務(crontab)詳解

&#x1f407;明明跟你說過&#xff1a;個人主頁 &#x1f3c5;個人專欄&#xff1a;《Linux &#xff1a;從菜鳥到飛鳥的逆襲》&#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目錄 一、前言 1、Linux的起源與發展 2、什么是計劃任務&#xf…

超詳細的前后端實戰項目(Spring系列加上vue3)(一步步實現+源碼)前端篇(一)

最近想著一步步搭建一個前后端項目&#xff0c;將每一步詳細的做出來。&#xff08;如果有不足或者建議&#xff0c;也希望大佬們指出哦&#xff09; 前端初始化 1.根據vue腳手架創建vue項目 這里可以用很多方法創建vue項目&#xff0c;大家看著創建吧&#xff0c;只要能創建…

k8s 部署mqtt簡介

在Kubernetes&#xff08;K8s&#xff09;中部署MQTT&#xff08;Message Queuing Telemetry Transport&#xff09;服務通常涉及以下幾個步驟&#xff1a; 選擇MQTT Broker MQTT Broker是MQTT消息傳遞的中間件。流行的MQTT Broker包括Mosquitto, HiveMQ, EMQ X等。你需要選擇一…

機器學習面試問題總結 | 貝葉斯網絡

本文給大家帶來的百面算法工程師是機器學習中貝葉斯網路面試總結&#xff0c;文章內總結了常見的提問問題&#xff0c;旨在為廣大學子模擬出更貼合實際的面試問答場景。在這篇文章中&#xff0c;我們還將介紹一些常見的面試問題&#xff0c;并提供參考的回答及其理論基礎&#…

K8S Secret管理之SealedSecrets

1 關于K8S Secret 我們通常將應用程序使用的密碼、API密鑰保存在K8S Secret中&#xff0c;然后應用去引用。對于這些敏感信息&#xff0c;安全性是至關重要的&#xff0c;而傳統的存儲方式可能會導致密鑰在存儲、傳輸或使用過程中受到威脅&#xff0c;例如在git中明文存儲密碼…

FreeRTOS_事件組_學習筆記

事件組 原文鏈接 事件組是一個整數&#xff0c;其中的高8位留給內核&#xff0c;只能用其他位來表示時間 每一位代表一個事件&#xff0c;且每個時間的含義由程序員決定 1為發生&#xff0c;0為未發生 一個/多個任務或ISR都能讀寫這些位 可以等待某一位&#xff0c;也可以等待…

如何理解合約中的引用類型(3)——Mapping

映射&#xff08;mapping&#xff09; 聲明形式&#xff1a;mapping(key type > value type)keytype可以是除枚舉外的幾乎任何基本類型&#xff0c;包括bytes和string&#xff0c;不包括用戶自定義的復雜類型-合約&#xff0c;枚舉&#xff0c;結構&#xff0c;映射value t…

簡單美觀易上手的 Docker Compose 可視化管理器 Dockge

本文首發于只抄博客&#xff0c;歡迎點擊原文鏈接了解更多內容。 前言 Dockge 是 Uptime Kuma 作者的新作品&#xff0c;因此 UI 風格與 Uptime Kuma 基本一致&#xff0c;如果你正在使用 Uptime Kuma 的話&#xff0c;那么 Dockge 的 UI 設計應該也不會讓你失望。Dockge 主打…

智慧校園為高校帶來哪些價值

在21世紀的教育圖景中&#xff0c;"智慧"不再僅僅是一個科技名詞&#xff0c;它已成為衡量教育現代化水平的重要標志。智慧校園&#xff0c;這一融合了物聯網、大數據、云計算等先進技術的教育新形態&#xff0c;正逐步成為高校轉型升級的關鍵驅動力。本文將從多個維…

note-網絡是怎樣連接的2 協議棧和網卡

助記提要 協議棧的結構協議棧創建連接的實際過程協議棧發送數據包的2個判斷依據TCP確認數據收到的原理斷開連接的過程路由表和ARPMAC地址的分配MAC模塊的工作通過電信號讀取數據的原理網卡和協議棧接收包的過程ICMPUDP協議的適用場景 2章 用電信號傳輸TCP/IP數據 探索協議棧和…

BUUCTF靶場 [reverse]easyre、reverse1、reverse2

工具&#xff1a; DIE&#xff1a;下載&#xff1a;https://download.csdn.net/download/m0_73981089/89334360 IDA&#xff1a;下載&#xff1a;https://hex-rays.com/ida-free/ 新手小白勇闖逆向區&#xff01;&#xff01;&#xff01; [reverse]easyre 首先查殼&#xf…

如何理解HTML語義化

如何理解HTML語義化 HTML語義化&#xff0c;簡單來說&#xff0c;就是使用HTML標簽來清晰地表達頁面內容的結構和意義&#xff0c;而不僅僅是作為布局的容器。它強調使用具有明確含義的HTML標簽來描述頁面元素&#xff0c;而不是僅僅依賴CSS來實現頁面的外觀和布局。 理解HTM…

android 權限相關定義解釋

1 PID &#xff1a;程序一運行系統就會自動分配給進程一個獨一無二的PID&#xff0c;內部線程可以共享 該pid的分配的內存數據 2 UID&#xff1a;User Identifier,UID在linux中就是用戶的ID&#xff0c;表明時哪個用戶運行了這個程序&#xff0c;主要用于權限的管理。內部共享各…

【oracle003】圖片轉為字節、base64編碼等形式批量插入oracle數據庫并查詢

1.熟悉、梳理、總結下Oracle相關知識體系 2.歡迎批評指正&#xff0c;跪謝一鍵三連&#xff01; 資源下載&#xff1a; oci.dll、oraocci11.dll、oraociei11.dll3個資源文件資源下載&#xff1a; Instant Client Setup.exe資源下載&#xff1a; oci.dll、oraocci11.dll、oraoc…

Vue ref訪問這些元素或組件的實例

可以在任意DOM元素上使用ref屬性&#xff0c;然后在Vue實例中通過this.$refs訪問這個DOM元素 1.訪問子組件實例&#xff0c;可以調用方法或者獲取值 <template><div><input type"text" ref"myInput" /><button click"focusInp…

ubuntu手動替換源后,更新源時提示“倉庫.... jammy Release“ 沒有Release文件

問題如圖所示&#xff0c;由于問題不好定位&#xff0c;我就從替換源&#xff0c;以及解決錯誤提示這兩個步驟&#xff0c;來解決其中可能存在的問題。 1、替換源 這一步驟&#xff0c;網上的資料可以搜到很多&#xff0c;我跟著做了之后&#xff0c;總會冒出來各種各樣的小問…

皮影戲藝術品3D沉浸式展館提供非同一般的趣味體驗

引領藝術展示的未來&#xff0c;深圳華銳視點融合多年的web3d項目制作經驗&#xff0c;傾力打造3D虛擬藝術品展館在線編輯平臺&#xff0c;為您提供一個超越時空限制的線上藝術展示平臺。 一、極致視覺盛宴 我們擁有領先的美術團隊&#xff0c;運用先進的web3D開發技術&#xf…

可能是最適合PS的AI插件,設計師大救星!StartAI初體驗!不是恰飯

這款軟件雖然有一些功能需要完善&#xff0c;比如&#xff1a; 1&#xff1a;生成圖片產品海報&#xff0c;會出現圖隨意出現&#xff0c;跟設計圖起沖突&#xff0c;需要PS才可以正常使用它。 2&#xff1a;即使開會員也需要排隊生成。 3: 還有&#xff0c;會員沒有更加好用的…

vue3結合element-plus之如何優雅的使用表單組件

背景 在日常開發中,我們會經常使用 element-ui 或者是 antdesign 或者是 element-plus 等組件庫實現搜索功能 這里就需要用到相關表單組件 下面就以 element-plus 為例,我們實現一個搜索功能的組件,并且隨著屏幕尺寸的變化,其布局也會跟隨變化 最終大致效果如下: 這里…

詳解VLSM技術

在現代網絡設計中&#xff0c;如何高效地分配和管理IP地址是一個關鍵問題。傳統的子網劃分方法雖然簡單&#xff0c;但在實際應用中常常導致IP地址的浪費。為了應對這一問題&#xff0c;VLSM&#xff08;Variable Length Subnet Mask&#xff0c;可變長子網掩碼&#xff09;技術…