---
# System prepended metadata

title: 陳大 ming.py ESP32 字量極限
tags: [字庫, ESP32, MicroPython]

---

---
title: 陳大 ming.py ESP32 字量極限
image: https://i.imgur.com/FSuwrQV.jpg
disqus: paoyung
---

# 陳大 `ming.py` ESP32 字量極限
###### tags: `字庫` | `ESP32` | `MicroPython`

> [color=#58f][name=Paoyung][time=Jun 15, 2022]  [:snake: ℳ𝒾𝒸𝓇ℴ𝒫𝓎𝓉𝒽ℴ𝓃 隨手記](/@PaoyungChang/mpy_trifiles)

> [color=green] <span class="c_maroon">相關主題 👉 [微控制器上字庫的選擇](/@PaoyungChang/fonts_selection)</span>


Pinyin
---
在玩轉了幾回陳大 `ming.py` 後，突然想起之前的某個 POC 要顯示台灣 368 個行政區名稱和郵遞區號，本來打算要用 SSD1306 來顯示中文，但因為不想把手上僅剩不多的字庫 IC 給出去，索性將其換成 LCD1602，中文就轉成拼音(pinyin)。而現在有了字庫檔，於是重新思考該如何將其應用在類似的需求上了。 
|![](https://i.imgur.com/583s2lG.jpg)|![](https://i.imgur.com/mNAdneR.jpg)|
|--|--|

> [color=orange]<span class="c_brown f_sz10">使用字庫時需留意其授權之使用範圍，並依規定使用。</span>
> <span class="f_sz10">明體中文字庫前情提要： [陳大的 ming.py 試玩筆記](/@PaoyungChang/mpy_ming_py_prelude) | [陳大的 ming.py 試完筆記](/@PaoyungChang/mpy_ming_py_march)</span>


字量
---
首先要考量的是台灣 368 行政區加上郵遞區號會用上多少字呢? 出乎意料的只有 326 個字，加上額外的英文、數字及符號也才 388 個 ，於是馬上做出字庫檔來試試看。
```code
>>> 
MicroPython v1.18 on 2022-01-17; ESP32 module with ESP32
Type "help()" for more information.
>>> from ming_ac368 import words
>>> len(words)
388
>>> # 字庫字量為 388
>>> for each in '台北桃園新竹苗栗台中南投嘉義雲林高雄台南':
    print(words[each])
    
b'\x00\x00\x80\x01\x80.....\x10\xf0\x1f\x10\x10'
b'\x00\x00\xc0\x06@\x02....\x02\xc0BpB\x0e\xc2\x04|'
b'\x00\x00\x18\n\x08\nH....\t\x08\x89\x88\x88H\xf0'
b':::::::'
b'\x00\x00\x18\n\x08\x12H\.....\xfaR\x92\xfe\x02\x02'
b'\x00\x00\x80\x01\x80.....\x10\x10\xf0\x1f\x10\x10'
b'\x00\x00\x00\x03\x00A.....\xe4O\x04A\x04A\x04q\x04 '
>>> 
```
載入字檔 OK、上網也正常，這結果真是令人興奮，即代表之前的 POC 使用這個字庫檔是可以勝任的。但同時也再萌生了另一個想法，即 ESP32 可以載入的字量極限是多少呢?

挑戰
---
為方便測試可達字量，除了上述的台灣 368 字檔外，另外製作了不同字量的字庫檔以利測試，字檔內容以台灣 368 為基底，再從教育部 4808 常用字中隨機抽取以補足至設定之字量。測試程序如下：
1. 載入字庫檔。
1. 連上 WiFi。
1. 至網站 A 讀取資料：從 ifconfig.co 網站取得 IP Address，資料為少量文字資料。
    - 網址: https://ifconfig.co/ip
3. 至網站 B 讀取資料：從環保署使用 API 取得空氣品質數據(aqx_p_432)，資料為 json 格式資料。
    - 網址: https://data.epa.gov.tw/api/v2/aqx_p_432?api_key=user_api_key&format=json
4. 在 SSD1306 上顯示出數據。

> [color=orange]<span class="f_sz10 c_dark">使用 ESP32 + MicroPython v1.18。</span>
> <span class="f_sz10 c_dark">輸出之字庫檔有經過再處理，請參閱 [陳大的 ming.py 試玩筆記](/@PaoyungChang/mpy_ming_py_prelude)。</span>

測試
---
:beginner: **第一回合**

> [color=orange]<span class="f_sz10">:heavy_check_mark:功能正常 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; :x: 失敗 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; :heavy_minus_sign: 未測</span>

|字量|載入字庫|連上 WiFi|網站A|網站B|SSD1306|
|:--:|:--:|:--:|:--:|:--:|:--:|
|台灣368|:heavy_check_mark:|:heavy_check_mark:|:heavy_check_mark:|:heavy_check_mark:|:heavy_check_mark:|
|500|:heavy_check_mark:|:heavy_check_mark:|:heavy_check_mark:|:heavy_check_mark:|:heavy_check_mark:|
|1000|:heavy_check_mark:|:heavy_check_mark:|:heavy_check_mark:|:x:|:heavy_minus_sign:|
|1500|:x:|:heavy_minus_sign:|:heavy_minus_sign:|:heavy_minus_sign:|:heavy_minus_sign:|

此回合的重點在於找出大概的區間，於 1500 字時載入即以記憶體不足之錯誤訊息作收。而在 1000 字時尚能瀏覽少量資料的網站，但當訪問到環保署 OpenData 之類較多資料的網站時也已招架不住，故下回合要往下做調整。

:beginner: **第二回合**

|字量|載入字庫|連上 WiFi|網站A|網站B|SSD1306|
|:--:|:--:|:--:|:--:|:--:|:--:|
|950|:heavy_check_mark:|:heavy_check_mark:|:heavy_check_mark:|:heavy_check_mark:|:heavy_check_mark:|
|960|:heavy_check_mark:|:heavy_check_mark:|:heavy_check_mark:|:heavy_check_mark:|:heavy_check_mark:|
|975|:heavy_check_mark:|:heavy_check_mark:|:heavy_check_mark:|:x:|:heavy_minus_sign:|

第二回合 600 至 900 的區段皆通過測試，直至 950 左右才出現分岐點，最後測得安全的字量落在 950～960 左右，代表若有較多記憶體的需求，則需酙酌字數的調整，但整體來說，已能滿足一般的應用。

:beginner: **第三回合**
上兩回合使用的是常見的 ESP32 **WROOM** 版本，而市面上的 ESP32 還有一個 **WROVER** 的版本，它與一般的 ESP32 不同之處在於加載了 8MB 的 SPI PSRAM。

> [color=green] <span class="c_brown">常見的ESP32</span>

```python
MicroPython v1.18 on 2022-01-17; ESP32 module with ESP32
Type "help()" for more information.
>>> from micropython import mem_info
>>> mem_info()
stack: 672 out of 15360
GC: total: 111168, used: 2528, free: 108640
 No. of 1-blocks: 22, 2-blocks: 8, max blk sz: 32, max free sz: 6776
>>>
```
> [color=green] <span class="c_brown">ESP32 with SPIRAM</span>

```python
MicroPython v1.18 on 2022-01-17; ESP32 module (spiram) with ESP32
Type "help()" for more information.
>>> from micropython import mem_info
>>> mem_info()
stack: 704 out of 15360
GC: total: 4098240, used: 1568, free: 4096672
 No. of 1-blocks: 15, 2-blocks: 8, max blk sz: 18, max free sz: 255999
>>> 
```

由上可輕易的看出兩者之間記憶體有明顯的差別，而這回合要試探具備 SPIRAM 的 ESP32 能承受的字量又是多少呢?

|字量|載入字庫|連上 WiFi|網站A|網站B|SSD1306|
|:--:|:--:|:--:|:--:|:--:|:--:|
|1000|:heavy_check_mark:|:heavy_check_mark:|:heavy_check_mark:|:heavy_check_mark:|:heavy_check_mark:|
|2000|:heavy_check_mark:|:heavy_check_mark:|:heavy_check_mark:|:heavy_check_mark:|:heavy_check_mark:|
|3000|:heavy_check_mark:|:heavy_check_mark:|:heavy_check_mark:|:heavy_check_mark:|:heavy_check_mark:|
|4000|:heavy_check_mark:|:heavy_check_mark:|:heavy_check_mark:|:heavy_check_mark:|:heavy_check_mark:|
|4903|:heavy_check_mark:|:heavy_check_mark:|:heavy_check_mark:|:heavy_check_mark:|:heavy_check_mark:|

> [color=orange] <span class="c_brown f_sz10">字量 4903 字庫為教育部 4808 常用字加上英數字符號 95 個集合所成。 </span>

看起來很完美吧！至此已經達到非常驚人的字數量:scream:，但為何不再繼續往上測試呢? 因為光是載入 4903 字庫就要花費約 25 秒的時間，除非有特殊的使用需求，不然這樣的用法並不符合實用性:sweat:，所以就在這個常用字加英數符號的 4903 字庫劃下了句點。載入字庫所需耗費的時間記錄如下：
|字庫檔|台灣368|1000|2000|3000|4000|4903|
|:--:|:--:|:--:|:--:|:--:|:--:|:--:|
|秒數|0.8|2.4|6.4|11.7|18.3|25.5|

> [color=orange]<span class="c_brown f_sz10">秒數為手按碼表測得之數據，非精確數值，僅供參考。</span>

結論
---
對於擁有大容量的 ESP32 來說，字庫檔不失為一個在有限字量需求下解決中文顯示的好方法，雖然 WROVER 版本的 ESP32 能夠承載更多的字量，但執行速度的損耗使其並不具備絕對的優勢，亦或使用字庫 IC 更能取得平衡而達到較好的使用者體驗，希望本篇內容對有字庫需求的同好在進行評估時能有一些幫助。:+1:

![](https://i.imgur.com/VTRQDNX.jpg)
> [color=orange]<span class="c_brown f_sz10">使用字庫時需留意其授權之使用範圍，並依規定使用。</span>

<div style=" visibility: hidden">

</div>

{%hackmd /@PaoyungChang/css_01 %}

{%hackmd /@PaoyungChang/intro_v0702 %}


