Wi-Fi STA(ステーション)モードで使用してみた。(Raspberry Pi Pico W)

つぶやき

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分で完成する手順を解説しています。

コメント