11

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

しかし、それを取得する方法がわかりません。

ESP8266 には時計がないため、インターネットから時刻を取得する必要があると思います。タイムスタンプが必要になるたびに、それを一度だけ行う必要がありますか?

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

4

3 に答える 3

15

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

以下は、オフセットが 1 時間、更新間隔が 1 分の NTP ライブラリの使用法です。

#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();
于 2016-11-11T05:59:01.077 に答える
1

user2927848 の説明に従って、インターネット上の特定の日付/時刻 API に連絡します。または、信頼できるサーバーに単純な HTTP 要求を送信し、Date応答ヘッダーを読み取ります。

より高い精度が必要な場合は、Arduino 用の NTP クライアントを使用することをお勧めします。

于 2016-11-09T21:36:08.950 に答える
1

そのコードを見ると、前述のように、このマイクロコントローラーに直接クロックが組み込まれているとは思いません。Wi-Fi があるので、代わりに Web クエリを作成して取得できます。

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

https://timezonedb.com/api

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

より正確な時間が必要な場合は、時計が必要になる可能性があります。ping に基づいて多少の修正を試みることもできますが、どれだけ正確である必要があるかは、プロジェクトの要件によって異なります。

于 2016-11-09T20:40:14.133 に答える