ArduinoタイムライブラリとRTCライブラリ

私はRTClib.hとTimeLib.hをUnoで使用しています。

何日も苦労しています利用可能なさまざまなRTCライブラリと、それらをArduino TimeLibraryで使用する方法を理解する上で。

質問1
ループを通過するたびに新しいnow()オブジェクトを作成したくない場合、x秒ごとにタイムライブラリをRTCに同期するにはどうすればよいですか? RTClib関数now.hournow.minuteなどを使用しようとすると、DateTime now = RTC.now()を使用してnow()オブジェクトを作成する必要があります。

RTCLibに同等の関数はありますかDS1307RTCライブラリのsetSyncProvider(RTC.get)として?

setSyncInterval(5000)に相当するものはありますか

質問2
どのRTCLibを呼び出す必要がありますか?例ではいくつか使用されています:

< RTClib.h >

” RTClib “引用符を使用

< RTCLib.h >大文字のL

で、次のいずれかを呼び出すこともあります:

RTC_DS1307 RTC

またはRTC_DS1307rtc

またはRTC_DS3231rtc

質問3
a。 tmElements_t tmはDS1307RTCライブラリの一部ですか?
b。これらはRTCからのtm.Hourtm.Minuteですか?
c。 RTClib.hに同等のものはありますか?

そして最後に、使用法を示すために以下のコードを投稿しました:

#include "RTClib.h" #include <Wire.h> #include <TimeLib.h> RTC_DS1307 RTC; void setup() { Serial.begin(9600); Wire.begin(); //sets up the I2C RTC.begin(); //initializes the I2C to the RTC if (! RTC.begin()) { Serial.println("Couldn"t find RTC"); } // Set the RTC Time to 5:10:30 Nov 3 2020 RTC.adjust(DateTime(2020,11,3,5,10,30)); //Set Arduino Time Library different than RTC time to see which is which setTime(9, 27, 05, 14, 07, 2015); } void loop() { /* // How do I sync Time Library to RTC after x seconds? setSyncProvider(RTC.get); // This is in the DS1307RTC.h Library setSyncInterval(5000); // Are there such functions in RTClib ? */ DateTime now = RTC.now(); // Pulls RTC time into now(). Does not sync with Time Library // Do not want to do this every loop. //Print RTC Time Serial.println(); Serial.print("RTC now.hour "); Serial.println(now.hour()); Serial.print("RTC now.minute "); Serial.println(now.minute()); Serial.print("RTC now.second: "); Serial.println(now.second()); Serial.println(); Serial.println(); //Print Arduino TimeLib Time Serial.print("Time Lib Hour: "); Serial.print(hour()); Serial.println(); Serial.print("Time Lib Min: "); Serial.print(minute()); Serial.println(); Serial.print("Time Lib Sec: "); Serial.print(second()); Serial.println(); Serial.println(); delay(1000); } 

2020年11月5日更新

ほぼ理解できたと思います。このコードが私が思っていることを実行しているかどうかを教えてください。具体的には次のとおりです。

セットアップの場合:
RTCを5:10:30に設定します。
タイムライブラリをに設定します。 9:27:05 with setTime()。
Time LibraryをDateTimeでRTC時間に設定します(9:27:05を上書き)?
tm.Hour = nowを使用してTimeLibrary変数をRTCに設定します。時間など

ループ内:
5秒ごとに時間()、分()秒()をRTC時間で更新します。
ループごとにtm.hourを時間()で更新します。 、など。

シリアルプリントには、下部に示すように各ループが交互にtm.Hour、tm.Minuteと表示されるため、まだ正しくないことがわかっています。

 #include "RTClib.h" #include <Wire.h> #include <TimeLib.h> RTC_DS1307 RTC; time_t time_provider() { return RTC.now().unixtime(); } tmElements_t tm; //part of Time Library void setup() { //setSyncProvider(time_provider); Serial.begin(9600); Wire.begin(); //sets up the I2C RTC.begin(); //initializes the I2C to the RTC if (! RTC.begin()) { Serial.println("Couldn"t find RTC"); } // Set the RTC Time to 5:10:30 Nov 3 2020 RTC.adjust(DateTime(2020,11,3,5,10,30)); //Set Arduino Time Library different than RTC time 9:27:05 setTime(9, 27, 05, 14, 07, 2015); //Setting Time Library to RTC time DateTime now = RTC.now(); tm.Hour = now.hour(); tm.Minute = now.minute(); tm.Second = now.second(); } void loop() { setSyncProvider(RTC.now); setSyncInterval(5000); //Time Library time updates to RTC every 5 seconds tm.Hour = hour(); tm.Minute = minute(); tm.Second = second(); Serial.print("tm.Hour: "); Serial.print(tm.Hour); Serial.println(); Serial.print("tm.Minute: "); Serial.print(tm.Minute); Serial.println(); Serial.print("tm.Seconds: "); Serial.print(tm.Second); Serial.println(); Serial.println(); delay(1000); }  

