Arduino-ESP8266でタイムスタンプを取得したいと思います。
しかし、それを取得する方法がわかりません。
ESP8266 には時計がないため、インターネットから時刻を取得する必要があると思います。タイムスタンプが必要になるたびに、それを一度だけ行う必要がありますか?
すでに Wi-Fi でインターネットに接続しています。
Arduino-ESP8266でタイムスタンプを取得したいと思います。
しかし、それを取得する方法がわかりません。
ESP8266 には時計がないため、インターネットから時刻を取得する必要があると思います。タイムスタンプが必要になるたびに、それを一度だけ行う必要がありますか?
すでに Wi-Fi でインターネットに接続しています。
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();
user2927848 の説明に従って、インターネット上の特定の日付/時刻 API に連絡します。または、信頼できるサーバーに単純な HTTP 要求を送信し、Date
応答ヘッダーを読み取ります。
より高い精度が必要な場合は、Arduino 用の NTP クライアントを使用することをお勧めします。
そのコードを見ると、前述のように、このマイクロコントローラーに直接クロックが組み込まれているとは思いません。Wi-Fi があるので、代わりに Web クエリを作成して取得できます。
次のような場所に REST クエリを使用します。
これにより、JSON 形式の時間が返されます。正確さ +/- 数秒だけが必要な場合は問題ありません。このように時間を設定し、タイムスタンプが必要になるたびにクエリを実行する代わりに、内部タイマーを使用してオフセットを計算することで、帯域幅を下げたり、バッテリー寿命を延ばしたりできます。最終的には、時間を再クエリして「修正」する必要があります。これは、タイマーが長期間正確ではない可能性があり、最終的にロールオーバーする可能性があるためです。
より正確な時間が必要な場合は、時計が必要になる可能性があります。ping に基づいて多少の修正を試みることもできますが、どれだけ正確である必要があるかは、プロジェクトの要件によって異なります。