連線 Wi-Fi

Pico W 的 Wi-Fi 連線方式與其他具有 Wi-Fi 功能的晶片一樣(例如ESP8266 或 ESP32),因為語言用的都是 MicroPython,所以沒什麼差別。程式碼如下,這段程式碼會不斷的嘗試連線直到取得 IP 為止。

## Document
## https://docs.micropython.org/en/latest/library/network.WLAN.html

import network
import utime

SSID = 'your-ssid'
PASSWORD = 'your-password'

wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(SSID, PASSWORD)

while not (wlan.isconnected() or wlan.status() == network.STAT_GOT_IP):
    print("Waiting to connect:")
    utime.sleep(1)
    
print(wlan.ifconfig())

呼叫 Web API

網路連線後,最常使用的功能就是呼叫 Web API 來取得雲端資料或是將感測器資料傳出去,以取得資料為例,程式碼如下。

## Document
## https://mpython.readthedocs.io/en/master/library/mPython/urequests.html

import urequests

res = urequests.get(url='https://raw.githubusercontent.com/kirkchu/mongodb/main/demo.json')
print(res.text)

如果成功,應該可以看到下面這個 JSON 內容。

[
    {
        "name": "David",
        "age": 30
    },
    { 
        "name": "Betty",
        "age": 27
    }
]

JSON 解析

如果取得的資料是 JSON 格式,JSON 解析就會是接下來要做的事情。由於 urequest.get() 傳回的物件已經內建 JSON 解析器,所以直接呼叫 json() 就可以了,並不需要透過 ujson 函數庫來解析,程式碼如下。

import urequests

url = 'https://raw.githubusercontent.com/kirkchu/mongodb/main/demo.json'
res = urequests.get(url=url)
for p in res.json():
    print(f'姓名:{p["name"]},年齡:{p["age"]}')

res.close()  # do not forget

如果要自己手動解析也可以,這時就要匯入 ujson 函數庫了,如下。

## Document
## https://docs.micropython.org/en/v1.15/library/ujson.html

import urequests
import ujson

url = 'https://raw.githubusercontent.com/kirkchu/mongodb/main/demo.json'
res = urequests.get(url=url)
for p in ujson.loads(res.text):
    print(f'姓名:{p["name"]},年齡:{p["age"]}')

res.close() # do not forget

上面這兩種方法不論是哪一種,都可以看到如下的結果,喜歡用哪一種都可以。

姓名:David,年齡:30
姓名:Betty,年齡:27

練習

設計一個 JSON 格式來控制 LED 亮滅,並且將這個 JSON 字串放到雲端,例如 GitHub。當修改 JSON 內容後,Pico 使用輪詢方式每隔一段時間訪問該 JSON 字串,然後根據內容來決定 LED 亮滅。

Library(mwifi.py)

import network
import time

class Wifi:
    def __init__(self, ssid, password=None):
        wlan = network.WLAN(network.STA_IF)
        wlan.active(True)
        wlan.connect(ssid, password)

        while not (wlan.isconnected() or wlan.status() == network.STAT_GOT_IP):
            print("Waiting to connect:")
            time.sleep(1)
    
        print(wlan.ifconfig())
        
if __name__ == '__main__':
    Wifi('YOUR_SSID', 'YOUR_PASSWORD')

★本系列收錄於「第一次就上手」選單

發表迴響