手持ちの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関連関数は、使用をあきらめなければならないようです。