macsbug

Just another WordPress.com site

NTPcube ( ESP8266 + OLED )

leave a comment »

NTP(Network Time Protocol) サーバ から、時刻情報を取得しOLEDに表示しました。            2015.11.17



仕組み:上の NTPcube がクライアントになる。


準備:
ESP8266 + NTPCliant  で時刻を取得し OLED に表示する
ESP8266+BME280+OLED+BOX
基本スケッチは、Ivan Grokhotkov氏に感謝。
SSIDとPassword は各自で設定の事。
ルーターの設定:ルーターにマックアドレスの設定が必要な場合は、事前にマックアドレスを調べるか
_ 電源ON時、OLEDにマックアドレスが表示されますので確認してください。(命令:WiFi.macAddress())。


感想:
NTPが何かを知りませんでしたが、ネットの時刻情報から時計が作れ小さなケースに入れると楽しいものです。
NTPは、本来PCの時計あわせに使うようですが、家の中の環境では、GPSや電波時計より時刻情報を得やすいです。
ネットにアクセスする為に、秒単位の表示は無理で分単位にしました。アクセスは 10秒ごとです。
ネットの負荷を少なくする為に、内蔵時計を使用し時刻あわせに NTP を使用した方が良いかとも思います。
内蔵時計の時刻あわせは、通信の時間やスケッチ上の時間遅れがあり、秒単位の設定は考慮が必要と思われます。


// Udp NTP Client
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
#include <Wire.h>
#include <SPI.h>
#include <BME280_MOD_1022.h>
#include <Adafruit_GFX.h>
#include <ESP_Adafruit_SSD1306.h>
#include <Time.h>
#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);
extern "C" {
  #include "user_interface.h"
}
char ssid[] = "xxxx";                 // your network SSID (name)
char pass[] = "xxxx";                 // your network password
unsigned int localPort = 2390;        // local port to listen for UDP packets
IPAddress timeServer(129, 6, 15, 28); // time.nist.gov NTP server
const int NTP_PACKET_SIZE = 48;       // NTP time stamp:first 48 bytes
byte packetBuffer[NTP_PACKET_SIZE];   // buffer:incoming and outgoing packets
WiFiUDP udp;                          // UDP:send & receive packets over UDP

void setup(){
  //Serial.begin(115200);
  //---------------------------------------------//
  Wire.begin(13, 14); delay(10);                 // SDA,SCL(GPIO_13,GPIO_14)
  display.begin(SSD1306_SWITCHCAPVCC,0x78>>1);   // I2C_ADDRESS
  display.clearDisplay();                        // all pixels off 
  display.setTextSize(1);                        // printable sizes 1 to 8
  display.setTextColor(WHITE);                   // WHITE, BLACK, INVERSE
  display.setCursor(0,0);                        // location x,y
  display.display();                             // plotted items
  //---------------------------------------------//
  display.print("Mac ");display.println(WiFi.macAddress());display.display();
  display.print("Connecting to ");display.println(ssid);display.display();
  WiFi.begin(ssid, pass); 
  while (WiFi.status() != WL_CONNECTED){
    delay(500);display.print(".");display.display();} display.println("ok");
  display.print("IP: ");display.println(WiFi.localIP());
  udp.begin(localPort);
  display.print("Local port: ");display.println(udp.localPort());
  display.display();dealy(2000);
}

void loop(){
  sendNTPpacket(timeServer);delay(1000);// send NTP packet time server & Wait
  int cb = udp.parsePacket();
  if (!cb) {display.println("no packet yet");display.display();}
  else {
    udp.read(packetBuffer, NTP_PACKET_SIZE); // read packet into buffer
    unsigned long highWord = word(packetBuffer[40],packetBuffer[41]);
    unsigned long lowWord  = word(packetBuffer[42],packetBuffer[43]);
    unsigned long secsSince1900 = highWord << 16 | lowWord;
    const unsigned long seventyYears = 2208988800UL;   // Convert NTP time
    unsigned long epoch = secsSince1900 - seventyYears;// Unix time
    epoch = epoch + 32400;  // UTC + 9 ( 9 * 60 * 60 ) // JST
    setTime(epoch);         // Date Time set
    display.clearDisplay();display.setTextSize(2);display.setCursor(0,0);
    // Date
    display.print(year());display.print('/');
    display.print(month());display.print('/');
    display.println(day());display.display(); 
    // Time 
    display.setTextSize(4);
    if (((epoch % 86400L)/3600) < 10){display.print('0');}
    display.print((epoch % 86400L)/3600);display.print(':'); // day
    if (((epoch % 3600)/60) < 10 ){display.print('0');}
    display.println((epoch % 3600)/60);                      // minute
    //display.print(':');if ((epoch % 60) < 10 ){display.print('0');}
    //display.println(epoch % 60);                           // second
    display.display();
  }
  delay(10000); // wait 10 seconds before asking for the time again
}

unsigned long sendNTPpacket(IPAddress& address){ // send an NTP request
  memset(packetBuffer, 0, NTP_PACKET_SIZE);
  packetBuffer[0] = 0b11100011;// LI, Version, Mode
  packetBuffer[1] = 0;         // Stratum, or type of clock
  packetBuffer[2] = 6;         // Polling Interval
  packetBuffer[3] = 0xEC;      // Peer Clock Precision
  packetBuffer[12]  = 49;      // 8 bytes of zero for Root:Delay & Dispersion
  packetBuffer[13]  = 0x4E;
  packetBuffer[14]  = 49;
  packetBuffer[15]  = 52;
  udp.beginPacket(address, 123);//NTP requests are to port 123
  udp.write(packetBuffer, NTP_PACKET_SIZE);
  udp.endPacket();
}


		

Written by macsbug

11月 17, 2015 @ 7:58 am

カテゴリー: ESP8266

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。