回答編集履歴

4 difftimeの使い方が間違っていたので修正

dodox86

dodox86 score 3368

2018/04/17 09:42  投稿

手持ちのArduinoUNOを引っ張り出して確認してみました。とは言えRTCのDS3231を実装して試したわけではないので、ビルドが通るまでしか確認できてませんが。
結論としては、Cの標準関数版の`difftime`関数は使えないので、代替して何とかする必要があります。
`time_t`型は本来、必ずしも秒単位ではないですが、Arduinoの[Timeライブラリ](https://github.com/PaulStoffregen/Time)だと、`time_t`型は秒単位です。なので、Arduinoのプロジェクトに限っては秒として扱って問題無いはずです。
```
   time_t start_time = RTC.get();
   ... // いろいろ処理
```C
   time_t start_time = RTC.get();
   ... // いろいろ処理
   time_t end_time = RTC.get();
   time_t end_time = RTC.get();
   time_t elapsed = end_time - start_time;
   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
// ※ビルドの結果を見る為だけのコードの為、内容にはほとんど意味はありません
#include <stdio.h>
#include <Time.h> // https://github.com/PaulStoffregen/Time
#include <DS3232RTC.h>
int32_t difftime(time_t time1, time_t time0);
time_t start_time;
void setup() {
 start_time = RTC.get();
}
void loop() {
 time_t current_time;
 time_t elapsed_time;
 current_time = RTC.get();
 elapsed_time = current_time - start_time;
 elapsed_time = difftime(start_time, current_time);
 // start_time 〜 current_timeの経過秒数を取得
 elapsed_time = difftime(current_time, start_time);
}
```
ビルドの結果です。
```
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関連関数は、使用をあきらめなければならないようです。
3 コード間違い修正

dodox86

dodox86 score 3368

2018/04/16 22:34  投稿

手持ちのArduinoUNOを引っ張り出して確認してみました。とは言えRTCのDS3231を実装して試したわけではないので、ビルドが通るまでしか確認できてませんが。
結論としては、Cの標準関数版の`difftime`関数は使えないので、代替して何とかする必要があります。
`time_t`型は本来、必ずしも秒単位ではないですが、Arduinoの[Timeライブラリ](https://github.com/PaulStoffregen/Time)だと、`time_t`型は秒単位です。なので、Arduinoのプロジェクトに限っては秒として扱って問題無いはずです。
```
   time_t start_time = RTC.get();
   ... // いろいろ処理
   time_t end_time = RTC.get();
   time_t elapsed = end_time - elapsed;
   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
// ※ビルドの結果を見る為だけのコードの為、内容にはほとんど意味はありません
#include <stdio.h>
#include <Time.h> // https://github.com/PaulStoffregen/Time
#include <DS3232RTC.h>
int32_t difftime(time_t time1, time_t time0);
time_t start_time;
void setup() {
 start_time = RTC.get();
}
void loop() {
 time_t current_time;
 time_t elapsed_time;
 current_time = RTC.get();
 elapsed_time = current_time - start_time;
 elapsed_time = difftime(start_time, current_time);
}
```
ビルドの結果です。
```
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関連関数は、使用をあきらめなければならないようです。
2 一部修正

dodox86

dodox86 score 3368

2018/04/16 22:27  投稿

手持ちのArduinoUNOを引っ張り出して確認してみました。とは言えRTCのDS3231を実装して試したわけではないので、ビルドが通るまでしか確認できてませんが。
結論としては、Cの標準関数版の`difftime`関数は使えないので、代替して何とかする必要があります。
`time_t`型は本来、必ずしも秒単位ではないですが、Arduinoの[Timeライブラリ](https://github.com/PaulStoffregen/Time)だと、`time_t`型は秒単位です。なので、Arduinoのプロジェクトに限っては秒として扱って問題無いはずです。
```
   time_t start_time = RTC.get();
   ... // いろいろ処理
   time_t end_time = RTC.get();
   time_t elapsed = end_time - elapsed;
```
で `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
// ※ビルドの結果を見る為だけのコードの為、内容にはほとんど意味はありません
#include <stdio.h>
#include <Time.h> // https://github.com/PaulStoffregen/Time
#include <DS3232RTC.h>
int32_t difftime(time_t time1, time_t time0);
time_t start_time;
void setup() {
 start_time = RTC.get();
}
void loop() {
 time_t current_time;
 time_t elapsed_time;
 current_time = RTC.get();
 elapsed_time = current_time - start_time;
 elapsed_time = difftime(start_time, current_time);
}
```
ビルドの結果です。
```
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関連関数は、使用をあきらめなければならないようです。
DS3231用ライブラリを使う限り、標準関数版の`difftime`、更には標準の`time.h`で宣言される各種time関連関数は、使用をあきらめなければならないようです。
1 改行位置修正

dodox86

dodox86 score 3368

2018/04/16 22:26  投稿

手持ちのArduinoUNOを引っ張り出して確認してみました。とは言えRTCのDS3231を実装して試したわけではないので、
ビルドが通るまでしか確認できてませんが。
手持ちのArduinoUNOを引っ張り出して確認してみました。とは言えRTCのDS3231を実装して試したわけではないので、ビルドが通るまでしか確認できてませんが。
結論としては、Cの標準関数版の`difftime`関数は使えないので、代替して何とかする必要があります。
`time_t`型は本来、必ずしも秒単位ではないですが、Arduinoの[Timeライブラリ](https://github.com/PaulStoffregen/Time)だと、`time_t`型は秒単位です。
なので、Arduinoのプロジェクトに限っては秒として扱って問題無いはずです。
`time_t`型は本来、必ずしも秒単位ではないですが、Arduinoの[Timeライブラリ](https://github.com/PaulStoffregen/Time)だと、`time_t`型は秒単位です。なので、Arduinoのプロジェクトに限っては秒として扱って問題無いはずです。
```
   time_t start_time = RTC.get();
   ... // いろいろ処理
   time_t end_time = RTC.get();
   time_t elapsed = end_time - elapsed;
```
で `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
// ※ビルドの結果を見る為だけのコードの為、内容にはほとんど意味はありません
#include <stdio.h>
#include <Time.h> // https://github.com/PaulStoffregen/Time
#include <DS3232RTC.h>
int32_t difftime(time_t time1, time_t time0);
time_t start_time;
void setup() {
 start_time = RTC.get();
}
void loop() {
 time_t current_time;
 time_t elapsed_time;
 current_time = RTC.get();
 elapsed_time = current_time - start_time;
 elapsed_time = difftime(start_time, current_time);
}
```
ビルドの結果です。
```
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関連関数は、使用をあきらめなければならないようです。
結論として、DS3231用ライブラリを使う限り、標準関数版の`difftime`、更には標準の`time.h`で宣言される各種time関連関数は、使用をあきらめなければならないようです。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る