web-dev-qa-db-ja.com

Arduino-ESP8266でタイムスタンプを取得するにはどうすればよいですか?

Arduino-ESP8266 でタイムスタンプを取得したいと思います。

しかし、どうやってそれを手に入れるのか、私にはまったくわかりません。

ESP8266には時計がないため、インターネットから時間を取得する必要があると思います。タイムスタンプが必要になるのは1回だけか、毎回行う必要がありますか?

すでにWi-Fiでインターネットに接続しています。

6
stallingOne

[〜#〜] ntp [〜#〜] は、リモートで時間を取得する実証済みの方法です。 NTP @Marcelが示すようなライブラリは [〜#〜] udp [〜#〜] 間隔を置いてサーバーに接続しているため、必要ありません使用する前にサーバーにポーリングを行うため。

NTP 1時間のオフセットと1分の更新間隔を持つライブラリの使用方法は次のとおりです。

#include <NTPClient.h>
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>

#define NTP_OFFSET   60 * 60      // In seconds
#define NTP_INTERVAL 60 * 1000    // In miliseconds
#define NTP_ADDRESS  "europe.pool.ntp.org"

WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, NTP_ADDRESS, NTP_OFFSET, NTP_INTERVAL);

void setup(){
  timeClient.begin();
}

void loop() {
  timeClient.update();
}

いつでもタイムスタンプまたはフォーマットされた時間を取得するには、次の関数を使用します。

String formattedTime = timeClient.getFormattedTime();
unsigned long epcohTime =  timeClient.getEpochTime();
10
cagdas

そのコードを見ると、このマイクロコントローラーに直接クロックが組み込まれているとは思いません。あなたはWi-Fiを持っているので、代わりにそれを取得するためにウェブクエリを行うことができます。

私は次のような場所にRESTクエリを使用します:

https://timezonedb.com/api

これにより、JSON形式の時間が返されます。精度が必要な場合は+/-数秒で十分です。このように時間を設定し、タイムスタンプが必要になるたびにクエリを実行する代わりに、内部タイマーを使用してオフセットを計算することで、帯域幅を下げ、バッテリー寿命を改善できます。最終的には、時間を再クエリして「修正」する必要があります。これは、タイマーが長時間正確でない可能性があるためです。さらに、最終的にロールオーバーする可能性があります。

あなたがより正確に時間を必要とするならば、あなたはおそらく時計を必要とするでしょう。 pingに基づいて少し修正を試みることもできますが、全体としてどれほど正確である必要があるかは、プロジェクトの要件に基づいています。

1
Chase R Lewis

インターネット上の特定の日付/時刻APIに連絡します ser2927848で説明されているように 。または、信頼できるサーバーに単純なHTTPリクエストを送信し、 Date 応答ヘッダーを読み取ります。

より高い精度が必要な場合は、 Arduino用のNTPクライアント を使用できます。

1
Marcel Stör