--- title: MicroPython 在 ESP32 的多重開機 image: https://i.imgur.com/StMwgZz.jpg disqus: paoyung --- # MicroPython 在 ESP32 的多重開機 ###### tags: `ESP32` `MicroPython` > [color=#58f][name=Paoyung][time=May 24, 2022] [:snake: ℳ𝒾𝒸𝓇ℴ𝒫𝓎𝓉𝒽ℴ 隨手記](/@PaoyungChang/mpy_trifiles) > [color=orange] > - <span class="f_sz11">ESP32 的開發板有很多種,本文配搭 MicroPython 使用的 ESP32 開發板按鈕為 GPIO_0、LED 為 GPIO_2,脚位相同的應該可運作,ESP32-S2 或 ESP32-C3 請自行查詢脚位修改程式。CircuitPython 的指令略有不同,且預設情況下檔案區為唯讀, 不適合以下的範例,但概念是一樣的,需自行修改。</span> > - <span class="f_sz11">其它 MicroPython 支援的 MCU 也適用此概念。</span> 模組載入時機 --- MicroPython 並不限定在 global 中 import module,在 function 裡 import 也是可行的,以下的簡短架構執行起來是沒有問題的。 ```python= 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 模組來一起完成。 > [color=orange][KeyValue 模組說明](/BkyXYJzY9) 繼續看以下的例子: {%gist 9034d59823ac271a5a34719e96ddf712 %} > [color=darkgreen] > - <span class="f_sz10">板上標註 EN 的為 Reset 按鈕</span> > - <span class="f_sz10">板上標註 IO0 的為 Boot 按鈕 (或 User 按鈕)</span> > - <span class="f_sz10">在上電或按 EN 前就已按了 IO0 是會進入 firmware 的 download mode,和我們要求的動作不同,請注意。</span> 原理說明 --- 以上的範例在一般正常開機時會依讀取 boot_mode 的 kv 值來判斷應該 import 哪一個模組來執行。若開機上電或按 EN(Reset) 後再接著按 IO0(Boot) 一直到閃第3下時放開,boot_mode 會存入 "admin",之後開機都是執行 `admin.py`;反之只要不是閃第3下時放開,boot_mode 則會存入 "user",以後開機一直都會執行 `user.py`。 懶人包 --- 可使用以下打包好的程式進行測試,上傳至 ESP32 後就可以執行了,但千萬記得先備份你自己在 ESP32 上的程式,以免被覆蓋掉而遺失資料。 > [color=orange][範例下載](https://bit.ly/39Sqykg) {%hackmd /@PaoyungChang/css_01 %} {%hackmd /@PaoyungChang/intro_v0702 %}
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up