WiFi機能の利用は、ESP32の本領発揮ですね。

アクセスポイントの調査

ESP32のWiFi機能を有効化して、周辺のアクセスポイントをリスト表示するプログラム例です。

import network

wifi = network.WLAN(network.STA_IF) # クライアントとして設定
wifi.active(True) # WiFiを有効化

sta = wifi.scan() # アクセスポイントをスキャン
# print(sta)

authmodes = ['Open', 'WEP', 'WPA-PSK' 'WPA2-PSK', 'WPA/WPA2-PSK', '?5', '?6', '?7', '?8', '?9', ]
for (ssid, mac, channel, rssi, auth, hidden) in sta:
    name = ssid.decode()
    print("*", name if name != "" else "???")
    print("  - Auth:", authmodes[auth])
    print("  - Channel:", channel)
    print("  - RSSI:", rssi)
    print("  - MAC: {:02x}:{:02x}:{:02x}:{:02x}:{:02x}:{:02x}".format(*mac))
    print()

このプログラムは、アクセスポイントをスキャンするだけなのでSSIDやパスワードは不要です。

NTPを使用した時刻同期

NTPプロトコルを使用して、RTCを設定するプログラムです。

ESP32は目が覚めた時は今何時なのかわかってないのですが、バッテリーバックアップされたRTCがなくてもいつでも正確な時間を利用できるので、ネットワークが使えると便利ですね。

import network, ntptime, utime, time
from machine import RTC

ssid = 'YOUR_SSID'
passwd = 'YOUR_PASSWD'

def wifi_connect(ssid, passwd): # アクセスポイントへの接続
    wifi = network.WLAN(network.STA_IF)
    wifi.active(True)
    if not wifi.isconnected():
        print('connecting to network...')
        wifi.connect(ssid, passwd)
        while not wifi.isconnected():
            print('.',end='')
            time.sleep_ms(500)
        print()
    return wifi

wifi = wifi_connect(ssid, passwd)
print('network config:', wifi.ifconfig()) # 接続時のIP情報表示

rtc = RTC() # リアルタイムクロックを取得
print("RTC初期値:", rtc.datetime()) # 2000/1/1になっていなければ、Thonnyの設定オプションが有効

print('--- NTP同期')
ntptime.settime() # RTCをNTPと同期
print("utime:", utime.localtime()) # 設定された時刻はグリニッジ標準時相当:任本の時間JSTじゃない
print("RTC設定値:", rtc.datetime()) # 同上:データの順序と内容が微妙に違う。。。

print('--- RTCをJSTに')
JST_OFFSET = 9 * 60 * 60 # 9時間(32400秒)
ut = utime.localtime(utime.time() + JST_OFFSET)
rtc.datetime((ut[0], ut[1], ut[2], ut[6]+1, ut[3], ut[4], ut[5], 0))
print("RTC(JST):", rtc.datetime())

wifi-ntp.pyの実行例を以下に示します。

network config: ('192.168.XX.XX', '255.255.255.0', '192.168.XX.XX', '8.8.8.8')
RTC初期値: (2000, 1, 1, 5, 0, 2, 18, 251192)
--- NTP同期
utime: (2023, 11, 11, 2, 29, 50, 5, 315)
RTC設定値: (2023, 11, 11, 5, 2, 29, 50, 18329)
--- RTCをJSTに
RTC(JST): (2023, 11, 11, 5, 11, 29, 50, 32)

天気予報

気象庁が提供する天気予報データを利用して、指定地域の3日間の天気予報を表示するプログラム例です。プログラムが天気予報を表示する地域は福岡になっていますが、23行と33行の数値コードを書き換えることにより、好きな地域の天気予報を表示させることができます。

import network, urequests, ujson, time

ssid = 'YOUR_SSID'
passwd = 'YOUR_PASSWD'

def wifi_connect(ssid, passwd): # アクセスポイントへの接続
    wifi = network.WLAN(network.STA_IF)
    wifi.active(True)
    if not wifi.isconnected():
        print('connecting to network...')
        wifi.connect(ssid, passwd)
        while not wifi.isconnected():
            print('.',end='')
            time.sleep_ms(500)
        print()
    return wifi

wifi = wifi_connect(ssid, passwd)
# print('network config:', wifi.ifconfig())

# 気象庁予報データの取得:福岡県:40000, 東京都:130000,大阪府:270000
# 参照:https://www.jma.go.jp/bosai/common/const/area.json
jma_url = "https://www.jma.go.jp/bosai/forecast/data/forecast/400000.json"
forecast_json = urequests.get(jma_url).json()

area = 0 # 0:福岡県の最初の地域:福岡地方
forecast_office = forecast_json[0]["publishingOffice"]
forecast_major = forecast_json[0]["timeSeries"][0] # 参照データセットの選択
forecast_area = forecast_major["areas"][area]

print('==========')
print(forecast_office)
print(forecast_area["area"]["name"])

for period in range(0,len(forecast_major["timeDefines"])):
    forecast_date = forecast_major["timeDefines"][period]
    forecast_weather = forecast_area["weathers"][period]
    forecast_wind = forecast_area["winds"][period]
    if "waves" in forecast_area:
        forecast_waves = forecast_area["waves"][period]
    else:
        forecast_waves = None

    print('-----')
    print(forecast_date[:10])
    print("天気:"+forecast_weather.replace(' ', '')) # 全角スペースを削除して表示
    print(" 風:"+forecast_wind.replace(' ', ''))
    if forecast_waves != None:
        print("波浪:"+forecast_waves.replace(' ', ''))

wifi-jma-forecast.pyの実行例を以下に示します。

connecting to network...
...
==========
福岡管区気象台
福岡地方
-----
2023-11-11
天気:くもり時々晴れ所により夕方まで雨
 風:北の風海上では北の風やや強く
波浪:3メートル後2メートルうねりを伴う
-----
2023-11-12
天気:くもり時々晴れ所により明け方から昼前雨
 風:北西の風後北の風やや強く
波浪:2メートル後2.5メートル
-----
2023-11-13
天気:くもり
 風:北西の風後北の風
波浪:3メートル

関連記事

MicrodotというWebサーバーフレームワークを使用すると、Webサーバーを簡潔に記述することができます。