//------------------------------------------------------------------------ // '22.05.14 naka // ESP32 ntp時計 // ESP32の時刻情報はNTPサーバから1日1回(00:00:00に)取得し、 // その後1線シリアルでPICで作成したデジタル時計に時刻情報を送る。 // WiFiが接続できなかったり、NTPサーバから時刻を取得できなかった // 場合には、送らない(PICの時計の方が精度がよいはずなので)。 // //------------------------------------------------------------------------ char ssid[] = "your_WiFi_SSID"; char password[] = "your_WiFi_PW"; #include #include #define SERIAL_OUT 14 void setup() { char msg[128]; pinMode(SERIAL_OUT, OUTPUT); digitalWrite(SERIAL_OUT, HIGH); Serial.begin(115200); if (wifi_connect()) { // NTPサーバに接続し、時刻設定 configTime(9 * 3600L, 0, "ntp.nict.jp", "time.google.com", "ntp.jst.mfeed.ad.jp"); delay(1000); // 通常はWiFi未接続にする wifi_disconnect(); // 時刻を送る send_time(); } } void loop() { if (check_time()) { if (wifi_connect()) { // NTPサーバに接続し、時刻設定 delay(500); configTime(9 * 3600L, 0, "ntp.nict.jp", "time.google.com", "ntp.jst.mfeed.ad.jp"); delay(1000); // 通常はWiFi未接続にする wifi_disconnect(); // 時刻を送る send_time(); } } delay(800); } bool check_time() { struct tm timeinfo; getLocalTime(&timeinfo); byte hour = timeinfo.tm_hour; byte min = timeinfo.tm_min; byte sec = timeinfo.tm_sec; if (hour==0 && min ==0 && sec==0) // 00:00:00になったら時刻設定 return true; else return false; } void send_time() { char yymmdd[10],hhmmss[10]; struct tm timeinfo; getLocalTime(&timeinfo); byte hour = timeinfo.tm_hour; byte min = timeinfo.tm_min; byte sec = timeinfo.tm_sec; send_byte(hour); send_byte(min); send_byte(sec); // Serial.printf("\n"); } void send_byte(byte buff) { digitalWrite(SERIAL_OUT, LOW); delay(1); // Serial.printf("%02d:\n",buff); byte mask = 0x80; for (int i=0;i<8;i++) { if (buff & mask) { digitalWrite(SERIAL_OUT, HIGH); // Serial.printf("1"); } else { digitalWrite(SERIAL_OUT, LOW); // Serial.printf("0"); } mask = mask>>1; delay(1); } // Serial.printf("\n"); digitalWrite(SERIAL_OUT, HIGH); delay(5); } // Wifi接続 bool wifi_connect() { char msg[128]; // 静的アドレスとDNS指定(普通は要らないはずだが、我が家のWiFiルータは動的割り当てとDNSサーバ指定がないとダメだった) IPAddress myIP(192,168,0,78); IPAddress gateway(192,168,0,1); IPAddress subnet(255,255,255,0); IPAddress dns1(8, 8, 8, 8); // Google DNS primery server IPAddress dns2(8, 8, 4, 4); // Google DNS secondary server WiFi.config(myIP,gateway,subnet,dns1,dns2); for (int i=0;i<5;i++) { // WiFi接続、5回繰り返す WiFi.begin(ssid, password); delay(1000); long int StartTime=millis(); while (WiFi.status() != WL_CONNECTED) { delay(500); if ((StartTime+10000) < millis()) break; // 10秒待って繋がらないときは諦める } if (WiFi.status() == WL_CONNECTED) { IPAddress ip = WiFi.localIP(); struct tm timeinfo; getLocalTime(&timeinfo); byte hour = timeinfo.tm_hour; byte min = timeinfo.tm_min; byte sec = timeinfo.tm_sec; sprintf(msg,"WiFi connected IP:%d.%d.%d.%d at %02d:%02d:%02d\n",ip[0], ip[1], ip[2], ip[3],hour,min,sec); Serial.print(msg); break; } } if (WiFi.status() != WL_CONNECTED) return false; return true; } void wifi_disconnect() { WiFi.disconnect(true); WiFi.mode(WIFI_OFF); } //------------------------------------------------------------------------------- // EOF //-------------------------------------------------------------------------------