シリアルプリント:

tm.Hour: 5 tm.Minute: 34 tm.Seconds: 56 tm.Hour: 18 tm.Minute: 0 tm.Seconds: 0 tm.Hour: 5 tm.Minute: 34 tm.Seconds: 56 tm.Hour: 18 tm.Minute: 0 tm.Seconds: 0 tm.Hour: 5 tm.Minute: 34 tm.Seconds: 56 tm.Hour: 18 tm.Minute: 0 tm.Seconds: 0 

回答

最初にこれらのライブラリの背景を説明しましょう。

Timeライブラリはmillis()を使用します計時。これは大幅なドリフトの影響を受ける可能性があるため、外部のタイムプロバイダーと定期的に同期する手段を提供します。したがって、関数setSyncProvider()およびsetSyncInterval()

RTClibは、RTCとのインターフェースを目的としています。それ自体は時間管理を提供しません。RTCをnow()メソッドでクエリすることで現在の時刻を取得します。

これら2つのライブラリは、それぞれをうまく補完できます。その他、RTClibはタイムライブラリのタイムプロバイダーとして使用できるため:

 // Provide the RTC time to the Time library. time_t time_provider() { return RTC.now().unixtime(); } void setup() { // ... setSyncProvider(time_provider); }  

新しいnow()オブジェクトを作成したくない場合[…]

実際にはDateTimeオブジェクトと呼ばれます。

]

はい、 DateTimeクラスtmElements_t構造とは異なり、DateTimeのデータフィールドはそうではないことに注意してください。パブリックであり、アクセサーを使用して取得する必要があります:year()month()day()

代替の計時方法

Arduino Unoを使用しているため、3番目の計時方法があります。検討したい。ループの反復ごとにRTCを照会する(RTClib)か、RTCの読み取り値をmillis()(タイムライブラリ)で補間する代わりに、RTCの1Hz出力を割り込みピンにルーティングできます。 ISRの秒数を数えます。 avr-libcタイミングコードは、この方法で計時を提供するように設計されています。つまり、次のようになります。

 // Initialize the system time from the RTC. set_system_time(RTC.now().secondstime()); // Keep the time in sync using the 1 Hz output of the RTC. pinMode(pin1Hz, INPUT_PULLUP); attachInterrupt(digitalPinToInterrupt(pin1Hz), system_tick, FALLING);  

詳細については、サンプルスケッチを参照してください。 interrupts1Hz.ino はRTClibで提供されます。


編集1 :コメントに答える

[Arduino割り込みピン]はRTCのどのピンに接続しますか?

使用しているRTCによって異なります。質問のコードに示されているように、DS1307であると想定します。RTCのデータシートをご覧ください。6ページに「ピンの説明」というタイトルの表があります。この表から:

pin :7
name :SQW / OUT
関数:方形波/出力ドライバー。有効にすると、SQWEビットが1に設定され、SQW / OUTピンは4つの方形波周波数(1Hz、4kHz、8kHz、32kHz)のいずれかを出力します。 SQW / OUTピンはオープンドレインであり、外部プルアップ抵抗が必要です。 SQW / OUTは、V CC またはV BAT のいずれかが適用された状態で動作します。プルアップ電圧は、V CC の電圧に関係なく最大5.5Vになる可能性があります。使用しない場合、このピンはフローティングのままにしておくことができます。

RTC モジュールを使用している場合は、把握する必要があります。このピンがモジュールのコネクタのどこに露出しているかを確認します。

いずれの場合も、

 RTC.writeSqwPinMode(DS1307_SquareWave1HZ);  

編集2 :質問の更新についてコメントします:

 // Set the RTC Time to 5:10:30 Nov 3 2020 RTC.adjust(DateTime(2020,11,3,5,10,30));  

