今回は Raspberry Pi Pico W を使って、MicroPython で Wi‑Fi に接続する方法を紹介します。これまでの Pico には Wi‑Fi 機能がなかったんですが、Pico W になってついに無線が使えるようになりました!
これからは、この Wi‑Fi 機能を使って、インターネットにつないだり、他のデバイスとやりとりしたり、いろんなことにチャレンジしていきたいと思います。1. MicroPython で Wi-Fi 接続
import network
import time
# SSID とパスワードを指定
SSID = 'あなたのSSID'
PASSWORD = 'あなたのパスワード'
# Wi-Fi ステーション(クライアント)モードで起動
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(SSID, PASSWORD)
# 接続待ち
print("Wi-Fiに接続中...")
while not wlan.isconnected():
time.sleep(1)
print("接続完了!")
print("IPアドレス:", wlan.ifconfig()[0])
【実行結果】
2.【HTTP GET】Web APIからデータを取得(例:天気)
import urequests
import network
import time
# SSID とパスワードを指定
SSID = 'あなたのSSID'
PASSWORD = 'あなたのパスワード'
# Wi-Fi ステーション(クライアント)モードで起動
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(SSID, PASSWORD)
# 接続待ち
print("Wi-Fiに接続中...")
while not wlan.isconnected():
time.sleep(1)
print("接続完了!")
print("IPアドレス:", wlan.ifconfig()[0])
# 天気コード→日本語訳
weather_codes = {
0: "快晴",
1: "ほぼ快晴",
2: "一部曇り",
3: "くもり",
45: "霧",
48: "霧(霧氷)",
51: "霧雨(弱)",
53: "霧雨(中)",
55: "霧雨(強)",
61: "雨(弱)",
63: "雨(中)",
65: "雨(強)",
71: "雪(弱)",
73: "雪(中)",
75: "雪(強)",
95: "雷雨",
# 必要なら追加で対応可能
}
# 風向(度数)→方角
def wind_deg_to_jp(deg):
dirs = ['北', '北北東', '北東', '東北東', '東', '東南東', '南東', '南南東',
'南', '南南西', '南西', '西南西', '西', '西北西', '北西', '北北西']
ix = int((deg + 11.25) / 22.5) % 16
return dirs[ix]
# UTC→JSTに変換
def utc_to_jst(utc_str):
# 文字列 "2025-04-18T01:15" を分解
date_part, time_part = utc_str.split('T')
year, month, day = map(int, date_part.split('-'))
hour, minute = map(int, time_part.split(':'))
# UTC時刻のstruct_time相当を作成
utc_tuple = (year, month, day, hour, minute, 0, 0, 0)
# MicroPythonではtime.mktimeでタプルを秒に変換可能(ただし6要素まで対応)
jst_seconds = time.mktime(utc_tuple) + 9 * 3600
jst_tuple = time.localtime(jst_seconds)
return "{:04}-{:02}-{:02} {:02}:{:02}".format(*jst_tuple[:5])
# Open-Meteo API 呼び出し
response = urequests.get("https://api.open-meteo.com/v1/forecast?latitude=35&longitude=139¤t_weather=true")
data = response.json()['current_weather']
response.close()
# 日本語表示(JST)
print("■ 現在の天気({})".format(utc_to_jst(data['time'])))
print("天気:{}".format(weather_codes.get(data['weathercode'], "不明")))
print("気温:{}℃".format(data['temperature']))
print("風速:{} km/h".format(data['windspeed']))
print("風向:{}".format(wind_deg_to_jp(data['winddirection'])))
print("昼夜:{}".format("昼" if data['is_day'] else "夜"))
【実行結果】
3.【NTPで時刻取得】
import ntptime
import network
import time
# SSID とパスワードを指定
SSID = 'あなたのSSID'PASSWORD = 'あなたのパスワード'
# Wi-Fi接続
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(SSID, PASSWORD)
print("Wi-Fiに接続中...")
while not wlan.isconnected():
time.sleep(1)
print("接続完了!")
print("IPアドレス:", wlan.ifconfig()[0])
# NTPで時刻取得(UTC)
ntptime.settime()
# 9時間ずらしてJSTにする
JST_OFFSET = 9 * 60 * 60
t = time.localtime(time.time() + JST_OFFSET)
# 日本時間で表示
print("現在時刻(JST): {:04}-{:02}-{:02} {:02}:{:02}:{:02}".format(*t[:6]))
【実行結果】
4.【Webサーバー】ブラウザから Pico を操作
import socket
import network
import time
from machine import Pin
# SSID とパスワードを指定
SSID = 'あなたのSSID'PASSWORD = 'あなたのパスワード'
# LED ピン設定(GP16)
led = Pin(16, Pin.OUT)
# Wi-Fi ステーション(クライアント)モードで起動
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(SSID, PASSWORD)
# 接続待ち
print("Wi-Fiに接続中...")
while not wlan.isconnected():
time.sleep(1)
print("接続完了!")
print("IPアドレス:", wlan.ifconfig()[0])
# ソケット作成(ポート番号を8080に変更)
addr = socket.getaddrinfo('0.0.0.0', 8080)[0][-1]
s = socket.socket()
s.bind(addr)
s.listen(1)
print('Webサーバー起動! http://%s:8080' % wlan.ifconfig()[0])
# HTMLテンプレート
html = """\
HTTP/1.1 200 OK
<html>
<head><title>Pico LED Control</title></head>
<body>
<h1>Pico W LED Control</h1>
<p>LED is currently: <strong>{state}</strong></p>
<form>
<button name="led" value="on" type="submit">LED ON</button>
<button name="led" value="off" type="submit">LED OFF</button>
</form>
</body>
</html>
"""
while True:
cl, addr = s.accept()
print('クライアント接続:', addr)
request = cl.recv(1024)
request = request.decode("utf-8")
print("リクエスト内容:", request)
# LED制御パラメータ取得
if 'led=on' in request:
led.value(1)
elif 'led=off' in request:
led.value(0)
# 現在のLED状態
state = "ON" if led.value() else "OFF"
# レスポンス送信
response = html.format(state=state)
cl.send(response)
cl.close()
【実行結果】
コメント
コメントを投稿