No Code AI(肉寇)AI自動化兩日精通|實體6小時+線上6小時
|

【CAVEDU講堂】使用 Raspberry Pi Pico W 和 MicroPython 開發物聯網應用

   

作者:CAVEDU 教育團隊

當我們提及物聯網(IoT, Internet of Things)開發,可能首先想到的是Arduino或是ESP8266這樣的微控制器開發板。然而,Raspberry Pi的微控制器開發板——Raspberry Pi Pico W,也是一個很好的選擇。
在本專案中,將會介紹如何使用Raspberry Pi Pico W和MicroPython,並用Thonny IDE的平台來撰寫程式。

Raspberry Pi Pico W 簡介

Raspberry Pi Pico W是由Raspberry Pi基金會出品的微控制器開發板。它配備了一個RP2040微控制器,有264KB的內部RAM,並且支援MicroPython程式語言,這讓我們可以更方便地開發物聯網應用。

使用上和Raspberry Pi Pico沒有多大差別,只是Raspberry Pi Pico W 還 支援Wi-Fi 802.11n無線網路和藍牙,更多Raspberry Pi Pico相關介紹連結如下:

MicroPython簡介

MicroPython是一種針對微控制器和受限環境設計的 Python 3 程式語言編譯器和執行環境。這種程式語言實現了Python 3的大部分語法和特性,並對於開發板所需的低功耗和即時回應有進一步最佳化。MicroPython提供了豐富的API,可以直接控制微控制器的GPIO、I2C、SPI等各種硬體資源。

Thonny IDE簡介

Thonny是一個專為Python初學者設計的整合式開發環境(IDE)。它的介界面簡單,功能強大,對於學習Python語言非常有幫助。而且,Thonny IDE 也支援 MicroPython,我們可以直接在Thonny IDE中編寫MicroPython 程式,並上傳到Raspberry Pi Pico W上執行。

請由  Thonny 官方網站下載 Thonny。

電路接線圖

本次專案分享如何透過Thonny IDE來撰寫MicroPython程式,並使用PMS5003粉塵感測器取得數值和經由Raspberry Pi Pico W的Wi-Fi功能取得目前台灣時間,並顯示在OLED中。
以下介紹Raspberry Pi Pico W、Raspberry Pi Pico W擴充板、OLED、PMS5003接線圖。

Raspberry Pi Pico與擴充板接法(擴充板可相容於Raspberry Pi Pico W)

Raspberry Pi Pico W擴充板與OLED接線圖

Raspberry Pi Pico W擴充板與PMS5003接線圖

接下來使用 Thonny IDE 來編寫程式,請先下載 Raspberry Pi Pico W 的 uf2 韌體檔

如何上傳Raspberry Pi Pico W的uf2檔

按住 Raspberry Pi Pico W 的 BOOTSET 按鈕時,插上USB連接到電腦,Raspberry Pi Pico W 會被電腦辨識為一個磁碟,將 uf2 韌體檔拖放到其中就會自動更新韌體。

Raspberry Pi Pico W連接Thonny IDE

  • 將Thonny IDE下載至電腦,並解壓縮後開啟,請選擇
    執行>設定直譯器>選Micro Python (Raspberry Pi Pico W)
  • 連接埠選擇USB序列裝置(COM X)

    [註] COM號要記住,後續上傳程式需要正確指定 COM 號,概念如同 Aduino IDE

  • 確認是否與Raspberry Pi Pico W連接
    檢查 Thonny IDE 下方的 互動環境(Shell),如果沒有紅字錯誤訊息即可上傳程式,這時候還沒寫,繼續看下去吧。

匯入OLED函式庫至 Raspberry Pi Pico W

本專案需要透過 OLED 顯示模組來顯示數值,故需要先匯入OLED 函式庫

1.下載 OLED 函式庫,檔名ssd1306.py 到您的電腦

2.在 Thonny IDE 中安裝套件

我們可由 Thonny IDE 呼叫系統命令列來安裝 python 套件,請由工具 –> 開啟系統命令列

3. 安裝 adafruit-ampy 套件

為了順利執行程式,我們需要安裝  adafruit-ampy 套件,用於透過序列埠與 CircuitPython 或 MicroPython 開發板互動,安裝方式就是一般的 pip 指令,相當簡單:


pip install adafruit-ampy

