回答編集履歴

4

追記

2019/08/08 13:33

投稿

thkana
thkana

スコア7652

test CHANGED
@@ -91,3 +91,13 @@
91
91
  1000000msは16分40秒。0.11%ぐらいのずれ、というところでしょうか。USBで繋いでいるしWindowsなのでタイムスタンプの10ms以下はあまり意味がないと思いますが、millis()に対して100000/99882を乗じればそこそこは合うかな、というところ。もっと長くデータを取れば桁数は増えるでしょうし、温度が変わるとまた影響があるでしょう。必要なら温度センサもつけて補正係数を求める、なんてことも考えられます。
92
92
 
93
93
  素直に正確なタイムベースを設けろ、の説もあり。質問者さんの必要な精度に合わせて手を打って下さい。
94
+
95
+
96
+
97
+ ---
98
+
99
+ バタバタやってみたけど、読み返してみると要求は日差1秒以下、でしたっけ。腕時計なんかでも(実は腕時計って着けたり外したりで温度差が出るから条件は厳しいのだけれど)日差±15秒ぐらいじゃなかったかしら。つまり、水晶にしたとしてもその目標は困難かと。
100
+
101
+
102
+
103
+ ネットワークに繋いでNTPとか、GPSモジュール付けて時刻を拾うとかいうのが実現しやすい解決になると思います。

3

データ添付

2019/08/08 13:33

投稿

thkana
thkana

スコア7652

test CHANGED
@@ -23,3 +23,71 @@
23
23
 
24
24
 
25
25
  もう一つ、millis()の元はマイコンが動けばいい、というクロックですから、温度や基板の実装状態によっては湿度の変化に対しても無視できない周波数変動を起こかもしれません。昔の時計みたいに、夏と冬とでずれ方が変わるとか。
26
+
27
+
28
+
29
+ ---
30
+
31
+ とりあえずデータを取ってみました。
32
+
33
+ 純正(というのかな?)のArduinoです。
34
+
35
+ ```Arduino
36
+
37
+ void setup() {
38
+
39
+ Serial.begin(115200);
40
+
41
+ }
42
+
43
+
44
+
45
+ void loop() {
46
+
47
+ unsigned long ms=millis();
48
+
49
+ if(ms%10==0){//通信量を抑えるため
50
+
51
+ Serial.println(ms);
52
+
53
+ delay(5);
54
+
55
+ }
56
+
57
+ }
58
+
59
+ ```
60
+
61
+ で、出てくるデータをteratermのタイムスタンプ付きのログで記録してみたところ、抜粋ですが
62
+
63
+ ```Text
64
+
65
+ [2019-08-08 20:34:42.702] 0
66
+
67
+ [2019-08-08 20:51:22.705] 998820
68
+
69
+ [2019-08-08 20:51:23.884] 1000000
70
+
71
+ [2019-08-08 21:08:02.705] 1997640
72
+
73
+ [2019-08-08 21:08:05.069] 2000000
74
+
75
+ [2019-08-08 21:24:42.706] 2996460
76
+
77
+ [2019-08-08 21:24:46.254] 3000000
78
+
79
+ [2019-08-08 21:34:42.696] 3595740
80
+
81
+ [2019-08-08 21:34:46.965] 3600000
82
+
83
+ [2019-08-08 21:41:22.700] 3995270
84
+
85
+ [2019-08-08 21:41:27.439] 4000000
86
+
87
+ ```
88
+
89
+ 冷房は入れていない夜の室内なので28℃ぐらいの環境と思います。
90
+
91
+ 1000000msは16分40秒。0.11%ぐらいのずれ、というところでしょうか。USBで繋いでいるしWindowsなのでタイムスタンプの10ms以下はあまり意味がないと思いますが、millis()に対して100000/99882を乗じればそこそこは合うかな、というところ。もっと長くデータを取れば桁数は増えるでしょうし、温度が変わるとまた影響があるでしょう。必要なら温度センサもつけて補正係数を求める、なんてことも考えられます。
92
+
93
+ 素直に正確なタイムベースを設けろ、の説もあり。質問者さんの必要な精度に合わせて手を打って下さい。

2

訂正

2019/08/08 12:51

投稿

thkana
thkana

スコア7652

test CHANGED
@@ -14,7 +14,7 @@
14
14
 
15
15
 
16
16
 
17
- それと、注意しなければいけないのはmillis()はunsigned longで値を返すこと。つまり、49日程で値が0に戻ります。単純に引き算だけで時間を求めているとこの罠にハマります。
17
+ ~~それと、注意しなければいけないのはmillis()はunsigned longで値を返すこと。つまり、49日程で値が0に戻ります。単純に引き算だけで時間を求めているとこの罠にハマります。~~(誤りなので削除)
18
18
 
19
19
 
20
20
 

1

加筆

2019/08/07 13:22

投稿

thkana
thkana

スコア7652

test CHANGED
@@ -18,7 +18,7 @@
18
18
 
19
19
 
20
20
 
21
- もちろん、精度はあまり期待出来ませんから、外部の正確な時計で1時間とか一日分のmilllis()の値を計ってみていくつだったのか、というデータを取らないと時計と呼べるレベルにはなかなかならないかも知れません。長時間のデータを取れば取るほど精確な計時が期待できるようになるでしょう。逆に言うと、1000を数えたら1秒、何ていう処理をしているとまともな精度が得られないかもしれません。
21
+ もちろん、精度はあまり期待出来ませんから、外部の正確な時計で1時間とか一日分のmilllis()の値を計ってみていくつだったのか、というデータを取らないと時計と呼べるレベルにはなかなかならないかも知れません。長時間のデータを取れば取るほど精確な計時が期待できるようになるでしょう。1時間は単純にmsで言えば3600000msですが、millis()が精確でないが故に3601800(millis)が1時間なのかも知れないので、それで「校正」するのです。逆に言うと、millis()が1000毎に1秒、何ていう処理をしているとまともな精度が得られないかもしれません。
22
22
 
23
23
 
24
24