フォト
2018年11月
        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30  
無料ブログはココログ

« LED electronic display | トップページ | Arduino IDEでのchar型の変数の振舞 »

2017年3月30日 (木)

次は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);
}

実行結果

01

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時刻を電池で保持

« LED electronic display | トップページ | Arduino IDEでのchar型の変数の振舞 »

arduino」カテゴリの記事

ARM」カテゴリの記事

STM32」カテゴリの記事

コメント

初めて連絡致します。
私"久”といいます。
Arduino IDE1.8.5にてSTM32F103C8T6を動かしていますが(ほとんど皆さんのスケッチを
参考にさせていただいています。)
 さて、過去にAitendoの16セグの4連表示器を手に入れましたので、時計を作成して1年ほど
経ったのですが、その時は、PICを用いていたため、RTCは別に設けていました。
精度はそこそこだったのですがやはりずれが生じてきて、嫁からの苦情が出てきました。
 そこでSTM32F103C8T6を使用して内蔵のRTCもあるし、位置の不安定なNEO-6mのGPSを
使って、GPS時計を考えたのですが、STM32F側のRTCのセットアップができません。
標準のスケッチのRTCを使用するとパソコンの時間を表示するのみです。
GPSの時刻と不一致の場合はGPSの時刻をRTC側に入れたいのですが、どうすれば
内部RTCに保存する方法(GPSからは1文字づつ取り出せます)を教えてください。

 以前に「次はSTM32ボード...(12)」のスケッチでは動いています。去年実験したものです。
(この時はIDEは1.8.5ではなかったと思います,実はその基板は動いているのですが
スケッチの書き換えはしていません)心配性なので複数を作成していますがこのボードでは
16セグLEDの動作は確認できていません。I2CのLCDで表示の確認を行っています。

新しく作成した基板上では同上のもののスケッチでは
”rtc.setTime(&t)” がエラーと表示されます。
 安定版R20170323では使用不可とありますが、その解除策はSH1106.cpp云々とありますが
未使用の機器のドライバーをスケッチにいれても動作はするのでしょうか?
パソコンはWin8.1をWin10に自動で変更して使用しています。
また設定は下記の通りです。
ボード: "Generic STM32F103C series"
Variant: "STM32F103CB(20K RAM 128K Flash)"
CPU Speed(MHz): "72Mhz(Normal)"
Upload method:"STM32duino bootloader"
Optimize "Smallest(difault)"
シリアルポート: "COM5(Maple Mini)"

書き込みはUSBを使用しています。
お忙しいところ恐縮ですがご指導ください。  

久さん、こんにちは

>> どうすれば内部RTCに保存する方法(GPSからは1文字づつ取り出せます)を教えてください。

豊四季TinyBASICの SETDATE コマンド実装コードが参考になると思います。
https://github.com/Tamakichi/ttbasic_arduino/blob/ttbasic_arduino_lcd_plus/ttbasic/basic.cpp

上記リンク先の2617行あたりが、SETDATEコマンドです。
・2620行~2640行がArduino STM321安定版での実装、
・2641行~2661行からがArduino STM32の更新版での実装
です。

**Arduino STM32の最新版の場合の実装の抜粋**
※一部文字がポスト出来なため、全角文字に置き換えています。

#include <RTClock.h>
#include <time.h>
RTClock rtc(RTCSEL_LSE);

struct tm_t t;
int16_t p_year, p_mon, p_day;
int16_t p_hour, p_min, p_sec;

struct tm_t t;
// RTCの設定
t.year = p_year - 1970; // 年 [1970からの経過年数]
t.month = p_mon; // 月 [1-12]
t.day = p_day; // 日 [1-31]
t.hour = p_hour; // 時 [0-23]
t.minute = p_min; // 分 [0-59]
t.second = p_sec; // 秒 [0-61] うるう秒考慮
rtc.setTime(t); // 時刻の設定

RTClockのAPIリファレンスに構造体の説明があります。
https://scrapbox.io/ArduinoSTM32/RTClock

時刻の取得は同リンクの下記コマンドの実装が参考になると思います。
DATEコマンド:2838行あたり
GETDATEコマンド:2667行あたり
GETTIMEコマンド:2753行あたり

内部RTCの精度はマイコン外付けに使われている32,768 Hzクリスタルに依存します。
ボードに使われているクリスタルが粗悪品の場合、精度が悪くなります。


折角なので、最新版のスケッチも記載しました。

早々ののお返事ありがとうございます。
当日のお返事はいただけないものと思い立った今開きました。
ご指摘の件を実行したいのですが、午前中は所用があり午後の
開始となります。
今しばらくお待ちください。

やっと動作確認ができました。
"最新版のスケッチを記載しました”とありましたが
その意味が分からず、BASICのプログラムを眺めて色々とやっていましたが、
やはり動かず。 最新のスケッチはこれとは違うのかとさがしましたところ
「次はSTM32ボード...(12)」の初めにあるではありませんか。
まったくお恥ずかしい限りです。
取り合えず貴殿のプログラムが動作しましたのでご報告まで
どうもありがとうございました。

久 さん

報告ありがとうございます。
利用者も少なく、利用環境Arduino STM32を安定版(正式リリース版 R20170323) と
最新版(masterブランチ 随時更新)を意識して使い分けている人は少ないと思います。
ちょっと分かりずかいですね。


コメントを書く

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/571408/65086972

この記事へのトラックバック一覧です: 次はSTM32ボードを積極的に使ていきたい(12) - 内部RTCの利用:

« LED electronic display | トップページ | Arduino IDEでのchar型の変数の振舞 »