本次制作中將要用到的是ESP-01S WIFI模塊。選擇它的原因主要是小巧,內置MCU并自帶WIFI功能,同時價格也是非常便宜,因此也被廣泛用于物聯網項目中,不過在這些應用中ESP-01S大都是以從機方式工作,主機通過AT指令與之通訊。不難看出,這種方式雖然降低了開發難度,卻也造成了一定的資源浪費,同時在性能上也帶來一些損失。
以下是ESP8266常見的幾種開發模式:
AT指令方式。這是最常見的開發模式,也是最簡單的一種方式,只要通過串口發送AT指令就可以控制,適合大多數具有串口的單片機系統。
直接使用SDK開發。這個難度比較大,需要對芯片和SDK提供的API比較熟悉。
NodeMCU方式。借助NodeMCU物聯網開發平臺,使用Lua腳本開發。需要額外燒寫固件。
Arduino方式。無需額外燒寫固件,有豐富的第三方庫資源。
MicroPython方式。與Arduino方式類似,但是需要額外燒寫固件。
相比較而言,以上的5種開發方式中,個人比較推薦使用Arduino方式,主要在于Arduino使用的是大家都熟悉的C/C++語言,另外還有豐富的第三方庫文件可以用來實現開發。MicroPython作為后來者雖顯劣勢,卻也是來勢洶洶,大有銳不可擋之勢,未來誰主天下也未嘗可知。
因為本文將要介紹的氛圍燈制作就要用到Arduino IDE,所以這里簡單講一下如何構建適合ESP8266開發的Arduino IDE環境。
- 打開Arduino IDE,依次點擊菜單項“文件”->“首選項”,然后會看到“附加開發版管理器網址”,填入http://arduino.esp8266.com/stable/package_esp8266com_index.json ,確認后重啟IDE。
- 打開Arduino IDE,依次點擊菜單項 “工具”->“開發板”->“開發板管理器”,搜索“ESP”,即可看到ESP8266社區提供的ESP8266插件,選擇最新的版本并安裝。
- 接下來在Arduino IDE菜單“工具”->“開發板”中選擇你正在使用的ESP8266開發板即可。
至此,Arduino IDE中ESP8266的開發環境就搭建完畢了。
下面進入正題,介紹如何在Arduino IDE開發環境中,制作這款ESP-01S的氛圍燈。這款氛圍燈主體為一個玻璃的礦泉水瓶,電路部分藏身于瓶蓋中,主控采用ESP-01S WiFi模塊,通過控制WS2812B全彩環形燈實現不同燈光模式的呈現。你能想象下圖中這個看似平淡無奇的水瓶,在改制成氛圍燈后,到底會呈現出怎樣奇幻的效果呢?讓我們拭目以待吧!
材料清單
實物接線圖
相比于ESP-01模塊,ESP-01S模塊的GPIO0、RST、EN均已配置上拉,使用時會方便些,這里將GPIO0作為微動按鍵的輸入端,模塊上電時長按微動按鍵使GPIO0為低電平即可進入程序燒寫模式。
實物裝配
圖中需要用到的元器件實物,分別是Micro USB接口板、ESP-01S模塊、5V轉3.3V模塊、WS2812BRGB全彩環形燈。
按照前面的實物接線圖,用導線將各模塊連接起來,這樣硬件連接部分差不多就好了。
接下來把瓶蓋處理一下,需要使用鉆頭和刻刀在其側面開出微動按鍵及Micro USB的孔位。要想把孔的位置和大小做得比較精確的話,手頭沒有合適的量具,只能反復的比對。
將前面焊接好的模塊放置到瓶蓋中。由于導線用的有點粗了,裝配時遇到不小的麻煩,好在最后還是把所有的東西都塞下了。
這是將所有模塊都安裝到位后的樣子,看起來是不是整齊多了。
先上個電試下燈。OK!沒有問題,彩燈全亮了!怎么樣?看起來效果還是十分酷炫吧!
把瓶蓋裝回去是這個樣子的。經過精心測量,按鍵的孔位以及按鍵的高度都恰到好處,手按過去不覺得突兀,按起來也不費力。
軟件編寫
首先打開Arduino IDE,在菜單“工具”->“開發板”中選擇你正在使用的ESP8266開發板即可。這里我們選“Generic ESP8266 Module”。
在Arduino IDE中,對WS2812B全彩LED的控制,可以通過引用Adafruit NeoPixel庫來實現。不需要自己花時間鉆研WS2818B的手冊后再來編寫驅動代碼。這就是Arduino開源平臺最值得稱道之處,有非常豐富的第三方庫函數可用,真是省時又省力,可以說是瞬間拉低了程序員的門檻。如果你的Arduino IDE中沒有NeoPixel庫,可以通過菜單“工具”->“管理庫...”或“項目”->“加載庫”->“管理庫...”,搜索“NeoPixel”即可看到Adafruit NeoPixel庫,選擇最新版本安裝即可。
要使用NeoPixel庫函數,在源文件中把相關的頭文件包含進來就可以了。推薦使用傻瓜式操作,通過菜單“項目”->“加載庫”從右側彈出的庫列表中選擇“NeoPixelBus”即可。
編輯器自動將以下三個頭文件NeoPixelAnimator.h、NeoPixelBrightnessBus.h、NeoPixelBus.h添加至源代碼中。另外,為了實現單按鍵操作,引入Ticker庫用來對按鍵計時,以實現對短按、長按操作進行識別。
通過模版類NeoPixelBus創建strip對象,實現對WS2812B全彩的操控。這里選擇NeoGrbFeature、NeoEsp8266AsyncUart1Ws2812Method類定義的方法實現WS2812B要求的控制協議。PixelCount的數值按所用燈環中LED燈珠的數目設置。PixelPin是用來指定控制WS2812B模塊的引腳,對于ESP8266的板子來說可以忽略,默認就是使用GPIO2。
接下來就是氛圍燈功能實現部分的代碼,主要實現這樣功能:按鍵短按時,可在純色模式和旋轉流水燈模式下,指定燈光顏色,有紅、橙、黃、綠、青、藍、紫、白八色可選;按鍵長按約1秒時,可順序切換四種燈光模式,純色模式、旋轉流水燈模式、彩色漸變模式、幻彩模式;按鍵長按約5秒時,關閉燈光。具體的實現方法可以參考附件中的代碼,限于篇幅這里就不一一介紹了。
代碼燒寫
燒寫代碼時,按下圖將USB串口工具與ESP-01S連接好即可。需要注意的是,在上電時,將ESP-01S模塊的GPIO0腳接地即可進入代碼燒寫模式。
給ESP-01S模塊燒寫代碼與通常情況下對Arduino UNO燒寫幾乎沒有差別。只是因為ESP-01S模塊是通過串口工具供電,所以每次燒寫前需要將USB串口工具從電腦的USB口拔除,然后將ESP-01S模塊得GPIO0拉低,重新將USB串口工具插到電腦的USB口,這樣重新上電后ESP-01S即可進入燒寫狀態。注意!因為串口工具有拔插過,所以燒寫時要在到菜單 “工具”-〉“端口”中選擇對應的串行口。
****成品效果****
終于到了最后展示成果的時間了,燈光亮起的瞬間感覺有些驚艷到了,從LED發出的各色光線經過水瓶的折射,光影交織竟然呈現出五彩斑斕、五光十色、萬紫千紅、鮮艷奪目、斑駁陸離、五彩紛呈、花團錦簇、云蒸霞蔚、花色斑斕、姹紫嫣紅、云興霞蔚、五顏六色、異彩紛呈的奇幻景象,折騰多日也算是值了。
下面是動圖的效果。轉化為GIF顏色有些損失,成色塊了,感覺也不錯哦,又是另外一番效果。
你還等什么,趕快也動手做一個吧!