Try   HackMD

MicroPython 在 ESP32 的多重開機

tags: ESP32 MicroPython

PaoyungMay 24, 2022

ℳ𝒾𝒸𝓇ℴ𝒫𝓎𝓉𝒽ℴ 隨手記

  • ESP32 的開發板有很多種,本文配搭 MicroPython 使用的 ESP32 開發板按鈕為 GPIO_0、LED 為 GPIO_2,脚位相同的應該可運作,ESP32-S2 或 ESP32-C3 請自行查詢脚位修改程式。CircuitPython 的指令略有不同,且預設情況下檔案區為唯讀, 不適合以下的範例,但概念是一樣的,需自行修改。
  • 其它 MicroPython 支援的 MCU 也適用此概念。

模組載入時機

MicroPython 並不限定在 global 中 import module,在 function 裡 import 也是可行的,以下的簡短架構執行起來是沒有問題的。

from machine import Pin def main(): #. 開發板上的按鈕 #. pcbBtn.value() 1: release ; 0:push pcbBtn = Pin(0, Pin.IN, Pin.PULL_DOWN) #. 開發板上的 LED #. pcbLed.on() is ON pcbLed = Pin(2, Pin.OUT, Pin.PULL_DOWN) #. 一般模式 if pcbBtn.value(): #. 進入主程式 import mainLoop mainLoop.main() else: #. 開機時偵測到按下了按鈕 #. 進入 AP 模式,以利使用瀏覽器進行 wifi 及其它設定 #. LED 亮起,以利識別在哪一種模式下 pcbLed.on() import webConfig webConfig.main()

任務分配

在某些應用上,設定程式和主程式是分開的,而拆開來執行則能更為靈活的在 MicroPython 中使用記憶體。在上面的例子中,開機時是否按下 GPIO_0 會導致載入不同的程式來執行,而 webConfig 和 mainLoop 這兩支程式則各自負責一部份的功能,分開來除了較易維護,也能以階段式的方式來撰寫,讓 coding 變得輕鬆些,聽起來是不是還不錯 (例子中的 mainLoop 和 webConfig 只是虚構的,若 import 會出現錯誤訊息)

但如何達成多重開機呢? 這需要 KeyValue 模組來一起完成。

KeyValue 模組說明

繼續看以下的例子:

  • 板上標註 EN 的為 Reset 按鈕
  • 板上標註 IO0 的為 Boot 按鈕 (或 User 按鈕)
  • 在上電或按 EN 前就已按了 IO0 是會進入 firmware 的 download mode,和我們要求的動作不同,請注意。

原理說明

以上的範例在一般正常開機時會依讀取 boot_mode 的 kv 值來判斷應該 import 哪一個模組來執行。若開機上電或按 EN(Reset) 後再接著按 IO0(Boot) 一直到閃第3下時放開,boot_mode 會存入 "admin",之後開機都是執行 admin.py;反之只要不是閃第3下時放開,boot_mode 則會存入 "user",以後開機一直都會執行 user.py

懶人包

可使用以下打包好的程式進行測試,上傳至 ESP32 後就可以執行了,但千萬記得先備份你自己在 ESP32 上的程式,以免被覆蓋掉而遺失資料。

範例下載

關於作者  

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

我是 𝙋𝙖𝙤𝙮𝙪𝙣𝙜,是 MicroPythonEspruino 的愛好者,一直認為:

「Maker 應該把重心放在應用上,而不該被語言工具限制了創意」

所以想藉由較為簡捷且詳細的解說讓更多人可以學習進而自由發揮,而非淪為只能將程式碼複製貼上的複製人,如果你認同這樣的理念,請一起為此目標努力,如果我的文章內容對你有幫助,請轉發或協助需要的人。

若有專案需求,請利用 連絡我,謝謝!