内蔵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 ドキュメント
コメント