正解。

 // Set Arduino Time Library different than RTC time 9:27:05 setTime(9, 27, 05, 14, 07, 2015);  

正解です。日付は2015-07-14です。

 // Setting Time Library to RTC time DateTime now = RTC.now(); tm.Hour = now.hour(); tm.Minute = now.minute(); tm.Second = now.second();  

いいえ。これはtm変数。タイムライブラリの現在の時刻の考え方には影響しません。 tmの日付フィールドはこの時点では初期化されておらず、無効である可能性があることに注意してください(23か月、125日など)。

 setSyncProvider(RTC.now);  

これは正しくないため、コンパイラの警告が生成されるはずです。 setSyncProvider()は、現在の時刻をUnix時刻として返す関数(time_tタイプの単純な整数)を想定しています。タイプDateTimeで、現在の時刻を分解された形式(年、月など)で返す関数を提供しています。 Timeライブラリはそれを理解せず、たとえば18:00:00のようなゴミを生成する可能性があります。

RTC.now()によって返される時間はUnix時間に変換できますunixtime()メソッドを使用します。そのため、time_provider()関数を提供しました。

また、setSyncProvider()を呼び出すことは想定されていません。 setSyncInterval()ループの反復ごとに。setup()で一度だけ実行します。

 // Time Library time updates to RTC every 5 seconds tm.Hour = hour(); tm.Minute = minute(); tm.Second = second();  

繰り返しますが、これは変数tmのみを更新しています。Timeライブラリが現在の時刻であると信じているものには影響しません。

回答

DS1307RTCライブラリのsetSyncProvider(RTC.get)と同等の関数がRTCLibにありますか?

setSyncInterval(5000)と同等

これらはTimeLib関数です。ivと同等の”はありません。 id = “6fd0f512c6”>

TimeLibを使用しているので time_tを返します。その関数の内容はあなた次第です。

どのRTCLibを呼び出す必要がありますか?例ではいくつか使用されています。

大文字と小文字はヘッダーファイルの名前と一致する必要があります。 Windowsは気にせず、OS Xは通常気にしませんが、構成することができます。 Linuxは 気にかけていて、一致する必要があります。コードを移植可能にしたい場合は、大文字と小文字をファイルと同じに保つ必要があります。

また、次のいずれかを呼び出すこともあります。

物理RTCに一致するオブジェクトを作成する必要があります。

a。 tmElements_t tmはDS1307RTCライブラリの一部ですか?

いいえ。これらはTimeLibの一部です。

b。これらはRTCからのtm.Hourtm.Minuteですか?

これらは、呼び出される関数によって割り当てられるものです。それらは単なる変数です。何でも含めることができます。

c。 RTClib.hに同等のものはありますか?

いいえ。ただし、TimeLibを使用している場合は、存在する必要はありません。

つまり、

  • 使用するライブラリ(RTCLibなど)を介してRTCから時間を取得し、秒数を計算する関数を作成する必要があります。 00:00:00以降1970年1月1日、time_tとして返されます。
  • TimeLibに渡しますsetSyncProvider()
  • setSyncInterval()で同期頻度を設定します。

コメント

  • nowは、nowオブジェクトを割り当てた時点でのRTCからの時間です。.hour()は、そのオブジェクトに含まれる時間です。hour()は、TimeLibライブラリからの時間です。はい。setSyncProvider()は RTCに何かを送信するのではなく、RTCから定期的に時刻を取得し、TimeLibを現在の時刻で更新します。
  • ‘それより少し複雑です。TimeLibはmillis()を使用します時間を追跡します。 setSyncInterval()に応じて時刻が何であるかについての内部的な考えを定期的に更新します。 hour()を要求したときに、setSyncInterval()で指定したリアルタイムを最後に取得してからさらに時間が経過すると、次のようになります。 RTCからの時間。それ以外の場合は、時間は独自の内部計算に従って考えているだけです。
  • 提供されたヘルプを使用して投稿を更新しました。ほぼ理解できました。
  • ‘同期プロバイダーと間隔を絶えず変更しているためです。これらはセットアップで一度だけ設定し、二度と設定することはありません。
  • そうですね。 ‘は、’を扱っているので、tmElements_t構造体はまったく必要ありません。 withは単純な数字です。 tmElements_tは、別の関数に渡したい場合に、それらをすべてまとめる便利な方法です。 Serial.print(hour());

だけ

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です