摘 要:文中設(shè)計了一種基于ESP32的桌面智能小擺件。該小擺件系統(tǒng)由ESP32-S3微控制器、WM8978全功能音頻處理器、LCD觸摸屏幕顯示模塊、SD/TF卡讀寫模塊組成,具有時間顯示、天氣顯示、日歷顯示以及音頻播放等功能。該系統(tǒng)使用LVGL庫繪制相應(yīng)的UI界面并采用FreeRTOS實(shí)時操作系統(tǒng)進(jìn)行線程管理。經(jīng)測試,該小擺件系統(tǒng)能按照預(yù)設(shè)的功能進(jìn)行操作并顯示相應(yīng)的內(nèi)容。
關(guān)鍵詞:桌面智能小擺件;ESP32;嵌入式系統(tǒng);LVGL;FreeRTOS實(shí)時操作系統(tǒng);人機(jī)交互
中圖分類號:TP368.1 文獻(xiàn)標(biāo)識碼:A 文章編號:2095-1302(2024)11-00-04
0 引 言
隨著各種高性能、低功耗的控制芯片不斷涌現(xiàn),智能桌面擺件已成為一種時尚、個性化的物品。當(dāng)前網(wǎng)絡(luò)上雖已出現(xiàn)多種智能桌面擺件[1],但完整介紹并深入研究擺件設(shè)計的文獻(xiàn)卻很少。本文設(shè)計了一款基于ESP32的桌面智能小擺件,它是一款結(jié)合多種實(shí)用功能的智能產(chǎn)品,如音樂播放、天氣預(yù)報、圖片顯示、人機(jī)交互、時間和日歷顯示等,能夠提高人們的生活質(zhì)量和生活便捷性。該小擺件系統(tǒng)使用ESP-IDF框架[2-4]中的FreeRTOS[5]來實(shí)現(xiàn)多任務(wù)實(shí)時運(yùn)行。
1 總體方案設(shè)計
本文設(shè)計的智能小擺件系統(tǒng)以ESP32-S3模組作為核心模塊,實(shí)現(xiàn)時間顯示、天氣預(yù)報、日歷顯示、圖片顯示、音樂播放、屏幕背光設(shè)置等功能。圖1為桌面智能小擺件系統(tǒng)框圖。該系統(tǒng)上電后通過配置好的WiFi聯(lián)網(wǎng),再從NTP服務(wù)器獲取實(shí)時日期時間;根據(jù)IP獲取當(dāng)前城市,并通過HTTP GET方法獲取該城市的天氣數(shù)據(jù)。將這些從網(wǎng)絡(luò)上獲得的數(shù)據(jù)進(jìn)行解析后顯示到屏幕上。日歷顯示功能將通過LVGL圖形庫[6]網(wǎng)絡(luò)上的日歷數(shù)據(jù)繪制在屏幕上,并顯示當(dāng)前日期。圖片顯示功能則將SD卡內(nèi)的圖片文件讀出并顯示在屏幕上。音樂播放功能是從SD卡上讀取相應(yīng)的音樂文件并通過音頻處理芯片解析后播放出來。最后使用LVGL繪制一個菜單界面,通過上下滑動的方式進(jìn)行APP切換,點(diǎn)擊APP圖標(biāo)進(jìn)入到相應(yīng)的APP界面。向右滑動則是退出當(dāng)前APP。
2 硬件模塊設(shè)計
硬件設(shè)計方面主要包含:電源的設(shè)計、串口下載電路的設(shè)計、LCD驅(qū)動電路的設(shè)計、音頻編解碼電路的設(shè)計。通過這幾大模塊共同實(shí)現(xiàn)桌面智能小擺件的相應(yīng)功能。其中,電源電路設(shè)計實(shí)現(xiàn)了將TYPE-C接口提供的5 V電壓轉(zhuǎn)換至3.3 V電壓。圖2是ESP32引腳及其外接的網(wǎng)絡(luò)命名。
2.1 系統(tǒng)電源電路設(shè)計
主控模塊及其他模塊所需的工作電壓為3.3 V,本系統(tǒng)選用了具有固定輸出電壓的LDO芯片AMS1117S-3.3,用于對輸入電壓進(jìn)行穩(wěn)壓并輸出3.3 V電壓,如圖3所示。圖中,C5為輸入端濾波電容,C6、C7為輸出端濾波電容。
2.2 串口下載電路設(shè)計
為了將調(diào)試的代碼下載到ESP32中的主控芯片,將USB轉(zhuǎn)串口芯片CH343P通過串口引腳(如圖4中網(wǎng)絡(luò)名RXD0和TXD0)與ESP32電路板進(jìn)行連接。圖5則展示了實(shí)現(xiàn)程序自動下載的電路,引腳RTS和DTR通過2個三極管控制引腳EN及I/O0來選擇程序燒錄模式[7]。
2.3 LCD驅(qū)動電路設(shè)計
LCD屏幕通過SPI接口與ESP32連接,觸摸屏接口則通過I2C接口與ESP32連接。本設(shè)計使用的是裸屏并采用FPC座進(jìn)行連接,如圖6所示。LCD模塊配備了背光引腳,該引腳通過N溝道MOSFET晶體管AO3400A進(jìn)行控制,而具體的控制信號則來自引腳LCD_BL。
2.4 音頻編解碼電路設(shè)計
音頻編解碼芯片WM8978的I2S接口與ESP32連接(如圖7所示),同時還需要連接一些控制引腳,如復(fù)位引腳、MCLK時鐘引腳、左右聲道選擇引腳等。WM8978需要使用3.3 V電壓供電。WM8978的音頻輸入可以來自于麥克風(fēng)或線路輸入,音頻輸出可以連接耳機(jī)或揚(yáng)聲器[8]。在電路設(shè)計中,需要考慮音頻輸入輸出的電路設(shè)計,包括輸入輸出耦合電容、濾波電路等。WM8978的各項參數(shù)通過I2C總線進(jìn)行配置,如圖7中的WM_SDA及WM_SCL為I2C的2個引腳。
3 軟件程序設(shè)計
3.1 開發(fā)環(huán)境的搭建
本系統(tǒng)的ESP32開發(fā)環(huán)境是在Windows環(huán)境下搭建的。在安裝Visual Studio Code(簡稱VS Code)后繼續(xù)安裝ESP32插件,將VS Code配置成支持ESP32開發(fā)的IDE。ESP-IDF是一個用于ESP32和ESP32-S系列芯片的官方開發(fā)框架,提供了完整的開發(fā)工具鏈、SDK、示例代碼和文檔,可以幫助開發(fā)人員快速搭建ESP32開發(fā)環(huán)境,并開發(fā)出高效、穩(wěn)定的應(yīng)用程序。在開發(fā)過程中,程序的編寫、編譯需要在ESP-IDF框架下進(jìn)行,采用組件(component)的方式管理框架中的功能模塊,編譯前可通過make menuconfig指令管理各個組件,再使用VS Code進(jìn)行編譯,最后通過串口將程序傳到ESP32中。
3.2 FreeRTOS設(shè)備驅(qū)動框架
FreeRTOS是一種實(shí)時操作系統(tǒng),在實(shí)現(xiàn)上其僅提供操作系統(tǒng)內(nèi)核,包括任務(wù)管理、隊列管理、信號量管理、時間管理和內(nèi)存管理模塊,其設(shè)備驅(qū)動框架實(shí)現(xiàn)過程如下[9]:
(1)創(chuàng)建驅(qū)動程序:開發(fā)者需要編寫設(shè)備驅(qū)動程序來操作外設(shè),驅(qū)動程序需要實(shí)現(xiàn)特定的接口函數(shù),包括初始化、讀取、寫入等操作。
(2)創(chuàng)建設(shè)備對象:開發(fā)者需要創(chuàng)建設(shè)備對象來表示特定的外設(shè),設(shè)備對象需要包括一些基本的屬性,如名稱、ID、驅(qū)動程序指針等。
(3)注冊設(shè)備對象:開發(fā)者需要將設(shè)備對象注冊到系統(tǒng)中,通常使用類似于設(shè)備樹的方式進(jìn)行管理,以便系統(tǒng)能夠正確識別和操作這些設(shè)備。
(4)實(shí)現(xiàn)設(shè)備驅(qū)動框架:開發(fā)者需要實(shí)現(xiàn)設(shè)備驅(qū)動框架,以提供操作設(shè)備的標(biāo)準(zhǔn)接口函數(shù),這些接口函數(shù)通常包括打開、關(guān)閉、讀取、寫入等。
(5)使用設(shè)備對象:開發(fā)者可以使用設(shè)備對象來操作外設(shè),這樣可以方便地訪問和控制設(shè)備,同時也可以提高代碼的可讀性和可維護(hù)性。
在本系統(tǒng)設(shè)計中,主菜單程序及天氣界面的設(shè)計中用到了FreeRTOS的線程管理。
3.3 LCD觸摸屏的軟件程序設(shè)計
LCD觸摸屏的軟件程序設(shè)計包括初始化LCD屏幕以及觸摸屏模塊和相關(guān)驅(qū)動模塊的編寫。初始化設(shè)計包括SPI總線初始化、I2C總線初始化,以及LCD顯示參數(shù)和觸摸屏參數(shù)的設(shè)置等。在LCD顯示模塊的驅(qū)動程序編寫中實(shí)現(xiàn)了畫點(diǎn)、畫線、畫矩形、填充矩形、顯示字符等基本圖形顯示功能,并根據(jù)需要編寫了更高級的圖像顯示函數(shù)。對于觸摸屏模塊的驅(qū)動程序,編寫了讀取觸摸點(diǎn)坐標(biāo)的功能,并實(shí)現(xiàn)了根據(jù)觸摸點(diǎn)坐標(biāo)執(zhí)行相應(yīng)操作的能力。之后進(jìn)行了LVGL圖形庫的移植,并為LVGL圖形庫提供了適配的LCD顯示接口和觸摸接口。
3.4 圖片解碼的軟件程序設(shè)計
本設(shè)計中使用的圖片格式主要為PNG格式和JPG格式。PNG格式圖片解碼流程為:讀取PNG文件頭信息,包括寬度、高度、顏色類型、位深等;分離出PNG數(shù)據(jù)流中的各個chunk塊,如IHDR、IDAT、IEND等;解壓縮IDAT塊中的壓縮數(shù)據(jù),得到解壓縮的像素數(shù)據(jù);根據(jù)顏色類型和位深,將解壓縮后的像素數(shù)據(jù)轉(zhuǎn)化為RGB、RGBA或灰度像素數(shù)據(jù);將像素數(shù)據(jù)繪制到LCD屏幕上。JPG格式圖片的解碼流程為:讀取JPG文件頭信息,包括寬度、高度、顏色類型等;分離出JPG數(shù)據(jù)流中的各個marker,如SOF0、DQT、DHT、SOS等;根據(jù)DQT、DHT等數(shù)據(jù),對JPEG進(jìn)行解碼,得到解碼后的像素數(shù)據(jù);將像素數(shù)據(jù)轉(zhuǎn)化為RGB、RGBA或灰度像素數(shù)據(jù);將像素數(shù)據(jù)繪制到LCD屏幕上。在具體的程序設(shè)計中,需要使用相應(yīng)的庫函數(shù)或者開源庫來實(shí)現(xiàn)PNG和JPG的解碼,例如libpng、libjpeg等。同時,還需要根據(jù)具體的項目需求和硬件平臺特性進(jìn)行適當(dāng)?shù)膬?yōu)化,以提高解碼的效率和穩(wěn)定性。
3.5 主菜單的程序設(shè)計
在主菜單的程序設(shè)計中,首先需要創(chuàng)建一個容器,將其作為活動屏幕的子對象,以便在屏幕上顯示容器。之后設(shè)置容器的大小并關(guān)閉容器的滾動條,同時設(shè)置容器的彈性布局、容器的布局對齊方式、容器的滾動方向、容器的背景透明度和顏色、容器的邊框、容器內(nèi)部元素之間的間隙等。接著往這個容器中添加相應(yīng)的圖像按鍵。通過LVGL圖片轉(zhuǎn)換工具將圖片轉(zhuǎn)換為C數(shù)組的形式并放在程序中,通過調(diào)用LV_IMG_DECLARE將圖像數(shù)據(jù)聲明為程序中的常量,其中包含圖像的寬度、高度、像素格式和像素數(shù)據(jù),這些數(shù)據(jù)可供LVGL圖形庫使用,以便在圖形界面中顯示該圖像。最后通過調(diào)用lv_obj_scroll_to_view函數(shù)設(shè)置默認(rèn)顯示的APP圖標(biāo)。本設(shè)計創(chuàng)建了5個APP圖標(biāo),分別為天氣、日歷、圖片、音樂、設(shè)置,其中天氣圖標(biāo)如圖8所示。采用上下滑動的形式切換APP,同時為每個APP圖標(biāo)添加了事件回調(diào),點(diǎn)擊相應(yīng)APP圖標(biāo)可進(jìn)入到這個APP的界面中。通過右滑的方式退出當(dāng)前APP。起初在程序初始化完成后,通過xTaskCreate創(chuàng)建LVGL任務(wù)線程,顯示主菜單界面。
3.6 天氣時間界面的程序設(shè)計
在天氣時間界面的程序設(shè)計中,首先初始化本頁面用到的樣式,包括背景色、邊框顏色、邊框?qū)挾取?nèi)邊距、圓角半徑等。再初始化本頁面用到的控件,其中包括創(chuàng)建一個鋪滿屏幕的對象,在這個對象中添加城市、最高溫度、空氣質(zhì)量、溫度圖標(biāo)、濕度圖標(biāo)、時間、日期、溫度數(shù)據(jù)、濕度數(shù)據(jù)等,如圖9所示。接著為以上各類控件訂閱主題,以便能夠?qū)崟r更新時間、溫濕度、天氣等數(shù)據(jù)。再通過xTaskCreate創(chuàng)建天氣時間數(shù)據(jù)更新的任務(wù)線程,確保數(shù)據(jù)的實(shí)時性。而天氣的各類數(shù)據(jù)則通過HTTP客戶端的GET訪問心知天氣的API接口獲取,通過返回的JSON格式文本[10]解析所需要的數(shù)據(jù)。為了不占用系統(tǒng)資源,當(dāng)未打開天氣APP時,系統(tǒng)將掛起天氣時間數(shù)據(jù)更新的線程,以便讓出一部分的資源。
3.7 日歷界面的程序設(shè)計
在日歷界面的程序設(shè)計中,使用了LVGL圖形庫。首先需要創(chuàng)建一個父對象,可以是屏幕或其他容器;再使用lv_calendar_create函數(shù)創(chuàng)建一個日歷的對象,并將此對象添加到最開始創(chuàng)建的父對象中;接著通過調(diào)用設(shè)置對象大小和位置的API來設(shè)置這個日歷對象的大小和所在位置,并配置lv_calendar對象的屬性(如設(shè)置日歷的日期、設(shè)置日歷顯示的月份、設(shè)置日歷頭等),再通過調(diào)用lv_obj_update_layout函數(shù)更新日歷的參數(shù)。而對于日歷的日期顯示,則是通過連接WiFi后的NTP時間獲取到當(dāng)前的北京時間,接著將相應(yīng)數(shù)據(jù)解析后傳給日歷界面進(jìn)行顯示,其效果如圖10所示。
4 結(jié) 語
本文設(shè)計了一種基于ESP32桌面智能小擺件系統(tǒng)。實(shí)物測試顯示:該系統(tǒng)可以在桌面上以低功耗模式運(yùn)行,并支持?jǐn)U展和自定義,具有準(zhǔn)確、實(shí)時和便捷的信息展示功能,例如展示當(dāng)前時間、天氣預(yù)報等;在性能方面,該系統(tǒng)具有較高的穩(wěn)定性和響應(yīng)速度,能夠在不影響其他并行任務(wù)的情況下完成所有既定任務(wù)。
注:本文通訊作者為陳國泰。
參考文獻(xiàn)
[1]嘉立創(chuàng)EDA.立創(chuàng)開源硬件平臺[EB/OL]. [2023-11-11]. https://oshwhub.com/.
[2]冷宇.基于ESP32的遠(yuǎn)程家居控制系統(tǒng)設(shè)計[J].無線互聯(lián)科技,2022,19(24):86-88.
[3]樂鑫科技. ESP-IDF物聯(lián)網(wǎng)開發(fā)框架[EB/OL].(2023-10-02). https://www. espressif.com.cn/ zh-hans/products/sdks/esp-idf.
[4]郭志舒. 一種用于治療帶狀皰疹超聲波治療儀的研究[D].太原:中北大學(xué),2023.
[5] FreeRTOS官網(wǎng). FreeRTOS實(shí)時操作系統(tǒng)[EB/OL]. (2023-02-17). https://freertos.org/zh-cn-cmn-s/.
[6] LVGL官網(wǎng). Light and Versatile Graphics Library [EB/OL].(2023-03-01). https://docs.lvgl.io/8.3/index.html#.
[7]狄新宇,刁宇杰,朱泓宇,等.基于ESP32的智能物聯(lián)網(wǎng)臺燈設(shè)計[J].林業(yè)機(jī)械與木工設(shè)備,2023,51(1):47-51.
[8]牛帥,張弛,董振華,等. WM8978音頻處理器的百度AI語音識別[J].單片機(jī)與嵌入式系統(tǒng)應(yīng)用,2023,23(2):42-44.
[9]趙楠. 基于嵌入式技術(shù)的智能家居系統(tǒng)設(shè)計與實(shí)現(xiàn)[D].沈陽:東北大學(xué),2019.
[10]李貞輝.基于JSON的數(shù)據(jù)交換系統(tǒng)設(shè)計[J].電腦知識與技術(shù),2021,17(29):68-69.
作者簡介:陳鎧串(2000—),男,研究方向為嵌入式技術(shù)、物聯(lián)網(wǎng)技術(shù)。
陳國泰(1975—),男,博士,教授,研究方向為信號處理、電路技術(shù)。
收稿日期:2023-10-08 修回日期:2023-11-09
基金項目:福建省科技計劃自然科學(xué)基金項目(2021J01329)