以前にESP8266で現在時刻を取得する記事をあげました ここ
”ESP32でもできるんじゃね?”という考察をしましたが、やってみたらできました
少しプログラムが異なるため、まとめておきます
以前のプログラムの変更点はインクルードするライブラリが異なる点だけです
ESP8266では” ESP8266WiFi.h”を使用しました
ESP32では”WiFi.h”を使用します
また、”#define JST 3600*9″の書き換えも必要です
#define JST 3600* -9
と変更してください!
2017年9月30日のアップデートにて#define JSTはESP32とESP8266は同じになりました
下記ソース
#include <WiFi.h> #include <time.h> #define JST 3600* 9 const char* ssid = "your-ssid"; const char* password = "your-password"; void setup() { Serial.begin(115200); delay(100); Serial.print("\n\nStart\n"); WiFi.begin(ssid, password); while(WiFi.status() != WL_CONNECTED) { Serial.print('.'); delay(500); } Serial.println(); Serial.printf("Connected, IP address: "); Serial.println(WiFi.localIP()); configTime( JST, 0, "ntp.nict.jp", "ntp.jst.mfeed.ad.jp"); } void loop() { time_t t; struct tm *tm; static const char *wd[7] = {"Sun","Mon","Tue","Wed","Thr","Fri","Sat"}; t = time(NULL); tm = localtime(&t); Serial.printf(" %04d/%02d/%02d(%s) %02d:%02d:%02d\n", tm->tm_year+1900, tm->tm_mon+1, tm->tm_mday, wd[tm->tm_wday], tm->tm_hour, tm->tm_min, tm->tm_sec); delay(1000); }
実行結果
Connected, IP address: 192.168.11.11 1969/12/31(Wed) 15:00:01 2017/06/08(Thr) 15:46:55 2017/06/08(Thr) 15:46:56 2017/06/08(Thr) 15:46:57 2017/06/08(Thr) 15:46:58 2017/06/08(Thr) 15:46:59 2017/06/08(Thr) 15:47:00 2017/06/08(Thr) 15:47:01 2017/06/08(Thr) 15:47:02 2017/06/08(Thr) 15:47:03 2017/06/08(Thr) 15:47:04 2017/06/08(Thr) 15:47:05 2017/06/08(Thr) 15:47:06 2017/06/08(Thr) 15:47:07 2017/06/08(Thr) 15:47:08 2017/06/08(Thr) 15:47:09 2017/06/08(Thr) 15:47:10 2017/06/08(Thr) 15:47:11 2017/06/08(Thr) 15:47:12 2017/06/08(Thr) 15:47:13 2017/06/08(Thr) 15:47:14 2017/06/08(Thr) 15:47:15 2017/06/08(Thr) 15:47:16 2017/06/08(Thr) 15:47:17 2017/06/08(Thr) 15:47:18 2017/06/08(Thr) 15:47:19 2017/06/08(Thr) 15:47:20
以前にもESP32で現在時刻を取得する記事を書きましたが、こっちのほうが断然楽です
コメント
ESP8266とESP32では、configTimeに与えるTimeZoneの符号が逆のようです。ESP32では-9*3600としないと日本時間になりません。
通りすがり様
返事が遅くなりもうしわけありません
確認したところ、たしかにESP32では符号を反転しないと正しい時刻を取得することができませんでした
ご指摘ありがとうございます
早速変更をいたしました
度々すいません。Arduino core for ESP32の9/30版で、
符号はESP8266と同じでよいように修正されたようです・・・
>通りすがり様
コメントありがとうございます。
ESP32のライブラリを最新にして確認をしました。
確かにコメントにある通り符号はESP8266と同じになったことを確認しました。
ご指摘ありがとうございます。早速ブログ内容を書き換えます。
こんにちは。
現在Arduino IDE 1.8.4で、ESP8266.hを用いてWiFi接続をし、NTPサーバーに問い合わせて現在時刻を取得するプログラムを作っております。
WiFiの接続はうまくできたのですが、configTime関数を使うと
‘configTime’ was not declared in this scope
とエラーになってしまいます。
configTimeはArduino.hに含まれているのでArduino.hをインクルードしましたがやはりエラーになります。
原因は何でしょうか。
よろしくお願いします。
YOU様
ESP8266.hライブラリでNTPから現在時刻を行ったことがないので原因はわかりません
‘configTime’ was not declared in this scopeがでるということはESP8266.hおよびArduino.hにはconfigTimeがないと思われます
もう一度確認してみてください
当方でもArduino 1.6.11にてArduino.hをインクルードしconfigTime()をしたところ同様のエラーが発生しました
また、最新のArduino.hをみたところconfigTimeの記述がありません
https://github.com/arduino/Arduino/blob/master/hardware/arduino/avr/cores/arduino/Arduino.h
ご確認お願い致します
初歩的な質問ですみません、
最初の日付だけ1969なのは、取得してから反映されるのに時間がかかるからでしょうか。
中納言さん
返信がおそくなりすみません.
すみません,私自身詳しくは調べていないので最初の方の日付がなぜ1969になるのかはわかりません.
おそらく初回の時間の読み出しのみ,正常に時刻の設定か読み出しができず,UNIX時間の0が格納されているからではないかと思います。
UNIX時間では1970/01/01 0:0:0(UTC)->1969/12/31 15:0:0(JPN)を0秒としそこからの経過秒数で時間を取得しているためこのような挙動になると考えられます
匿名さん
コメントありがとうございます。
1969になる理由を教えていただきありがとうございます。
> 正常に時刻の設定か読み出しができず
うーん、、、なぜ正常に時刻設定の読み出せないのか謎ですね。。