Raspberry Pi Pico WでWIFI接続して正確な時刻を取得

Raspberry Pi Pico Wの無線LANモジュールでネットワークに接続して標準時刻データを取得します。

Raspberry Pi Pico Wの無線LANモジュールでネットワークに接続して指定したNTP(Network Time Protocol)サーバから、標準時刻データを取得します。

Raspberry Pi Pico W

無線LANモジュールは「CYW43439」です。このモジュールは、Wi-FiとBluetoothの機能を統合しており、IoTデバイスや組み込みアプリケーションに広く使用されています。
シルバーのシールドで覆われているチップがCYW43439です。

MicroPythonプログラム

##################################################
#
#      モジュールの読み込み
#
##################################################

#Network/NTP
import network
import rp2
import ntptime
import time


##################################################
#
#      Wi-Fi接続/時刻パラメータ
#
##################################################

#Wi-Fi接続パラメータ
ssid = "SSID"
password = "パスワード"

#日本標準時(UTC+9時間)
UTC_OFFSET = 9

#NTPサーバ ドメイン
NTP_SRV = "ntp.nict.jp"



##################################################
#
#      【関数】Wi-Fiに接続
#
##################################################

def wifi_connect():
    #Wi-Fi地域(日本)の設定
    rp2.country('JP')

    #ステーションインタフェースの有効化
    wlan = network.WLAN(network.STA_IF)
    wlan.active(True)

    #Wi-Fiの省電力をオフに設定
    wlan.config(pm = 0xa11140)
    
   
    #wi-Fiに接続
    wlan.connect(ssid, password)
    while not wlan.isconnected() and wlan.status() >= 0:

        print("Wait for", "connection...")       
        time.sleep(1)
    
    ip_add = wlan.ifconfig()[0]
    print("Connected on", f' {ip_add}')
    
    #ダミー
    time.sleep(2)

    return ip_add


##################################################
#
#      【関数】NTPサーバから日時取得
#
##################################################

def get_ntp_time():

    #NTPサーバ
    ntptime.server = NTP_SRV
    
    #NTPサーバへの接続待ち
    time.sleep(1)
    
    #ローカル時刻をUTC標準時刻に同期
    ntptime.settime()
      
   
    print("Connected to", "NTP server.")
    
    #ダミー
    time.sleep(2)
   

##################################################
#
#      【関数】日付・時刻整形
#
##################################################

def format_dttm(day_tm):
    
    #日付
    dat = ("%4d/%02d/%02d" % (day_tm[0:3]))
    
    #時刻
    tm = ("%2d:%02d:%02d" % (day_tm[3:6]))
    
    return dat ,tm

##################################################
#
#      【関数】日付時刻を取得
#
##################################################

def get_dattm():
     
    #ローカル時刻
    lcl_tm =  time.localtime(time.mktime(time.localtime()) + UTC_OFFSET * 60 * 60)          
   
    #日付・時刻整形
    dat ,tm = format_dttm(lcl_tm)
        
    return dat,tm      
##################################################
#
#      メイン
#
##################################################

try:
    
    #Wi-Fiに接続
    ip_add = wifi_connect()
    
    #NTPサーバから日時取得
    get_ntp_time()
    
    
    #液晶ディスプレイに日付・時刻表示
    while True:
        #日付・時刻を取得
        dat,tm = get_dattm()    
    
        #LCDに文字表示
        print(dat, tm)
        
        #1秒待ち
        time.sleep(1)
        

except KeyboardInterrupt:
    # Turn off the display
    print("「Ctrl + c」キーが押されました。")
    
  
    machine.reset()
取得した標準時刻データを、ラズパイPicoW(Raspberry Pi Pico W)内のローカル時刻(内臓のリアルタイム・クロック)と同期させます。
同期させたローカル時刻は、協定世界時(UTC)であるため、日本標準時 (JST)に変換し、日付、時刻の形式に整形した後にSHELLに表示させます。

実行

日付と時刻は東京の標準時間です。
読み取ったデータは次のようになっています。
{“coord”:{“lon”:160,”lat”:40},”weather”:[{“id”:803,”main”:”Clouds”,”description”:”broken clouds”,”icon”:”04n”}],”base”:”stations”,”main”:{“temp”:294.87,”feels_like”:295.32,”temp_min”:294.87,”temp_max”:294.87,”pressure”:1028,”humidity”:85,”sea_level”:1028,”grnd_level”:1028},”visibility”:10000,”wind”:{“speed”:10.64,”deg”:125,”gust”:11.61},”clouds”:{“all”:70},”dt”:1729666269,”sys”:{“sunrise”:1729625920,”sunset”:1729664983},”timezone”:39600,”id”:0,”name”:””,”cod”:200}

自由研究

テンテン
テンテン

同じようにwifiをつかってインターネットからいろいろなデータを取得できます。天気予報も可能です。