macsbug

Just another WordPress.com site

ESP8266 + RTC + NTP デジタル時計

leave a comment »

ESP8266 + DS1307 RTC + OLED でデジタル時計を作りケースに納める。    2015.12.05


DS1307 リアルタイムクロック で時計を作り、時間は電源オン時に NTP(JST) で設定します。
WiFi が無い場合は、RTCモジュールのデーターを使用します。


  


準備:
1. ESP8266 + I2C DS1307 RTC + OLED
2. DS1307 RTC を ESP8266 + UTC(JST)で初期化する
3. 配線:DS1307ボード と ESP8266ボード(LDOを含む基板) と OLED を I2C で接続する。
4. 組立:OLED 、 DS1307 、ESP8266基板 を3段重ねにする。
5. 箱 :3D Printer にて制作。38mm x 38mm x 38mm
6. 固定:内部の一部固定に、Polymorph を使用。
7. スケッチ:書き込みは、外付けのUSB と 外付けのPROG/RESET スイッチで行う。


メモ:
OLED で表示する為に、電池は使用せず USB電源を使用。コネクターはマイクロUSB端子。
電源:USB 5V -> 3.3V LDO(NJM2845Dl1-33)
USB での 消費電流は、USB式電流計にて、約20 〜 80mA。
DS1307モジュールは、ebayで100円。(電池別)
OLEDは、ebayで約900円。
I2Cは、配線が楽です。
NTPのデーター取得:udp.read(buff, NTP_PACKET_SIZE);
RTCのデーター取得:DateTime now = RTC.now();


スケッチ:

// Watch : ESP, I2C DS1307 RTC, I2C OLED, NTP, Timeset : 2015.12.04
#include <ESP8266WiFi.h>                         // WIFI
#include <WiFiUdp.h>                             // WIFI
#include <Wire.h>                                //
#include <SPI.h>                                 //
#include <RTClib.h>                              // RTC
RTC_DS1307 RTC;                                  // RTC
#include <Adafruit_GFX.h>                        // OLED
#include <ESP_Adafruit_SSD1306.h>                // OLED
#define OLED_RESET 4                             // OLED
Adafruit_SSD1306 display(OLED_RESET);            // OLED
char ssid[] = "xxxx";                            // your network SSID
char pass[] = "xxxx";                            // your network password
unsigned int localPort = 2390;                   // local port to listen
IPAddress timeServer(129, 6, 15, 28);            // time.nist.gov NTP server
const int NTP_PACKET_SIZE = 48;                  // NTP time : first 48byte
byte buff[NTP_PACKET_SIZE];                      // incoming & out packets
WiFiUDP udp;                                     // UDP:send & rx packets
char* y[] = {"Sun","Mon","Tru","Wed","Thu","Fri","Sat"};
 
void setup(){
  //Serial.begin(115200);
  //---------------------------------------------//
  Wire.begin(0, 2); delay(10);                   // ESP I2C : SDA,SCL
  display.begin(SSD1306_SWITCHCAPVCC,0x78>>1);   // OLED I2C_ADDRESS
  display.clearDisplay();display.setTextSize(1); // all off, font size=1
  display.setCursor(0,0);                        // location 0,0
  display.setTextColor(WHITE);display.display(); // WHITE, display
  //---------------------------------------------//
  display.println("Mac Address");                //
  display.println(WiFi.macAddress());            // Mac Address display
  display.display();                             //
  //---------------------------------------------// WiFi
  WiFi.begin(ssid, pass);                        // WiFi SSID,PASS
  int w = 32;                                    // WiFi count
  while (WiFi.status() != WL_CONNECTED){         // WiFI Status
    delay(500);display.print(WiFi.status());     // wifi status
    display.display(); w--; if (w<0){ break;}    // wifi check/break
  }                                              //
  //---------------------------------------------// with wiFi
  udp.begin(localPort);      delay(1000);        // UDP
  sendNTPpacket(timeServer); delay(1000);        // send NTP time server
  int cb = udp.parsePacket();                    //
  if (!cb) {display.println("no packet yet");    //
            display.display();}                  //
  else {                                         //
   udp.read(buff, NTP_PACKET_SIZE);              // read packet buffer
   unsigned long hW = word(buff[40],buff[41]);   // HiWord
   unsigned long lW = word(buff[42],buff[43]);   // loWord
   unsigned long secsSince1900 = hW << 16 | lW;  //
   const unsigned long seventyYears=2208988800UL;// Convert NTP time
   unsigned long t = secsSince1900-seventyYears; // Unix time
   t = t + 32400;                                // JST=UTC+9(9*60*60)
   RTC.begin(); RTC.adjust(DateTime(t));         // RTC init & JST SETUP 
  }                                              //
}                                                //
 
void loop(){                                     //
  DateTime now = RTC.now();                      // time geting from RTC
  //---------------------------------------------//
  display.clearDisplay();display.setCursor(0,0); // disp Clear,loc 0,0
  display.setTextSize(2);                        // Font Size = 2
  //---------------------------------------------// yyyy.mm.dd
  display.print(now.year());  display.print(".");// year display
  if(now.month()<10){         display.print(0);} // mon  add 0
  display.print(now.month()); display.print(".");// mon  display
  if(now.day()  <10){         display.print(0);} // day  add 0
  display.print(now.day());                      // day  display
  //---------------------------------------------// Week
  uint8_t w=now.dayOfWeek();  String Week=y[w];  // Weak Read
  display.println(Week);display.println();       // Week
  //---------------------------------------------// Time 12:34:56
  if(now.hour()  <10){        display.print(0);} // hour add 0
  display.print(now.hour());  display.print(":");// hour display
  if(now.minute()<10){        display.print(0);} // min  add 0
  display.print(now.minute());display.print(":");// min  display
  if(now.second()<10){        display.print(0);} // sec  add 0
  display.println(now.second());                 // sec  display
  display.display();                             //
  //---------------------------------------------//
  delay(1000);                                   // 1 sec  
}                                                //
 
unsigned long sendNTPpacket(IPAddress & adrs){   // send an NTP request
  memset(buff, 0, NTP_PACKET_SIZE);              //
  buff[ 0]=0b11100011;buff[ 1]=0; buff[ 2]=6;    //
  buff[ 3]=0xEC;      buff[12]=49;buff[13]=0x4E; //
  buff[14]=49;        buff[15]=52;               // 
  udp.beginPacket(adrs, 123);                    //
  udp.write(buff, NTP_PACKET_SIZE);              //
  udp.endPacket();                               //
}



 

Written by macsbug

12月 5, 2015 @ 10:04 am

カテゴリー: ESP8266

コメントを残す

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

WordPress.com ロゴ

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

Twitter 画像

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

Facebook の写真

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

Google+ フォト

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

%s と連携中

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