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