ESP32
MicroPython
PaoyungMay 24, 2022
ℳ𝒾𝒸𝓇ℴ𝒫𝓎𝓉𝒽ℴ 隨手記Image Not Showing Possible ReasonsLearn More →
- The image file may be corrupted
- The server hosting the image is unavailable
- The image path is incorrect
- The image format is not supported
- 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 模組來一起完成。
繼續看以下的例子:
- 板上標註 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 上的程式,以免被覆蓋掉而遺失資料。