Tiny RTC DS1307 I2C その2

暑くて、夏到来ですね。8月に入って、また今年も暑い夏がやってきました!

昼間はとても、PC触る気にならないので自然と夜型になります。昼は友達とお茶して、構想を練っていました。

 

さて、RTC を半田付けして配線してソフトウェアをコピペして動かしてみました。

ProMini につけてみました。配線は4本で、2本は電力、2本がデータ通信です。ProMini のA4(SDA) と A5(SCL) がどこにあるのかわからず、ピンをつける前のを見て判明。

promini

とりあえず、こんな感じでPC にシリアル経由でデータを流してみました。

2

シリアル通信に、時が流れて、電源を切って再接続しても、当然ながら時が刻まれています。

1

プログラムソースは以下な感じです。

/*
 Tiny RTC (DS1307) Sample.
 RTClib.h
  --> https://github.com/jcw/rtclib

 JunkHack 2015.07.31(Fri)
 */

#include <Wire.h>    // Wire lib.
#include "RTClib.h"  // need to install the RTClib by jcw

RTC_DS1307 RTC;      // RTC Modul

void setup(void) {

  Wire.begin(); // Initialisiere I2C
  RTC.begin(); // Initialisiere RTC
  Serial.begin(9600);

  // Set SQW/Out signal frequency to 1 Hz.
  RTC.setSqwOutSignal(RTC_DS1307::Frequency_1Hz);

  // Serial mes.
  Serial.print(__DATE__ " " __TIME__); // コンパイルしたときの日時 Aug  1 2015 13:24:48
  Serial.println(" : Tiny RTC DS1307 I2C --- test");

  // RTC にクロックがセットされているか?
  if (! RTC.isrunning()) {

    // コンパイル時の、現在の日付と時刻を設定
    RTC.adjust(DateTime(__DATE__, __TIME__));          // IDE の PC 時刻
    Serial.println("Current time to the RTC");
  }
  else Serial.println("RTCは、すでに実行されています。");
}

void loop(){
  DateTime now=RTC.now(); // Current time geting from RTC
  show_time_and_date(now);  // Print Serial
  delay(1000); // 1 Sec
}

// set week
String get_day_of_week(uint8_t dow){

  String dows="  ";
  switch(dow){
   case 0: dows="Sun"; break;
   case 1: dows="Mon"; break;
   case 2: dows="Tue"; break;
   case 3: dows="Wed"; break;
   case 4: dows="Thu"; break;
   case 5: dows="Fri"; break;
   case 6: dows="Sat"; break;
  }

  return dows;
}

// print date time. ex 2015.07.31(Fri) 23:22:31
void show_time_and_date(DateTime datetime){
  // 2015.07.31(Fri) 
  Serial.print(datetime.year(),DEC);
  Serial.print(".");
  if(datetime.month()<10)Serial.print(0);
  Serial.print(datetime.month(),DEC);
  Serial.print(".");
  if(datetime.day()<10)Serial.print(0);
  Serial.print(datetime.day(),DEC);
  Serial.print("(");
  Serial.print(get_day_of_week(datetime.dayOfWeek()));
  Serial.print(") ");

  // Time 23:22:31
  if(datetime.hour()<10)Serial.print(0);
  Serial.print(datetime.hour(),DEC);
  Serial.print(":");
  if(datetime.minute()<10)Serial.print(0);
  Serial.print(datetime.minute(),DEC);
  Serial.print(":");
  if(datetime.second()<10)Serial.print(0);
  Serial.println(datetime.second(),DEC);
}

実際に動かしてみると、なるほどーという感じで実感が沸きます。時刻はIDE の PC からの時刻をコンパイル時に定数に渡してそれをセットしている感じですので、転送完了までタイムラグがあり、正確にセットするには工夫が必要だとわかりました。