2024年9月19日 星期四

MicroPython 學習筆記 : 燒錄韌體與上傳函式庫

最近在測試 Google 的 Gemini 與 OpenAI 的 GPT API 時想說是否能在 ESP8266/ESP32 的 MicroPython 上串接這些 LLM 呢? 於是把塵封已久的開發板拿出來, 複習去年整理的筆記後將韌體刷新到最新版, 過程摘要整理如下, 參考前年底重新整理的筆記索引  :



1. 下載與燒錄 MicroPython 韌體 :    

目前最新為 v1.23 版, 參考下面這篇下載韌體與燒錄 : 


ESP8266/ESP32 開發板很多, 我常用的是 Witty Cloud (ESP8266), 此板內建按鈕 (GPIO4), 光敏電阻 (A0), 與一顆彩色 LED (GPIO12, 13, 15), 可以馬上進行 I/O 實驗 (露天大約 100 元). 




2. 上傳 xtools 函式庫 :   

此函式庫是我從陳會安老師寫的 "超簡單 Python/MicroPython 物聯網應用" 這本書中的範例增修而來的, 模組名稱照舊. 它包含三個 Python 程式與一個連線設定檔 config.py : 
  • config.py : 儲存 WiFi 連線資訊與 Line Notify 權杖
    SSID ='基地台 SSID'
    PASSWORD ='連線密碼'
    LINE_NOTIFY_TOKEN = 'Line Notify 權杖'
  • xtools.py : 連線基地台, 提出 HTTP 請求, 送出 Line 訊息等
  • xrequests.py : 有帶參數功能的 requests 模組, xtools 的 HTTP 請求會用. 
  • urlencode.py : 將查詢參數 query 字典轉成 URL 查詢字串, xrequests.py 會用到. 
  • ESP8266WebServer.py : 在 ESP8266/ESP32 上建立網頁伺服器
這些 Python 模組以 xtools.py 為主 (API 函式都放在這裡), xrequests.py 為副 (供 xtools.py 呼叫), 而 urlencode.py 為輔助模組 (供 xrequests.py 呼叫). xtools.py 中的函式如下表 :


 xtools.py 函式 說明
 get_id() 傳回開發板的 MAC 位址字串
 get_mac() 傳回開發板的 MAC 位址字串
 get_num(x) 傳回字串 x 中的數字 (含浮點數)
 random_in_range(low, high) 傳回 low~high 之間的整數亂數 (預設 0~1000)
 map_range(x, in_min, in_max,  out_min, out_max) 將數值 x 從 [in_min, in_max] 映射至 [out_min, out_max] 區間
 conect_wifi_led(ssid, passwd, timeout=15) 以密碼 passwd 連線 ssid 基地台 (15 秒內閃 LED), 成功 LED 恆亮並傳回所獲取之 IP 
 show_error(final_state=0) 閃爍板載 LED 3 秒以表示錯誤 (預設結束後恆亮)
 webhook_post(url, value) 利用 xrequests.py 模組送出 POST 請求, 失敗呼叫 show_error()
 webhook_get(value) 利用 urequests.py 模組送出 GET 請求, 失敗呼叫 show_error()
 line_msg(token, message) 使用 xrequests.py 模組送出 LINE 訊息 (POST)
 format_datetime(localtime) 將元組 localtime 轉成日期時間字串 'YYYY-MM-DD HH:mm:SS'
 scan_ssid() 掃描附近之熱點 (基地台), 印出其 SSID 與信號強度
 tw_now() 傳回現在台灣的日期與時間
 set_ap() 開啟 AP 模式並建立伺服器 192.168.4.1 以便設定要連線之熱點


其中 scan_ssid(), tw_now(), 與 set_ap() 是我加寫的函式, 呼叫 set_ap() 會開啟 AP 模式 (SSID 為 MicroPython-xxxxxx) 並建立一個網頁伺服器 (192.168.4.1), 可用手機或電腦連線至此網頁來設定 ESP8266/ESP32 要連線的熱點之 SSID 與密碼, 這樣就不需要 config.py 檔, 可以在案場動態設置 WiFi 連線, 15 秒內連線成功傳回 IP, 失敗傳回 None. 

將上面五個檔案壓縮成 lib.zip :


注意, 解壓縮後要去改 config.py 裡面的 SSID 與 PASSWORD 這兩個變數之值. 

可以使用 Thonny 將這五個檔案一次上傳到開發板, 但首先要在 "選項" 中更改直譯器為 ESP8266/ESP32 的 MicroPython :






這樣就可以在左邊的檔案管理框選取這四個 Python 檔案上傳到開發板根目錄下 :





上傳完成後左下角的 "MicroPython 設備" 檔案管理框就會出現這 4 個檔案了 (新版的 Thonny 已經可以一次上傳多個檔案到開發板) :




Windows 環境也可以用 AmpyGUI 軟體上傳, 參考 : 



3. 匯入函式庫測試 WiFi 連線 :   

在 Thonny 下方的互動視窗中匯入 config 與 xtools 這兩個模組, 呼叫 xtools 的 connect_wifi_led() 函式連線 WiFi 基地台 : 

MicroPython v1.23.0 on 2024-06-02; ESP module with ESP8266

Type "help()" for more information.

>>> import xtools   
>>> import config    
>>> ip=xtools.connect_wifi_led(config.SSID, config.PASSWORD)      
#4 ets_task(4020f540, 28, 3fffa050, 10)
Connecting to network...
network config: ('192.168.192.248', '255.255.255.0', '192.168.192.92', '192.168.192.92')

傳回 IP 表示連線成功. 

測試其它 xtools 函式 : 

>>> xtools.get_id()    
'14f5a800'
>>> xtools.get_mac()    
'e8:db:84:a8:f5:14'
>>> xtools.scan_ssid()   
              7N8F-1    b4:f2:67:13:36:5a     -87dBm
                HOME    bc:f6:85:ff:a0:e0     -75dBm
        ASUS_RT_AC52    10:7c:61:9d:30:18     -93dBm
   ASUS_RT_AC52-Plus    5c:27:d4:f3:82:22     -54dBm
       客廳 2.ynm,    fa:8f:ca:5d:f0:ec     -79dBm
>>> xtools.tw_now()   
Querying NTP server and set RTC time ... OK.
'2024-09-19 22:48:21'


2024-09-21 補充 : 




沒有留言 :