編集履歴一覧に戻る
airpocketのアイコン画像

airpocket が 2023年03月03日09時51分27秒 に編集

初版

タイトルの変更

+

UIFlowでNTPとRTCを使う際の覚書

タグの変更

+

M5Stack

+

RTC

+

NTP

+

UIFlow

記事種類の変更

+

セットアップや使用方法

ライセンスの変更

+

(MIT) The MIT License

本文の変更

+

# はじめに M5Stackをデータロガーやセンサーノードとして使うときに、時刻情報を扱うことがあります。 Wi-Fi環境があればNTPが使えますが、ない場合はRTCも併せて使う必要があります。 私はM5Stackを簡易データロガーに使うケースが多く、Wi-Fi無し環境も想定してRTCを用いる際の覚書です。 また、データをMicroSDカードに保存することも考え、時刻情報をゼロ埋めしてファイル名に使う処理も同時に行っています。 # ハードウェア 今回は手持ちのM5Stack FireとRTCユニットを使っています。 BasicやGrayなど、RTCを内蔵していないモデルの場合は同様の構成になります。Core2やSticksCはRTCを内蔵しているためRTCユニットは不要です。 # 時刻合わせ まずはRTCの時刻合わせを行います。 開発中はWi-Fi有り環境が前提ですので、NTPを使って時刻合わせを行います。 プログラムの全景はこんな感じです。 ![キャプションを入力できます](https://camo.elchika.com/c725b1b6ac3bfa73c054622fb1c2a94844ea717a/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f38666662353561372d373433312d346234382d383832642d3565323665663534343465652f61616336303035332d303430652d343834302d613563642d643530303836333462666530/) NTPは日本のサーバから情報を入手して、日本のタイムゾーン「+9」に合わせています。 NTPの「Get year」ブロックは年を4桁、RTCの「set rtc」ブロックは2桁で扱っている様ですので、Get year - 2000をしてから入力しています。 また、NTPの「Get weekday」ブロックは曜日情報をテキストで出力するので、「weekday2num」関数を作って数値に変換したうえでRTCに設定しています。 # ゼロパディングしてファイル名っぽくしてみる ブロックを2個だけ追加しています。 ![キャプションを入力できます](https://camo.elchika.com/502ad2bc8cbc2836b277ffae6b718555fc68f4c0/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f38666662353561372d373433312d346234382d383832642d3565323665663534343465652f64336336396164332d386637622d343064372d613332382d616561366336393231626335/) 追加しているのはこの部分です。 ![キャプションを入力できます](https://camo.elchika.com/d4adfad7a1d5cff0c84600030c67009601adcbcd/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f38666662353561372d373433312d346234382d383832642d3565323665663534343465652f37633262396362642d306639372d346161632d383439632d303135333733393736653665/) filenameという変数を作って、その中にゼロ埋めして8桁にした年月日をテキストで入れています。 残念ながらゼロ埋してテキスト化するブロックはありませんので、コードを実行ブロックを使ってmicropythonのformat機能を使っています。 コード実行ブロックの中身はこんな感じです。 ``` filename = str(rtc_0.get_date_time(6) + 2000 ) + ('{:02}'.format(rtc_0.get_date_time(5))) + ('{:02}'.format(rtc_0.get_date_time(4))) ``` rtc_0.get_date_time(6) は、RTCユニットから年情報を2桁の数値で取り出しているので2000を足してstrに変更しています。 rtc_0.get_date_time(5)とrtc_0.get_date_time(4)はそれぞれ時間と分ですので、formatで2桁のゼロ埋めstrに変更しています。 # まとめ 最近は M5Stackを簡易的なデータロガーにするケースが良くあります。データはMQTTでサーバに投げる事が多いのですが、Wi-Fiが使えない場合はSDカードにCSVで保存しています。 そんな時にこの手の処理を使うのですが、細かいところはすぐに忘れてしまうので覚書にして公開しておきます。