macsbug

Just another WordPress.com site

DS3231 RTC in ESP8266

leave a comment »

ESP8266 + DS3231 RTC + OLED でデジタル時計を作る。                2016.10.07

ラズベリーパイ用の DS3231 For PI RTC は 小型で 約90円 という低価格です。

 


 

部品について:
これまでの DS1307 や DS3231 RTC は 電池が大きく小型化に難がありました。(左)
又 国内での価格は千円以上という高い状態。

 
ラズベリーパイ用の RTC Module は電池の直径が 9.4mmと小型です。
価格は 1個94円と低価格です。ebay。今回は10個単位の販売を購入。
10個もあると いろいろな形の物を気楽に作れるので便利になります。
  


 

国内販売価格:以下は円安(103.8円)時の価格です。購入時は1個85円でした。

No 名前 単価(円) 送料,代引  価格(円)
1 ebay:DS3231 10個 ( 939円)        94         0         94
2 ebay:DS3231 1個     102      0      102
3 アマゾン:DS3231 (Paspberry pi)  *     197   0   197
4 アマゾン:DS1307 *     295   0      295
5 aitendo:DS3231     245 790  1035
6 aitendo:DS1307     395 790  1185
7 スイッチサイエンス:DS1307 1112 150  1262
8 秋月:DS1307     750 800  1550
9 スイッチサイエンス:Sparkfun RTC 1868 150  2018

.
* :アマゾンの格安品:この業者の取り寄せ先は ebay や Aliexpress と同じですが
_  価格は ebay より高めです。,,2個買える。
メモ:ebay や Aliexpress は Free Shipping が多く送料は無料です。
_  輸送期間は 通常30日ですが物により2週間で届く物もあります。


 

動作:
時間調整は電源オン時に NTP(JST) で設定します。
WiFi が無い場合は RTCモジュールに保存された日時を使用します。


 

準備:費用総計:1416円。
_        NTP( WiFi ) を使用しなければ ( WiFi.mode(WIFI_OFF); で送信オフにする)
_        この場合 No.2 のTELECは不要で 990円となります。

No Nomen Link Price(円)  memo
1 D1 mini  ebay  327
2 ESP-WROOM-02 with TELEC  ebay  426  TELEC
3 OLED 128×64(3.3V)  ebay  569
4 DS3231 RTC (3.3V)( 電池付き )  ebay   94

 

3. 配線:D1 mini の 3.3V, D8, D7, D6 の 並んだ端子を使用する。
_     D1 mini 3.3V = DS3231 +(Vcc) = OLED Vcc。
_     D1 mini D8 = D1 mini GND = DS3231 GND = OLED GND。
_     D1 mini D7(ESP8266-13) = DS3231 C(SCL) = OLED SCL。
_     D1 mini D6(ESP8266-12) = DS3231 D(SDA) = OLED SDA。
4. 組立:D1 mini、DS3231、OLED を3段重ねにする。
5. 箱 :3D Printer にて制作。38mm x 38mm x 38mm
6. スケッチ:リストに示す。
7. 予備知識:ESP8266 + I2C DS1307 RTC + OLED
8. 予備知識:DS1307 RTC を ESP8266 + UTC(JST)で初期化する


 

加工:薄くする為の加工。
_ コネクターとバッテリーを取り除く。バッテリは平行に付けるか他の場所へ付けます。
_ 


 

メモ:
電池は使用せず USB電源を使用。
USB 5V ラインでの 消費電流は、USB式電流計にて 約50〜70mA。
電源と I2C 配線のみで簡単です。
NTPのデーター取得:udp.read(buff, NTP_PACKET_SIZE);
RTCのデーター取得:DateTime now = RTC.now();
PCの時刻を設定   :rtc.adjust(DateTime(__DATE__, __TIME__));


 

感想:
1. RTCの価格:最安値は97円から最高が2018円という、驚く程の価格差があります。
_   ebayで10個購入(939円)でも aitendo や SS の1個より遥かに安いという訳です。
_   価格が安い事と配線が4本で済みますので 全てのESP8266 に取り付けると便利です。
2. ebayの注意:RTCモジュールの写真で電池がないものがありますので注意してください。
3. ESP8266 に RTC が内蔵していれば このような事をする必要がないんですがね。
4. 最小サイズのの RTC と D1 mini を組み合わせて小型化ができました。
_   厚さは 10mm でバッテリー(6mm)とケース(4mm)を付けると 約20mm になります。


 

スケッチ:

// Watch : ESP, I2C DS1307 RTC, I2C OLED, NTP, Timeset : 2016.06.30
#include <ESP8266WiFi.h>                         // WIFI
#include <WiFiUdp.h>                             // WIFI
#include <Wire.h>                                //
#include <SPI.h>                                 //
#include <RTClib.h>                              // RTC
RTC_DS3231 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
const 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

10月 6, 2016 @ 11:49 pm

カテゴリー: ESP8266

コメントを残す

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

WordPress.com ロゴ

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

Twitter 画像

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

Facebook の写真

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

Google+ フォト

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

%s と連携中

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