環境搭建
MicroPython介紹
MicroPython 是一種精簡版的 Python 程式語言,專門設計用於嵌入式系統和物聯網(IoT)開發。它提供了一個 Python 3 的子集,適用於資源受限的微控制器和微控制器環境。MicroPython 允許開發人員使用 Python 的簡潔語法和強大功能來編寫嵌入式系統的程式碼。
以下是一些關於 MicroPython 的要點:
-
特點:
- 小巧靈活:MicroPython 是一種輕量級的實現,適用於資源有限的裝置。
- 易於學習:對於已經熟悉 Python 的開發者來說,學習 MicroPython 是相對簡單的。
- 互動式 REPL:MicroPython 提供了互動式的 REPL(Read-Eval-Print Loop),方便除錯和快速原型開發。
- 物件導向程式設計:支援物件導向程式設計範例,包括類、物件和繼承等概念。
-
用途:
- MicroPython 適用於許多嵌入式系統和物聯網應用的開發,如感測器網路、自動化控制、物聯網裝置等。
- 它可以在各種微控制器和微控制器平臺上執行,例如 ESP8266、ESP32、STM32 等。
-
如何開始:
- 您可以從 MicroPython 官方網站(https://micropython.org/)下載適用於您的目標平臺的韌體。
- 使用 USB 連線您的開發板或裝置,您可以透過串列埠 REPL 與裝置互動。
- 透過編輯和上傳 Python 指令碼,您可以開始編寫和執行 MicroPython 程式碼。
-
語法:
- MicroPython 支援 Python 3 的語法和一些標準庫,但並非完全與 CPython 相容。
- 基本的 Python 語法、函式和類在 MicroPython 中基本都能工作,但某些高階特性和標準庫可能不被支援。
MicroPython 為嵌入式開發者提供了一個用 Python 進行程式設計的輕量級選項,讓開發者能夠更方便地利用 Python 的優勢開發嵌入式系統和物聯網裝置。
安裝Thonny
Thonny 是一款簡單易用的 Python 整合開發環境 (IDE),旨在幫助初學者和教育者快速入門 Python 程式設計。它提供了許多功能和工具,使得編寫、執行和除錯 Python 程式碼變得更加簡單和直觀。
下面是 Thonny 的一些特點和常用功能:
-
簡單易用:Thonny 的使用者介面設計簡潔直觀,適合初學者快速上手並開始編寫 Python 程式碼。
-
整合偵錯程式:Thonny 整合了 Python 的偵錯程式,可以幫助您在程式碼中查詢和修復錯誤,便於編寫穩健的程式。
-
程式碼補全:Thonny 提供程式碼補全功能,可以快速補全程式碼,減少編寫程式碼時的錯誤。
-
視覺化變數監視:在除錯過程中,Thonny 提供了視覺化的變數監視器,方便您跟蹤程式中的變數值。
-
檔案管理器:Thonny 提供了檔案管理器,可以輕鬆管理專案檔案和目錄。
-
整合 Package Manager:可以透過 Thonny 的整合 Package Manager 安裝、升級和管理 Python 的第三方庫。
-
支援不同的 Python 直譯器:允許您在 Thonny 中配置和切換不同版本的 Python 直譯器,以便於開發不同環境下的專案。
-
支援多平臺:Thonny 可在 Windows、macOS 和 Linux 等作業系統上執行,提供跨平臺的開發體驗。
Thonny官方網站
ESP8266系列環境搭建
基於Windows系統下,燒錄韌體到 ESP8266 模組,請按照以下步驟進行操作:
準備工作
- 下載韌體:首先,確保您已經從(官方網站)[https://micropython.org/download/ESP8266_GENERIC/]或適當的資源處下載了要燒錄到 ESP8266 上的韌體。通常,韌體檔案是一個二進位制檔案(.bin 格式)。
- 安裝燒錄工具:您需要安裝適用於 ESP8266 的燒錄工具。一個常用的工具是 esptool。
pip install esptool
燒錄韌體步驟
- 連線 ESP8266
使用 USB 轉 TTL 串列埠聯結器將 ESP8266 模組連線到計算機。確保選擇正確的串列埠和波特率。
電腦透過usb連線esp32,檢視esp32的埠號,我這裡是COM4口。
- 擦除 Flash
在燒錄新韌體之前,您可能需要擦除 ESP8266 上的 Flash 儲存器。這可以透過下列 esptool命令完成:
esptool --port COM4 erase_flash
確保將 COM4
替換為您的 ESP8266 的實際埠號。
擦除完成。
- 燒錄韌體
使用 esptool來燒錄韌體到 ESP8266。示例命令如下:
esptool --port COM4 --baud 460800 write_flash --flash_size=detect 0 ESP8266_GENERIC-20240602-v1.23.0.bin
--port COM4
: 指定 ESP8266 的串列埠號為COM4
。--baud 460800
: 指定波特率。write_flash
: 燒錄韌體到 Flash 儲存器。ESP8266_GENERIC-20240602-v1.23.0.bin
: 替換為您要燒錄的韌體檔名。
- 等待燒錄完成
燒錄過程需要一些時間。請耐心等待,直到燒錄進度完成。
- 重啟裝置
一旦韌體燒錄完成,斷開並重新連線 ESP8266 模組,或者透過復位將其重啟。
獲取 MicroPython REPL 提示
REPL 代表 Read Evaluate Print Loop,是您可以在 ESP8266 上訪問的互動式 MicroPython 提示的名稱。到目前為止,使用 REPL 是測試程式碼和執行命令的最簡單方法。
有兩種訪問 REPL 的方法:透過 UART 串行埠的有線連線,或透過 WiFi。
透過串列埠進行REPL
REPL 在 UART0 序列外圍裝置上始終可用,該外圍裝置連線到用於 TX 的引腳 GPIO1 和用於 RX 的 GPIO3。REPL 的波特率為 115200。如果您的板上有 USB 序列轉換器,那麼您應該能夠直接從您的 PC 訪問 REPL。否則,您將需要一種與 UART 通訊的方法。
使用Putty、MobaXterm等終端工具連線ESP8266開發版。
連續按多次Enter
鍵,出現>>>
提示符說明連線成功。
嘗試在提示符下鍵入以下內容:
>>> print('hello esp8266!')
hello esp8266!
如果你使用thonny開發編輯器,右下角可以直接選擇連線到的裝置。
配置WebREPL(網路瀏覽器互動提示)
連線WIFI
使用thonny編輯器,選擇開啟檔案,選擇從裝置中開啟。
選擇開啟boot.py檔案。
修改boot.py新增連線wifi程式碼:
# This file is executed on every boot (including wake-boot from deepsleep)
#import esp
#esp.osdebug(None)
import os, machine
#os.dupterm(None, 1) # disable REPL on UART(0)
import gc
import webrepl
def do_connect():
import json
import network
# 嘗試讀取配置檔案wifi_confi.json,這裡我們以json的方式來儲存WIFI配置
# wifi_config.json在根目錄下
# 若不是初次執行,則將檔案中的內容讀取並載入到字典變數 config
try:
with open('wifi_config.json','r') as f:
config = json.loads(f.read())
# 若初次執行,則將進入excpet,執行配置檔案的建立
except:
essid = input('wifi name:') # 輸入essid
password = input('wifi passwrod:') # 輸入password
config = dict(essid=essid, password=password) # 建立字典
with open('wifi_config.json','w') as f:
f.write(json.dumps(config)) # 將字典序列化為json字串,存入wifi_config.json
#以下為正常的WIFI連線流程
wifi = network.WLAN(network.STA_IF)
if not wifi.isconnected():
print('connecting to network...')
wifi.active(True)
wifi.connect(config['essid'], config['password'])
import time
time.sleep(5) #一般睡個5-10秒,應該綽綽有餘
if not wifi.isconnected():
wifi.active(False) #關掉連線,免得repl死迴圈輸出
print('wifi connection error, please reconnect')
import os
# 連續輸錯essid和password會導致wifi_config.json不存在
try:
os.remove('wifi_config.json') # 刪除配置檔案
except:
pass
do_connect() # 重新連線
else:
print('network config:', wifi.ifconfig())
if __name__ == '__main__':
do_connect()
webrepl.start()
gc.collect()
點選執行,輸入賬號密碼連線WIFI.
配置WebREPL服務
要配置 ESP8266 上的 WebREPL(Web-based REPL),您可以按照以下步驟進行操作:
- 啟用 WebREPL:
- 在 REPL 中輸入以下命令以啟用 WebREPL:
>>>import webrepl_setup
WebREPL daemon auto-start status: disabled #當前狀態:disabled
Would you like to (E)nable or (D)isable it running on boot?
(Empty line to quit)
> e #輸入e,開啟
Would you like to change WebREPL password? (y/n) y #輸入y,修改與設定密碼
New password (4-9 chars): 123456 #輸入密碼
Confirm password: 123456 #再次輸入密碼
Changes will be activated after reboot
Would you like to reboot now? (y/n) y #重啟生效
- 按照提示設定 WebREPL 密碼。這將設定一個用於連線 WebREPL 的密碼。
- 連線到 WebREPL:
使用串列埠連線ESP8266,在REPL輸入:
>>> import webrepl
>>> webrepl.start()
WebREPL server started on http://192.168.31.241:8266/
Started webrepl in normal mode
- 現在,您可以連線到 ESP8266 的 WebREPL。您可以使用代表ESP8266_IP的IP地址。
- 開啟瀏覽器並導航到
http://192.168.4.1:8266
。 - 輸入先前設定的 WebREPL 密碼以連線到 ESP8266。
-
使用 WebREPL:
- 一旦連線成功,您將可以透過 WebREPL 控制檯與 ESP8266 進行互動。
- 您可以在 WebREPL 控制檯中執行 Python 命令和指令碼,實時檢視輸出。
-
遠端控制 ESP8266:
- 透過 WebREPL,您可以遠端控制 ESP8266,執行程式碼並監視輸出。
- 還可以上傳和下載檔案,訪問裝置上的檔案系統等操作。
透過上述步驟,您可以配置並使用 ESP8266 上的 WebREPL,這使得與裝置互動更為方便。
ESP8266 使用教程
修改boot.py檔案
建立函式do_thing實現自定義功能塊的呼叫。
# This file is executed on every boot (including wake-boot from deepsleep)
# import esp
# esp.osdebug(None)
import os, machine
# os.dupterm(None, 1) # disable REPL on UART(0)
import gc
import webrepl
import time
def do_connect():
import json
import network
# 嘗試讀取配置檔案wifi_confi.json,這裡我們以json的方式來儲存WIFI配置
# wifi_config.json在根目錄下
# 若不是初次執行,則將檔案中的內容讀取並載入到字典變數 config
try:
with open("wifi_config.json", "r") as f:
config = json.loads(f.read())
# 若初次執行,則將進入excpet,執行配置檔案的建立
except:
essid = input("wifi name:") # 輸入essid
password = input("wifi passwrod:") # 輸入password
config = dict(essid=essid, password=password) # 建立字典
with open("wifi_config.json", "w") as f:
f.write(json.dumps(config)) # 將字典序列化為json字串,存入wifi_config.json
# 以下為正常的WIFI連線流程
wifi = network.WLAN(network.STA_IF)
if not wifi.isconnected():
print("connecting to network...")
wifi.active(True)
wifi.connect(config["essid"], config["password"])
import time
time.sleep(5) # 一般睡個5-10秒,應該綽綽有餘
if not wifi.isconnected():
wifi.active(False) # 關掉連線,免得repl死迴圈輸出
print("wifi connection error, please reconnect")
import os
# 連續輸錯essid和password會導致wifi_config.json不存在
try:
os.remove("wifi_config.json") # 刪除配置檔案
except:
pass
do_connect() # 重新連線
else:
print("network config:", wifi.ifconfig())
def do_thing():
try:
# 在這裡實現自定義的功能
finally:
pass
if __name__ == "__main__":
do_connect()
time.sleep(5)
webrepl.start()
gc.collect()
do_thing()
點亮LED燈
要實現簡單的 LED 點燈功能,您可以使用以下程式碼示例透過 ESP8266 控制 LED 燈點亮和熄滅:
MicroPython 程式碼示例
定義led.py
檔案。
import time
from machine import Pin
def led_light():
# 實現燈閃爍
led = Pin(2, Pin.OUT)
while 1:
led.value(1)
time.sleep(1)
led.value(0)
time.sleep(1)
修改boot.py
檔案,呼叫led_light
函式。
#...
from led import *
def do_thing():
try:
led_light()
finally:
pass
#...
實現步驟
-
連線 LED:將 LED 的正極連線到 ESP8266 的 GPIO 引腳(例如 GPIO 2),將負極連線到 GND 引腳。
-
透過 Thonny IDE 或 WebREPL 連線到 ESP8266,並將上面的程式碼上傳並執行。
-
LED 控制:
- 程式碼中的迴圈會使 LED 燈每隔一秒交替點亮和熄滅。
- 您可以根據需要調整延時時間來控制 LED 點亮和熄滅的頻率。
PWM 呼吸燈
def pwm_led():
# 實現呼吸燈
led2 = PWM(Pin(2))
led2.freq(1000)
while True: # 控制整體的重複 (1.從不亮到亮 2.從亮到不亮)
# 1.實現從不亮到亮
for i in range(0, 1024):
led2.duty(i)
time.sleep_ms(1) # 每隔1ms變化一次亮度
# 2.實現從亮到不亮
for i in range(1023, -1, -1):
led2.duty(i)
time.sleep_ms(1)
PC控制LED燈
準備工具
下載NetAssist網路除錯工具。
整體思路
-
esp8266連線wifi,讓其擁有IP地址
-
建立UDP Socket
-
接收UDP資料
-
根據接收到的UDP資料控制LED燈的亮滅
實現程式碼
新建main.py放到ESP8266根目錄。
from net import *
from machine import Pin
def main():
# 建立UDP套接字
udp_socket = creat_udp_socket()
# 建立GPIO引腳物件
LED2 = Pin(2, Pin.OUT)
# 接收UDP資料
while True:
recv_data, sender_info = udp_socket.recvfrom(1024)
print("{}傳送的資料,{}".format(sender_info, recv_data))
recv_data_str = recv_data.decode("utf-8")
print("解碼後的資料:{}".format(recv_data_str))
# 根據收到的UDP資料控制LED燈的亮滅
if recv_data_str == "on":
LED2.value(0)
print("開燈")
elif recv_data_str == "off":
LED2.value(1)
print("關燈")
if __name__ == "__main__":
main()
開啟NetAssist配置本地UDP服務。給對應埠傳送on
字元,燈會點亮,傳送off
字元,燈會熄滅。