4. 匯入OLED函式庫到Raspberry Pi Pico W


cd module_library
ampy --port COM X put ssd1306.py

[註]請注意,並不是開啟下方的視窗,若出現下方視窗,則要再按一次開啟系統命令列。

5. 如何查看已匯入的函式庫

在 Thonny IDE 中,點選檢視 -> 檔案,可以查看Raspberry Pi Pico W中匯入的檔案


執行程式

本專題有兩個程式 (點我下載原始碼,或由以下複製也可以):

在 OLED 顯示時間(

OLED_wifitime.py

)
在 OLED 顯示 PMS5003 粉塵感測器數值(

PMS5003_OLED.py

)

OLED_wifitime.py


import machine
import utime
import ssd1306
from time import sleep
import network
import ntptime
import urequests

i2c = machine.SoftI2C(scl=machine.Pin(15), sda=machine.Pin(4))

oled_width = 128
oled_height = 64
oled = ssd1306.SSD1306_I2C(oled_width, oled_height, i2c)

# 初始化 UART
uart = machine.UART(0, baudrate=9600, tx=machine.Pin(0), rx=machine.Pin(1), timeout=1000)
uart.init(9600, bits=8, parity=None, stop=1)



# 初始化WiFi
sta_if = network.WLAN(network.STA_IF)
sta_if.active(True)


wifi_ssid = "XXXXX"
wifi_password = "XXXXXXX"


sta_if.connect(wifi_ssid, wifi_password)


# 顯示WiFi連接狀態
oled.fill(0)
oled.text('WiFi:', 0, 0)
if sta_if.isconnected():
    oled.text('connected', 40, 0)
else:
    oled.text('connceting', 40, 0)
oled.show()

#設定時區
TIME_ZONE = 8

# 取得NTP時間
#ntptime.settime()
for i in range(5):
    try:
        ntptime.settime()
        break
    except OSError:
        print('Error connecting to NTP server, retrying...')
        utime.sleep(5)
else:
    print('Could not connect to NTP server after 5 retries.')
   

# 等待一段時間
utime.sleep(3)

while True:
    t = utime.localtime(utime.time() + TIME_ZONE * 3600)
    oled.fill(0)
    oled.text(str("%d/%02d/%02d" % (t[0], t[1], t[2])), 0, 0)
    oled.text(str("%02d:%02d:%02d" % (t[3], t[4], t[5])), 0, 16)
    oled.show()
    utime.sleep(1)

 

PMS5003_OLED.py


import machine
import utime
import ssd1306
from time import sleep


i2c = machine.SoftI2C(scl=machine.Pin(15), sda=machine.Pin(4))

oled_width = 128
oled_height = 64
oled = ssd1306.SSD1306_I2C(oled_width, oled_height, i2c)


# 初始化 UART
uart = machine.UART(0, baudrate=9600, tx=machine.Pin(0), rx=machine.Pin(1), timeout=1000)
uart.init(9600, bits=8, parity=None, stop=1)

while True:
    # 讀取 PMS5003 資料
    data = bytearray(uart.read(32))
   
    # 判斷是否為正確的 PMS5003 資料
    if data is not None and len(data) >= 10 and data[0] == 0x42 and data[1] == 0x4d:
        pm1_cf = int.from_bytes(data[4:6], 'big')
        pm25_cf = int.from_bytes(data[6:8], 'big')
        pm10_cf = int.from_bytes(data[8:10], 'big')
       
        # 清除 OLED
        oled.fill(0)
       
        # 顯示 PMS5003 資料
        oled.text("PM1.0: %d ug/m3" % pm1_cf, 0, 22)
        oled.text("PM2.5: %d ug/m3" % pm25_cf, 0, 38)
        oled.text("PM10 : %d ug/m3" % pm10_cf, 0, 54)
       
        # 更新 OLED
        oled.show()
       
    utime.sleep(1)

(本文經CAVEDU同意轉載,原文連結;責任編輯:謝涵如)

CAVEDU 教育團隊

訂閱MakerPRO知識充電報

與40000位開發者一同掌握科技創新的技術資訊!

Author: CAVEDU 教育團隊

CAVEDU 教育團隊是由一群對教育充滿熱情的大孩子所組成的機器人科學教育團隊。致力推動國內機器人教育。

Share This Post On
468 ad

Submit a Comment

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *