日時を表示してみた。(Raspberry Pi Pico W)

つぶやき

内蔵RTC (Real-Time Clock)の時刻を表示する。

内蔵RTC (Real-Time Clock)の時刻を表示する

RTC(Real-Time Clock、リアルタイムクロック)とは、実時間(現在の時刻や日付)を保持・管理するための時計機能を持ったハードウェアのことです。

import machine  # ハードウェア制御用のモジュール(RTCなど)

# RTC(リアルタイムクロック)を初期化
# Pico W には外部RTCはないが、内部クロックを使って時刻を管理できる。
rtc = machine.RTC()

# 現在の日時をタプル形式で取得する
# タプル形式: (年, 月, 日, 曜日, 時, 分, 秒, ミリ秒)
current_time = rtc.datetime()

# RTCから取得した生の日時情報をそのまま表示
print("Current time:", current_time)

# 整形した日時(YYYY/MM/DD HH:MM:SS形式)で表示させる
print("{0}/{1:02d}/{2:02d} {4:02d}:{5:02d}:{6:02d}".format(
    current_time[0],  # 年 (YYYY)
    current_time[1],  # 月 (MM)
    current_time[2],  # 日 (DD)
    current_time[3],  # 曜日(0〜6, 月曜が0)※出力には使わない
    current_time[4],  # 時 (HH)
    current_time[5],  # 分 (MM)
    current_time[6]   # 秒 (SS)
))
# f文字列を使った日時のフォーマット表示(Python 3.6以降)
print(
    f"{current_time[0]}/"        # 年(例:2025)
    f"{current_time[1]:02d}/"    # 月(2桁表示、例:05)
    f"{current_time[2]:02d} "    # 日(2桁表示、例:18)
    f"{current_time[4]:02d}:"    # 時(2桁表示、例:14)
    f"{current_time[5]:02d}:"    # 分(2桁表示、例:30)
    f"{current_time[6]:02d}"     # 秒(2桁表示、例:45)
)
#表示結果
Current time: (2025, 5, 14, 2, 21, 44, 42, 0)
2025/05/14 21:44:42
2025/05/14 21:44:42

NTP(ネット経由で時刻取得)で表示する

Raspberrypi Picoは、machine.RTC() でRTC機能を使えますが、これは電源を切るとリセットされます。電源を切ると時刻が失われるので、起動時にNTP(ネットワーク時刻サーバー)で設定が必要です。
NTP(ネット経由で時刻取得)を使用して表示するには、まずNTPサーバーに接続し、そこで取得した時刻でRaspberrypi Picoの時計を同期させます。その上で、同期された時刻を表示するようにします。

import time        # 時刻関連の関数(sleep, time, localtimeなど)を使うための標準モジュール
import network     # Wi-Fi 接続などネットワーク機能を使うためのモジュール
import ntptime     # NTP(Network Time Protocol)を使ってRTC(内蔵時計)をインターネット経由で同期するためのモジュール

from secrets import secrets  # WiFiのSSIDやパスワードなどの秘密の情報は別ファイルから読み込む

# Wi-Fi に接続する関数
# 引数:SSIDとパスワード(ssid, password)
def connect_to_wifi(ssid, password):
    wlan = network.WLAN(network.STA_IF)  # ルーターに接続でWiFiインターフェースを作成
    wlan.active(True)                    # インターフェースを有効にする
    
    wlan.connect(ssid, password)         # SSIDとパスワードでWiFiに接続開始

    max_wait = 10  # 最大10秒待機
    while max_wait > 0:
        if wlan.status() < 0 or wlan.status() >= 3:
            break  # 接続完了(3)またはエラー(-1など)ならループを抜ける
        print('Wi-Fi接続待機中...')
        time.sleep(1)
        max_wait -= 1

    # 接続状態の確認
    if wlan.status() != 3:
        raise RuntimeError('Wi-Fi接続に失敗しました')  # 接続できなかった場合はエラーを出す
    else:
        print('Wi-Fi接続成功')
        ip = wlan.ifconfig()[0]  # 自分のIPアドレスを取得
        print(f'IPアドレス: {ip}')

# Wi-Fiに接続(secrets.py に定義された情報を使用)
connect_to_wifi(secrets['ssid'], secrets['password'])

# NTPサーバーの設定
# デフォルトでは pool.ntp.org だが、ここでは Cloudflare の高速NTPサーバーを使用
ntptime.host = "time.cloudflare.com"

# インターネット経由で現在時刻(UTC)を取得してRTC(リアルタイムクロック)に設定
try:
    ntptime.settime()  # インターネットからUTC時刻を取得してRTCに設定する
    print("NTP時刻同期に成功しました")
except:
    print("NTP時刻同期に失敗しました")
    raise  # エラー内容を表示して終了

