STAモード(ステーションモード)とは?
STAモード(ステーションモード)は、Wi-Fiを使うときの1つの仕組みです。スマホ、パソコン、Raspberry Pi Pico Wを家のWi-Fiルーターにつなぐときに使うのがSTAモードになります。簡単に言うと、STAモードとは「インターネットにつながるためにWi-Fiに接続する」ことです。
周囲のWi-Fiアクセスポイント(AP)を見つける方法
# ----------------------------------------------------------
# モジュールをインポートする
# ----------------------------------------------------------
import network # Wi-Fi操作に必要なモジュール
# ----------------------------------------------------------
# Wi-FiのモードをSTAモードに設定する
# STAモードは「クライアントとして接続するモード」
# ----------------------------------------------------------
wlan = network.WLAN(network.STA_IF) # STAモード(Station Interface)を有効化
wlan.active(True) # Wi-Fi機能をONにする
# ----------------------------------------------------------
# スキャンを実行して周辺のWi-Fiアクセスポイントを取得する
# ----------------------------------------------------------
print("Wi-Fiネットワークをスキャン中…")
networks = wlan.scan() # スキャン開始(周辺のWi-Fiアクセスポイント情報がリストで返る)
# ----------------------------------------------------------
# スキャン結果を1つずつ表示
# スキャン結果はタプルのリストになっていて、以下のような情報が入っている:
# (SSID, BSSID, channel, RSSI, authmode, hidden)
# ----------------------------------------------------------
print("見つかったWi-Fiネットワーク一覧:")
for net in networks:
ssid = net[0].decode() # ネットワーク名(SSID)
bssid = ':'.join('%02x' % b for b in net[1]) # BSSIDのバイト列を「MACアドレスの形」に変換
channel = net[2] # チャンネル番号
RSSI = net[3] # 電波強度(数値が大きいほど強い)
authmode = net[4] # セキュリティ方式(0:オープン, 1:WEP, 2:WPA-PSK, 3:WPA2-PSK, 4:WPA/WPA2-PSK)
hidden = net[5] # SSIDが隠されているかどうか(True/False)
# 結果を表示する
print("----------------------------------------")
print(f"SSID : {ssid}")
print(f"MAC address: {bssid}")
print(f"Channel : {channel}")
print(f"RSSI : {RSSI}")
print(f"Authmode : {authmode}")
print(f"Hidden : {hidden}")
# ----------------------------------------------------------
# スキャンが終わったらWi-Fiをオフにする
# ----------------------------------------------------------
wlan.active(False) # Wi-FiをOFFにする
print("スキャン終了!")
Wi-Fi STA(ステーション)モードでボードの温度を確認する
# ----------------------------------------------------------
# このスクリプトは Raspberry Pi Pico W を Wi-Fi STA モード(ステーションモード)として
# Wi-Fiルーターに接続し、内蔵温度センサーの値を Web ブラウザに表示する HTTP サーバーを起動します。
# ----------------------------------------------------------
import network
import socket
import gc
import time
from machine import ADC
from secrets import secrets # 機密情報(Wi-Fi、メール設定など)
gc.collect() # メモリ確保
# ステーションモードでWi-Fiインターフェースを作成
sta = network.WLAN(network.STA_IF)
sta.active(True)
sta.connect(secrets['ssid'], secrets['password'])
# Wi-Fi 接続が完了するまで待機
print("Connecting to Wi-Fi...")
while not sta.isconnected():
time.sleep(0.5)
print("Connected to Wi-Fi!")
# 接続後のIPアドレスなどを表示
print("IP Address: {}\nNet Mask: {}\nGateway: {}\nDNS: {}".format(*sta.ifconfig()))
# ====== 内蔵温度センサーの設定 ======
sensor_temp = ADC(4)
conversion_factor = 3.3 / 65535
def read_temperature():
reading = sensor_temp.read_u16() * conversion_factor
temperature_c = 27 - (reading - 0.706) / 0.001721
return round(temperature_c, 1)
# 温度履歴のリスト (最大20件)
history = []
# ====== HTTP サーバーの設定 ======
addr = socket.getaddrinfo("0.0.0.0", 80)[0][-1]
server_socket = socket.socket()
server_socket.bind(addr)
server_socket.listen(1)
print("HTTP server running at http://{}/".format(sta.ifconfig()[0]))
# ====== メインループ:Webページを提供 ======
while True:
temperature = read_temperature()
history.append(temperature)
if len(history) > 20:
history.pop(0)
try:
client, addr = server_socket.accept()
print("Client connected from", addr)
request = client.recv(1024)
js_data = ','.join(str(t) for t in history)
html = f"""\
HTTP/1.1 200 OK
<!DOCTYPE html>
<html>
<head>
<title>Pico Temperature History</title>
<meta http-equiv="refresh" content="5">
<style>
body {{
font-family: sans-serif;
text-align: center;
margin-top: 40px;
}}
canvas {{
border: 1px solid #ccc;
}}
</style>
</head>
<body>
<h1>Temperature History</h1>
<p>Current Temperature: <strong>{temperature:.1f} degree C</strong></p>
<canvas id="chart" width="300" height="150"></canvas>
<script>
const data = [{js_data}];
const canvas = document.getElementById('chart');
const ctx = canvas.getContext('2d');
ctx.clearRect(0, 0, canvas.width, canvas.height);
ctx.beginPath();
ctx.strokeStyle = 'blue';
let max = Math.max(...data);
let min = Math.min(...data);
let range = max - min || 1;
let scaleX = canvas.width / (data.length - 1);
let scaleY = canvas.height / range;
for (let i = 0; i < data.length; i++) {{
let x = i * scaleX;
let y = canvas.height - (data[i] - min) * scaleY;
if (i === 0) {{
ctx.moveTo(x, y);
}} else {{
ctx.lineTo(x, y);
}}
}}
ctx.stroke();
</script>
<p>(Graph updates every 5 seconds)</p>
</body>
</html>
"""
client.send(html)
client.close()
except Exception as e:
print("Error:", e)
client.close()
import network
import socket
import gc
import machine
import time
from secrets import secrets # 機密情報(Wi-Fi、メール設定など)
gc.collect()
# STAモードでWi-Fiに接続
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(secrets['ssid'], secrets['password'])
wlan.connect(SSID, PASSWORD)
print("Connecting to Wi-Fi...")
# 接続完了まで待機
while not wlan.isconnected():
print(".", end="")
time.sleep(1)
print("\nConnected!")
print("IP Address: {}\nNet Mask: {}\nGateway: {}\nDNS: {}".format(*wlan.ifconfig()))
# HTMLでウェブページを作成
html = """
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<style>
html {
font-family: Helvetica;
text-align: center;
}
button {
color: white;
padding: 15px 32px;
font-size: 18px;
margin: 3px 1px;
cursor: pointer;
border: none;
border-radius: 5px;
}
.green { background-color: #00BFFF; }
.red { background-color: #f44336; }
button, form { display: inline-block; text-align: center; }
</style>
</head>
<body style="%s">
<h2>LED Control</h2>
<form>
<button class="green" name="led" value="on" type="submit">LED ON</button>
<button class="red" name="led" value="off" type="submit">LED OFF</button>
</form>
<p>%s</p>
</body>
</html>
"""
# LEDのピンを設定
led = machine.Pin("LED", machine.Pin.OUT)
# LEDの状態を初期化
ledState = "LED State Unknown"
# ソケットの設定
addr = socket.getaddrinfo("0.0.0.0", 80)[0][-1]
s = socket.socket()
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind(addr)
s.listen(1)
print("Web server is running. Access it at http://{}/".format(wlan.ifconfig()[0]))
# クライアントからの接続を待つ
while True:
try:
cl, addr = s.accept()
print("Client connected from", addr)
request = cl.recv(1024).decode()
# LED制御
if "?led=on" in request:
led.on()
print("LED ON")
elif "?led=off" in request:
led.off()
print("LED OFF")
# LEDの現在の状態に応じて背景色を変更
if led.value() == 0:
ledState = "LED is OFF"
bgColor = "background-color: #FFCCCC;" # LED OFFなら薄赤
else:
ledState = "LED is ON"
bgColor = "background-color: #CCFFCC;" # LED ONなら薄緑
# レスポンスを作成して送信
response = "HTTP/1.0 200 OK\r\nContent-type: text/html\r\n\r\n" + (html % (bgColor, ledState))
cl.send(response)
cl.close()
except OSError as e:
cl.close()
print("Connection closed. Error:", e)

【IoT工作】Raspberry Pi Pico Wでワイヤレス呼び鈴を作ろう!
Pico Wとブレッドボードでワイヤレス呼び鈴を自作!配線写真・MicroPythonコードを丸ごと掲載し、初心者でも30分で完成する手順を解説しています。
コメント