次はSTM32ボードを積極的に使ていきたい(12) - 内部RTCの利用
Bule Pillボード(STM32F103C8T6)の内部RTCを使った時刻表示
2018/08/24 更新
・利用環境のArduino STM32安定版(R20170323) と最新版(masterブランチ 随時更新)で
RTClockライブラリの仕様が異なるため、それぞれのバージョンのサンプルスケッチを
を掲載するよう、内容の一部を修正しました。
最新版の更新が激しいため、
私は、一部のプログラムは安定版を継続して利用しています。
最新版の途中で、曜日開始が日曜から月曜に変更されたのに今(08/24)気づきました^^;
曜日を設定しなくても(0を設定)でも、他の時刻情報で自動で設定されるようです。
設定しなくても、読出し時に正しい曜日が読み出せました。
スケッチ(Arduino STM32 R20170323安定版対応)
// // FILE: stm_RTC_sample.ino // Arduino STM32 内部RTCを利用して時刻を表示する // 作成日 2017/03/30 by たま吉さん // #include <RTClock.h> #include <time.h> RTClock rtc(RTCSEL_LSE); char *wday[] = {"Sun","Mon","Tue","Wed","Thr","Fri","Sat"}; // セットアップ void setup() { struct tm t; Serial.begin(115200); while (!Serial.isConnected()) delay(100); t.tm_isdst = 0; // サーマータイム [1:あり 、0:なし] t.tm_year = 2017-1900; // 年 [1900からの経過年数] t.tm_mon = 3-1; // 月 [0-11] 0から始まることに注意 t.tm_mday = 30; // 日 [1-31] t.tm_wday = 4; // 曜日 [0:日 1:月 2:火 3:水 4:木 5:金 6:土] t.tm_hour = 22; // 時 [0-23] t.tm_min = 10; // 分 [0-59] t.tm_sec = 0; // 秒 [0-61] うるう秒考慮 rtc.setTime(&t); // 時刻の設定 } void loop() { time_t tt; struct tm* st; char str[64]; tt = rtc.getTime(); // 時刻取得 st = localtime(&tt); // 時刻型変換 sprintf(str, "%04d/%02d/%02d [%s] %02d:%02d:%02d", st->tm_year+1900, // 西暦年 st->tm_mon+1, // 月 st->tm_mday, // 日 wday[st->tm_wday], // 曜日 st->tm_hour, // 時 st->tm_min, // 分 st->tm_sec // 秒 ); Serial.println(str); delay(1000); }
スケッチ(Arduino STM32 最新版 2018/08/24時点)
// // FILE: stm_RTC_sample.ino // Arduino STM32 内部RTCを利用して時刻を表示する(最新版対応) // 作成日 2018/08/24 by たま吉さん // #include <RTClock.h> #include <time.h> RTClock rtc(RTCSEL_LSE); char *wday[] = {"Mon","Tue","Wed","Thr","Fri","Sat","Sun"}; // セットアップ void setup() { struct tm_t t; Serial.begin(115200); while (!Serial) delay(100); t.year = 2018-1970; // 年 [1970からの経過年数] t.month = 8; // 月 [0-11] 0から始まることに注意 t.day = 24; // 日 [1-31] t.weekday = 5; // 曜日 [0-6] 0:月曜 ~ 6:日曜 t.hour = 12; // 時 [0-23] t.minute = 0; // 分 [0-59] t.second = 0; // 秒 [0-59] rtc.setTime(t); // 時刻の設定 } void loop() { char str[64]; struct tm_t st; rtc.getTime(st); // 時刻取得 sprintf(str, "%04d/%02d/%02d [%s] %02d:%02d:%02d", st.year+1970, // 西暦年 st.month, // 月 st.day, // 日 wday[st.weekday], // 曜日 st.hour, // 時 st.minute, // 分 st.second // 秒 ); Serial.println(str); delay(1000); }
実行結果
Blue Pillボードでは動作しますが、Black Pillボードでは動作しませんでした。
動かすとフリーズします。
→ 2017/04/01 追記
Black Pillボードでも動作するようです。
SNSにて上記プログラムが動作することを確認して頂きました。
私の持っているBlack Pillボードが調子悪い(不良)みたです。
参考文献
・RTClock 内蔵RTC(real time clock:リアルタイムクロック)利用ライブラリ(最新版API)
https://scrapbox.io/ArduinoSTM32/RTClock
関連記事
・次はSTM32ボードを積極的に使ていきたい(18) - Tiny BASIC(4) 内部RTC時刻を電池で保持
最近のコメント