# 日本標準時(JST = UTC + 9時間)を取得する
# time.localtime() は1970年からの秒数をローカル時刻のタプルに変換する
jst_time = time.localtime(time.time() + 9 * 60 * 60)  # UTC時刻に9時間分を加算してJSTに変換

# フォーマットして整形された日時を表示(例:2025/05/14 07:30:00)
# f文字列(f-string)を使用して可読性を高めている
print(f"{jst_time[0]}/{jst_time[1]:02d}/{jst_time[2]:02d} "      # 年/月/日
      f"{jst_time[3]:02d}:{jst_time[4]:02d}:{jst_time[5]:02d}")  # 時:分:秒

参考:WiFiのSSIDやパスワードなどの秘密の情報の別ファイルの例

# secrets.py

secrets = {
'ssid': 'SSIDXXX',
'password': 'PASWORDXXX',
'sender_email': 'XXXXXXX@gmail.com',
'sender_name': 'RaspberryPiPico',
'sender_app_password': 'XXXX XXXX XXXX XXXX',
'recipient_email': 'YYYYYYY@gmail.com',
'email_subject': 'Email from RPi Pico',
}
#表示結果
Wi-Fi接続成功
IPアドレス: 192.168.11.1
NTP時刻同期に成功しました
1970/01/01 12:34:56

基本のプログラム

# 必要なモジュールをインポート
import time       # 時刻関連(sleepやlocaltimeなど)を扱うため
import network    # Wi-Fi(無線LAN)接続を行うため
import ntptime    # NTP(ネットワーク時刻プロトコル)で現在時刻を取得するため
from secrets import secrets  # Wi-FiのSSIDとパスワードを外部ファイルから読み込む

# Wi-Fi接続の設定
w = network.WLAN(network.STA_IF)  # 無線LANインターフェースを STA(ステーション)モードで作成
w.active(1)  # インターフェースを有効化(1はTrue)
w.connect(secrets['ssid'], secrets['password'])  # Wi-Fiに接続(SSIDとパスワードはsecrets.pyに保存)
time.sleep(1)  # 接続が安定するまで1秒待機(必要に応じて調整可)

# NTP(ネットワークタイムプロトコル)で現在時刻を取得・同期
ntptime.host = "time.cloudflare.com"  # NTPサーバーとして Cloudflare を指定
ntptime.settime()  # NTPサーバーから現在時刻(UTC)を取得し、システムの内部時刻に設定

# 現在時刻(UTC)に9時間を加えて、日本時間(JST)に変換して表示
t = time.localtime(time.time() + 9 * 3600)  # 3600秒 × 9時間 = 32400秒を加算

# tは time.struct_time型(年, 月, 日, 時, 分, 秒, ...)なので、それぞれの要素をフォーマットして表示
# 例:2025/05/24 18:45:00 のように出力される
print(f"{t[0]}/{t[1]:02}/{t[2]:02} {t[3]:02}:{t[4]:02}:{t[5]:02}")
# timeモジュールを読み込む。これにより、時刻に関する機能が使えるようになる。
import time

# time.gmtime(0) は、UNIX時間 0(=1970年1月1日0時0分0秒)を
# 協定世界時(UTC)として年・月・日・時・分・秒などに変換。
# UTCは世界共通の基準時間です。
print("time.gmtime(0)   :", time.gmtime(0))  # 1970年1月1日 0:00:00(UTC)

# time.localtime(0) は、同じUNIX時間 0 を「ローカル時間(現地時間)」として変換。
# 日本のPCなどでは、JST(日本標準時=UTC+9)として扱われるため、
# 午前9時(09:00:00)になりるが、MicroPython環境ではUTCのまま返る。
print("time.localtime(0):", time.localtime(0))  # 1970年1月1日 9:00:00(JST)※MicroPythonではUTC

# time.gmtime() は、現在のUNIX時間をUTCとして、日時の情報に変換。
# RTCが正しく設定されていないと、間違った時間が表示される。
print("time.gmtime()    :", time.gmtime())  # 現在のUTC時刻(世界標準時間)

# time.localtime() は、現在のUNIX時間をローカル時間に変換。
# PCでは通常、日本時間(JST)になりますが、
# MicroPython環境ではタイムゾーンが設定されていないため、UTCのままになる。
print("time.localtime() :", time.localtime())  # 現在のローカル時刻(JSTのつもりでもUTC)

# time.time() は、「今この瞬間のUNIX時間(エポック秒)」を返す。
# これは 1970年1月1日から何秒経過したかを表す数値です。
# この値をもとに、gmtime() や localtime() に変換して使う。
print("time.time()      :", time.time())  

参考にしたサイトです。

クラス RTC -- リアルタイムクロック — MicroPython latest ドキュメント

コメント