質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

Q&A

解決済

2回答

13411閲覧

Arduino でRTCを使って得た時刻の比較を行いたい

fenri

総合スコア11

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

0グッド

0クリップ

投稿2018/04/16 06:51

編集2018/04/16 08:28

Arduinoを使用して、時計のようなFWを作成しています。

RTCはDS3231を使用し、
<DS3232RTC.h> //http://github.com/JChristensen/DS3232RTC
をincludeして使用しています。

そこでタイムアップ処理を組み込む為に、時刻の比較(差分)を行いたいのですが
うまくいっていません。

lang

1#include <DS3232RTC.h> //http://github.com/JChristensen/DS3232RTC 2#include <Time.h> //http://www.arduino.cc/playground/Code/Time 3time_t time1; 4処理1 5{ 6 time1 = RTC.get(); 7} 8 9処理2 10{ 11 time_t timeNow = RTC.get(); 12 double dift = difftime(timeNow, time1); 13}

上記のようなソースでコンパイルすると
error: 'difftime' was not declared in this scope
とエラーが出てしまいます。

別途
#include <time.h>
を追記してみましたが同様のエラーになります。

どうしたらスマートに時刻の比較ができますでしょうか。
ご教授お願いします。

開発環境は
Windows10、ArduinoIDE
Arduino Pro mini 5V
RTC:DS3231
電源はPCのUSB 5Vから供給

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dodox86

2018/04/16 07:52

開発環境は普通にArduinoIDEですか。それとも arduino for visual studioなどでしょうか。より詳細に、正確に書いた方が回答を得やすいと思います。
fenri

2018/04/16 08:21

大変失礼しました。開発環境を追記しました。
guest

回答2

0

difftimeというキーワードが見つからない、といってますので、見つけられるようにしてやってください

#include <Time.h> ↓ #include <time.h>

にすればいいんじゃないかな


質問の追記による追記

を追記してみましたが同様のエラーになります。

同様だろうけど、全く同じエラーじゃないよね?

投稿2018/04/16 06:59

編集2018/04/16 08:31
y_waiwai

総合スコア87749

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2018/04/16 08:01

ところが、質問者が出したURLみると、どーもdifftimeがないみたいなのだよ。 んで、ぐぐったら、time.h にdifftimeが定義されてるという記事ががが どーしたもんかねえw
dodox86

2018/04/16 08:05 編集

標準のCランタイムのdifftimeを使おうとしているのではないかと思いました。difftimeはArduinoのTimeライブラリのものではないはずです。だからプロトタイプ宣言が無いのでエラーになっているものと踏んでいます。
y_waiwai

2018/04/16 08:17

しかし、オレオレライブラリを公開してくれるのはいいが、ヘッダファイルの名前が既存のものと同一ってのはヤバイ。 なに考えてんだ。。
fenri

2018/04/16 08:31

y_waiwai様 dodox86様 回答ありがとうございます。 dodox86様がおっしゃる通り、標準のCランタイムを使おうとしているのですが、 エラになる。という事が質問内容になります。 「Arduinoで標準のCランタイム」というキーワードでもう少し調べて見ます。
y_waiwai

2018/04/16 08:32

全く同じエラーが出るんじゃないよね? 出たエラーをコピペで出してくだされ
dodox86

2018/04/16 08:39

Arduino 1.8.5 のIDEをインストールしてみたのですが、標準のtime.h自体は存在していて、difftime()のプロトタイプ宣言もありました。 ただ、返り値の方はdouble ではなく、int32_t です。ヘッダ部のコメントに注意書きがあります。 > Section 7.23.2.2, difftime() > Due to the lack of a 64 bit double, the function difftime() returns a long integer. In most cases > this change will be invisible to the user, handled automatically by the compiler. 思うに、RTC用の別のTime.hが#includeされて、標準のtime.h が隠れてしまっているのではないかと。
y_waiwai

2018/04/16 08:48

これ、やっかいやなあ。 想定してた最悪いっとるw
dodox86

2018/04/16 09:12

