リアルタイムクロック(Grove-RTC v1.2)
リアルタイムクロックで定番のDS1307 ICを使った「Grove-RTC」を使ってみました
これで朝晩のタイミングでグリーンカーテンに水やりさせようかと思います!
1.リアルタイムクロックとは
リアルタイムクロック(英:real-time clock、略:RTC)とは、バックアップ電源等と併用する事で「時間」を刻み続けます。
マイコン等でもタイマー機能を用いて経過時間を知る事は出来ますが、電源が切られてしまうと経過時間は停止もしくはリセットされてしまいます。
これら不具合を回避する為に、時刻を重要とする装置では必ずと言ってよい程リアルタイムクロックが組み込まれています。
リアルタイムクロックから出力されるデータとしては「年,月,日,時,分,秒」があり、さらに「曜日」をカウントする機種もあります。
1.1 Grove-RTCとは
リアルタイムクロック「Grove-RTC」の外観・寸法及び端子を図1に、仕様を表1に示します。
時間は、AM / PMインジケータを使用して24時間または12時間形式で動作します。
また、2100年まで有効で「曜日」もカウントしてくれます!
図1:リアルタイムクロック「Grove-RTC」の外観・寸法及び端子
項目 | 内容 |
PCBサイズ | 2.0×4.0cm |
インターフェース | 2.0mmピッチのピンヘッダ |
IO構造 | SCL,SDA,VCC,GND |
VCC | 3.3~5.5V |
ロジックハイレベル入力 | 2.2~VCC+0.3V |
ロジックローレベル入力 | -0.3~+0.8V |
バッテリー電圧 | 2.0~3.5V |
2. 回路
コイン電池「CR1225」をGrove-RTCにセットし図2の通り接続してみました!
○「CR1225」の「R」は、円形(Round)の事
○「CR1225」の「12」は、外形(φ12mm)の事
○「CR1225」の「25」は、高さ(2.5mm)の事
Grove-RTC | Arduino UNO |
GND | GND |
VCC | VCC |
SDA | A4(SDA) |
SCL | A5(SCL) |
図2:実際に接続した状態
3. ライブラリの導入
RTCライブラリを導入してみました
3.1 ライブラリの入手
その項目の下に「Download the RTC Library.」と書かれたショートカットが有りますのでこれをクリックすれば「RTC_Library」と言うファイル名のZIPファイルがダウンロードされます。
3.2 ライブラリのインストール
ArduinoIDEに図3でダウンロードしたZIPファイルのライブラリをインストールします。
やり方は簡単で、図4の通り「ArduinoIDE」→「スケッチ」→「ライブラリをインクルード」→「.ZIP形式のライブラリをインストール...」をクリックすると、「インストールするライブラリを含むZIPファイルまたはフォルダを指定してください。」と書かれた画面が出て来ます。
この画面で先ほどダウンロードした「RTC_Library.ZIP」を開くだけです。
図4:ライブラリのインストール
3.3 スケッチの例を開く
図4の操作で、RTCを使ったスケッチの例もインストールされていますので試しに開きます。
図5:「RTC」スケッチの例
3.4 スケッチの例をインストールする
図5で開いたスケッチの例をインストールします。
やり方はArduinoUNOとPCを接続(詳細はコチラ)し、ArduinoIDE画面左上に有る「➡」ボタンを押すだけです。
書き込み完了後にArduinoIDE画面右上に有る「🔎」の形をしたシリアルモニタボタンを押すと「15:28:35 1/19/2013 19*SAT」と言う感じに初期設定の日時が表示されます。
図6:「RTC」スケッチの例をインストール
4. プログラム
図6のプログラムの中身は図7の通りです
「void setup()」関数中で、RTCの日時を初期設定しますが、ここには現在の時刻を入力して書き込みます。
初期設定は一回やっておき、コイン電池を入れっぱなしにしておけばそれほど頻繁に書き換える必要はありません。
後は「clock.getTime()」関数で現在の時刻を取得し、「clock.hour」関数等で必要な「年,月,日,時,分,秒」または「曜日」を取り出します。
参考に図7プログラムを実行した結果を図8に示します。
#include <Wire.h> #include "DS1307.h" DS1307 clock;//DS1307クラスのオブジェクトを定義する void setup() { Serial.begin(9600); clock.begin(); clock.fillByYMD(2017, 7, 8); //年,月,日 clock.fillByHMS(11, 29, 30); //時:分,秒" clock.fillDayOfWeek(SAT);//曜日 clock.setTime(); }//RTCチップへの書き込み時間 void loop() { printTime(); delay(1000); } void printTime() { //機能:シリアルモニタに表示する時間 clock.getTime(); Serial.print(clock.hour, DEC); Serial.print(":"); Serial.print(clock.minute, DEC); Serial.print(":"); Serial.print(clock.second, DEC); Serial.print(" "); Serial.print(clock.month, DEC); Serial.print("/"); Serial.print(clock.dayOfMonth, DEC); Serial.print("/"); Serial.print(clock.year + 2000, DEC); Serial.print(" "); Serial.print(clock.dayOfMonth); Serial.print("*"); switch (clock.dayOfWeek) { // Friendly printout the weekday case MON: Serial.print("MON"); break; case TUE: Serial.print("TUE"); break; case WED: Serial.print("WED"); break; case THU: Serial.print("THU"); break; case FRI: Serial.print("FRI"); break; case SAT: Serial.print("SAT"); break; case SUN: Serial.print("SUN"); break; } Serial.println(" "); }
図1:プログラム例
3. まとめ
リアルタイムクロックの使い方は超簡単でした
しかしライブラリなしでRTCのI2C通信をまともにやったら「LCDの使い方」の時みたく一週間以上掛かったかもしれません
何時も思いますがライブラリを作って公開してくれた方に感謝です
励みになりますのでよければクリック下さい(^o^)/