Wifi checker for RaspberryPi Pico W

2025-12-24 python

Wifi経由で命令を送り操作ができるバージョンを開発中…なのですが、(PicoWの)起動後になかなか繋がらなかったり、途中で接続が切れてしまうケースが多発してしまっています。そこで作ってもらったのが、以下のスクリプト。

# Raspberry Pi Pico WiFi Stability Checker

import time
import network
from machine import Pin

# WiFi Configuration
WIFI_SSID = YOUR_SSID
WIFI_PASSWORD = YOUR_PASSWORD

led = Pin("LED", Pin.OUT)

# WiFi status tracking
start_time = time.time()
connection_losses = 0
last_check = time.time()

# Connect to WiFi
print(f"Connecting to WiFi: {WIFI_SSID}...")
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(WIFI_SSID, WIFI_PASSWORD)

# Wait for connection (Timeout: 30 seconds)
timeout = 30
start = time.time()
while wlan.isconnected() == False:
    if time.time() - start > timeout:
        print(f"WiFi connection timeout to {WIFI_SSID}")
        led.value(0)
        exit()

    print(f"Connecting to {WIFI_SSID}...", end="\r")
    led.value(1)
    time.sleep(0.25)
    led.value(0)
    time.sleep(0.25)

wlan_status = wlan.ifconfig()
print(f"\nConnected! IP: {wlan_status[0]}")
led.value(1)

# Main loop
print(f"\nWiFi connection check started (every 60 seconds)")
print("Press 'Ctrl+C' to exit\n")

try:
    while True:
        current_time = time.time()

        # Check WiFi connection status every 60 seconds
        if current_time - last_check >= 60:
            uptime = int(current_time - start_time)

            if wlan.isconnected():
                rssi = wlan.status('rssi')
                signal_bars = max(0, min(5, (rssi + 100) // 10))
                bar = "█" * signal_bars + "░" * (5 - signal_bars)
                print(f"[{uptime}s] Connected - Signal: {bar} {rssi} dBm")
                led.value(1)
            else:
                connection_losses += 1
                print(f"[{uptime}s] ERROR: Connection lost! (Loss count: {connection_losses})")
                # Blink LED when disconnected
                for _ in range(10):
                    led.value(1)
                    time.sleep(0.2)
                    led.value(0)
                    time.sleep(0.2)
                led.value(0)

            last_check = current_time

        time.sleep(1)

except KeyboardInterrupt:
    print("\n\nExiting...")

finally:
    led.value(0)
    print("Done")

これを、mpremoteでPico Wに転送して、実行すると、60秒おきにWiFiの接続状態と信号強度を表示し、接続が切れた場合は、LEDが点滅してお知らせしてくれます。

mpremote cp checker.py :main.py

以下は、Geminiに教えてもらった dBm(デシベルミリワット) の目安です。

-30 dBm: 理論上の最大値。ルーターのすぐ横にいる状態です。 -50 dBm 前後: 非常に強力。動画視聴やオンラインゲームも快適にこなせる最高レベルの状態です。 -67 dBm: 実用上の最低ライン。ビデオ通話などが安定して行える限界の目安です。 -80 dBm 以下: 非常に弱い。接続が途切れたり、通信速度が極端に遅くなったりします。