RTCのDS3231が秒までの解像度なので、無理してdifftime使わなくても良いかもしれないし、自分で独自実装してしまってもいいでしょうし、 リンクでエラーが出なければ、単にプロトタイプ宣言を自分でしてしまえばいいかもしれません。time.h 私のArduino開発環境のtime.hのプロトタイプ宣言を抜粋しますと、 /** The difftime function returns the difference between two binary time stamps, time1 - time0. */ int32_t difftime(time_t time1, time_t time0);
y_waiwai

2018/04/16 09:24

まあ、標準のtime.hを使おうとするなら、後付けのTime.h がどこかにあるのでそれ探して、それを削除するか、コンパイラのインクルードパスからそのディレクトリを外すか、ということになりますねー 同名の関数があるなら、後付のライブラリファイルも削除する必要がありますな。
guest

0

ベストアンサー

手持ちのArduinoUNOを引っ張り出して確認してみました。とは言えRTCのDS3231を実装して試したわけではないので、ビルドが通るまでしか確認できてませんが。

結論としては、Cの標準関数版のdifftime関数は使えないので、代替して何とかする必要があります。
time_t型は本来、必ずしも秒単位ではないですが、ArduinoのTimeライブラリだと、time_t型は秒単位です。なので、Arduinoのプロジェクトに限っては秒として扱って問題無いはずです。

C

1 time_t start_time = RTC.get(); 2 ... // いろいろ処理 3 4 time_t end_time = RTC.get(); 5 6 time_t elapsed = end_time - start_time;

elapsed変数に経過秒数が入ります。これでdifftime関数の結果と同等と考えてよさそうです。これで充分(と言うかこれしか無い)ではないでしょうか。


以下、参考情報として:

RTCのDS3232用のライブラリはArduinoのTimeライブラリに依存している為、Timeライブラリを使えるようインクルードしないとエラーになります。

Arduino:1.8.5 (Windows 7), ボード:"Arduino/Genuino Uno" In file included from D:\Users\user01\Documents\Arduino\sketch_apr16a\sketch_apr16a.ino:3:0: D:\Users\user01\Documents\Arduino\libraries\DS3232RTC-master\src/DS3232RTC.h:25:70: fatal error: TimeLib.h: No such file or directory #include <TimeLib.h> // https://github.com/PaulStoffregen/Time

そうするとリンクするライブラリが変わるようで、試しに標準関数版difftimeを自力でプロトタイプ宣言して使うようにしても、リンクでエラーになります。

C

1// ※ビルドの結果を見る為だけのコードの為、内容にはほとんど意味はありません 2#include <stdio.h> 3#include <Time.h> // https://github.com/PaulStoffregen/Time 4#include <DS3232RTC.h> 5 6int32_t difftime(time_t time1, time_t time0); 7 8time_t start_time; 9void setup() { 10 start_time = RTC.get(); 11} 12 13void loop() { 14 time_t current_time; 15 time_t elapsed_time; 16 17 current_time = RTC.get(); 18 elapsed_time = current_time - start_time; 19 20 // start_time 〜 current_timeの経過秒数を取得 21 elapsed_time = difftime(current_time, start_time); 22} 23

ビルドの結果です。

C:\Users\user01\AppData\Local\Temp\ccjcKCug.ltrans0.ltrans.o: In function `loop': D:\Users\user01\Documents\Arduino\sketch_apr16a/sketch_apr16a.ino:19: undefined reference to `difftime(unsigned long, unsigned long)' collect2.exe: error: ld returned 1 exit status exit status 1

DS3231用ライブラリを使う限り、標準関数版のdifftime、更には標準のtime.hで宣言される各種time関連関数は、使用をあきらめなければならないようです。

投稿2018/04/16 13:22

編集2018/04/17 00:42
dodox86

総合スコア9183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fenri

2018/04/16 23:48

わざわざ検証までしていただきありがとうございます。 time.hは使用できないのですね。。。 ひとまずdiffについては time_tの差で見てみようと思います。 ありがとうございました。
dodox86

2018/04/17 00:45 編集

コード中のdifftime関数の使い方が間違っていたので記述を修正しました。 ※久しぶりにArduinoUNOを使ったので愉しかったですw
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問