MicroPython(ESP32)でWifi接続する
目次
はじめに【MicroPython+ESP32でWifiに接続する】
ESP32を選択する理由として「wifi接続できる」ことは大きいと思います。今回はMicroPythonを使用してWifi接続を行ってみます。
事前準備:MicroPythonのセットアップ
まずはMicroPythonをESP32にセットアップましょう。こちらの記事 でセットアップ方法を紹介しています。
Wifi接続の設定
main.pyの作成
- 公式サイト の「ネットワーキング」にサンプルがあります。
- [SSID][PASSWORD]は環境に合わせて書き換えてください。
import network
import time
SSID = "abcdefg"
PASSWORD = "******"
#ネットワークオブジェクトの構築 STA_IF<-ステーションモード
wlan = network.WLAN(network.STA_IF)
#True:ネットワークの有効化。 引数なしで状態の取得
wlan.active(True)
#接続状態になるまで1秒おきに再試行。
if not wlan.isconnected():
wlan.connect(SSID, PASSWORD)
while wlan.status() != network.STAT_GOT_IP:
print('waiting...')
time.sleep(1)
#接続ができたらIPアドレスを表示して終了。
status = wlan.ifconfig()
print(f'IP address {status[0]}')
動作確認
実行するとシェルにIPアドレスを表示します。
複数の接続先を登録して接続する方法
Wifiの接続先が複数の場合もあります(テスト中は家のWifi、 実行時は外部のWifiなど)。
- ssid_lstにSSIDとパスワードを登録する。優先順位が高い順に。
- wlan.scan()で接続可能なアクセスポイントを検索
- ssid_lstと照会して、接続可能なところに接続
import network
import time
#接続先SSIDのリストを作る。優先度順。
ssid_lst=[["WIFI-A", "aabbccdd"],
["WIFI-B", "bbccddaa"],
["WIFI-C", "ddaabbcc"]]
#ネットワークオブジェクトの構築 STA_IF<-ステーションモード
wlan = network.WLAN(network.STA_IF)
#ネットワークの有効化。
wlan.active(True)
#lstにwlan.scan()の戻り値(タプル型)を代入
lst = wlan.scan()
#接続先のリストを作成
ap_lst = set() #空の集合
#ap_lst集合に接続できるアクセスポイントを格納
#.decode()はbytearray型をstring型に変換する。
for l in lst:
ap_lst.add(l[0].decode())
if not wlan.isconnected():
#優先順位順に接続先を確認する。
for l in range(len(ssid_lst)):
if ssid_lst[l][0] in ap_lst:
ssid = ssid_lst[l][0]
password = ssid_lst[l][1]
wlan.connect(ssid, password)
while wlan.status() != network.STAT_GOT_IP:
print(ssid, ':waiting...')
time.sleep(1)
#接続ができたらIPアドレスを表示して終了。
status = wlan.ifconfig()
print(f'IP address {status[0]}')
問題点
上記のコードは接続が切断された場合、再接続が失敗します (wlan.scan()が失敗する)。まだいい方法が見つからないので、 今後の課題として修正していきます。
補足:アクセスポイントのSSIDを調べる
アクセスポイントのSSIDがわからない場合、以下のコードで調べることができます。
wifi-scan.py
import network
#ネットワークオブジェクトの構築 STA_IF<-ステーションモード
wlan = network.WLAN(network.STA_IF)
#ネットワークの有効化。
wlan.active(True)
#lstにwlan.scan()の戻り値(タプル型)を代入
lst = wlan.scan()
#lstの内容を表示
for l in lst :
print(l)
実行結果
(b'WIFI-A', b'F\xd5\xf2*\xd8\xf8', 6, -33, 3, False)
(b'WIFI-B', b'\x80"\xa7\x00\x8e\x19', 1, -50, 4, False)
(b'WIFI-Y', b'\x902K\xea(\x96', 1, -92, 4, False)
(b'WIFI-Z', b'\x00:\x9dk^\x8d', 7, -95, 4, False)
1番目のステータス(WIFI-x)がSSIDです。
おわりに
wifi接続ができればAmbient などを使ってデータ収集が可能になりますね。(Ambientへの接続はこちらの記事 でやってます)。