macsbug

Just another WordPress.com site

DS1307 RTC を ESP8266 + UTC(JST)で初期化する

leave a comment »

I2C DS1307 RTC の日時を NTP(JST) で設定します。             2051.12.03

ESP8266 を使用し NTP から JST を算出し DS1307 に JST時刻を設定(初期化)します。
設定後、ESP8266 + I2C DS1307 RTC + OLED にて、JST 表示で日時が表示されます。


準備:
Arduino IDE 1.6.5:
ESP8266:
OLED:
I2C DS1307 RTC:ESP8266 + I2C DS1307 RTC + OLED
NTP:NTPcube ( ESP8266 + OLED )
配線:ESP8266 と DS1307、OLED を I2C 接続。
表示:OLED を使用しました。
_  OLED を使用しない場合は、スケッチの display.print() を Serail.print() に変更。
_  これにより、Arduino IDE のシリアルモニタに表示します。


方法:
NTPcube ( ESP8266 + OLED ) に 以下3つの RTC初期化を加えるのみです。
#include <RTClib.h>
RTC_DS1307 RTC;
RTC.adjust(DateTime(JST));


スケッチ:
// Udp NTP Client, I2C DS1307 RTC, OLED
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
#include <Wire.h>
#include <SPI.h>
#include <RTClib.h>
RTC_DS1307 RTC;
#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 &amp; receive packets over UDP

void setup(){
  //Serial.begin(115200);
  //---------------------------------------------//
  Wire.begin(0, 2); delay(10);                   // I2C : SDA,SCL
  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
    RTC.adjust(DateTime(JST)); // DS1307 JST 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) &lt; 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();
}

 


参考:
Updating the Logshield 1307 RTC with the NTP protocol.
by Ivan Grokhotkov


Written by macsbug

12月 2, 2015 @ 8:24 pm

カテゴリー: ESP8266

コメントを残す

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

WordPress.com ロゴ

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

Twitter 画像

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

Facebook の写真

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

Google+ フォト

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

%s と連携中

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