Table of Contents
この記事で学習できること
- ArduinoボードにRTC(実時間)モジュールとSDモジュールを接続し、時間データをSDカードに保存する方法を学習します。
(参考) 関連する記事
必要な部品は?
| 1) | RTC(実時間)モジュール(DS1307) | 1個 |
| 2) | SDモジュール (microSDカードスロット) | 1個 |
| 3) | Arduino UNO R3 | 1個 |
1).2).3)ともにスターターキットに含まれています。
(広告) Arduino スターターキット
| 購入先 | 製品 | 備考 |
| Amazon | Arduino用のUNO R3 最終版スタータキット | Arduino UNO R3を含み、ブレッドボード、IC、センサなどが含まれています |
回路図(配線図)は?
- Fritzingで描いた回路図(配線図)と実際の配線です。


SDカードにRTC(モジュール)が発生する時間を書き込みます
- RTC(実時間)モジュール(DS1307)に設定した時間を、1秒間隔でSDカードに記録します。
- スケッチの動作中はArduino IDEのシリアルモニタ画面に日時・時刻が表示されます。

- SDカードには[DATA_LOG.CSV]が作られています

スケッチに使用するライブラリの入手先
- スケッチで使用する、RTC(実時間)モジュール用ライブラリ(DS3231.h、DS3231.cpp)は[GitHub – jarzebski/Arduino-DS3231: DS3231 Real-Time-Clock]から取得しインストールしてください。
- Arduno用のDS3231用のライブラリは何種類かが公開されていますが、この記事で使用しているライブラリは上記のライブラりであり、異なるライブラリを使用するとコンパイル時にエラーが発生します。
- GitHubでライブラリをダウンロードする
- 対象ライブラリのGitHubページを開く
- 緑色の Code ボタンをクリック (リストの右上にある[<>Code▼]のボタンです。)
- Download ZIP を選択
- ZIPファイルがPCに保存される
- ※「Source code (zip)」でもOKですが、基本は上の手順で問題ありません。
- Arduino IDEにZIPライブラリをインストールする (Arduino IDE 1.x / 2.x 共通)
- Arduino IDE を起動
- メニューから
- スケッチ → ライブラリをインクルード → .ZIP形式のライブラリをインストール
- 先ほどダウンロードした ZIP ファイルを選択
- IDE が自動的に展開してインストール完了
- インストール確認
- メニューのスケッチ → ライブラリをインクルード
- 一覧の「インストール済み」セクションにライブラリ名が表示されていれば成功
- 注意点(特にGitHub系でよくある)
- ZIPの中にさらにフォルダ階層があるとIDEが認識しないことがある
→ libraryname/libraryname/*.h のように二重構造になっていないか確認 - src フォルダがあるタイプはそのままでOK
- リリースページに「Arduino用に整えたZIP」がある場合はそちらを使うと確実
- ZIPの中にさらにフォルダ階層があるとIDEが認識しないことがある
RTC(実時間)モジュールに時刻を書き込みます
- データロガーシールドのRTC(実時間)モジュールの時間はバッテリーを入れるだけでは不定の時間になっています。スケッチをコンパイルした時刻をRTC(実時間)モジュールに書き込みます。
////////////////////////////////////////////////////////
// RTC(実時間)モジュールの時間設定を行い、時間を画面へ表示する
////////////////////////////////////////////////////////
//ライブラリインクルード
#include <Wire.h>
#include <DS3231.h>
//実時間モジュール設定
DS3231 clock;
RTCDateTime dt;
//一般変数
int i;
void setup()
{
Serial.begin(9600);
//実時間モジュールの初期化
Serial.println("Initialize RTC module");
// Initialize DS3231
clock.begin();
// スケッチのコンパイル時の時刻をRTCモジュールに書き込む
clock.setDateTime(__DATE__, __TIME__);
dt = clock.getDateTime();
//一般変数の初期化
i=0;
delay(1000);
//シリアルログの最初の行に表示項目を表示する
Serial.print("Count,");
Serial.print("Year,");
Serial.print("Month,");
Serial.print("Day,");
Serial.print("Hour,");
Serial.print("Minuts,");
Serial.println("Second,");
}
void loop()
{
//シリアルログの表示
dt = clock.getDateTime();
Serial.print(i); Serial.print(",");
Serial.print(dt.year); Serial.print(",");
Serial.print(dt.month); Serial.print(",");
Serial.print(dt.day); Serial.print(",");
Serial.print(dt.hour); Serial.print(",");
Serial.print(dt.minute); Serial.print(",");
Serial.println(dt.second);
i+=1; //iに1を加える
delay(1000); // 1秒の待ち時間
}SDカードにRTC(モジュール)が発生する時間を書き込むスケッチ
//www.arduinomakesiteasy.com
//2022.5.3
//
// 1) Elegoo 実時間モジュール DS1307
// 2) 秋田通商 SDモジュール
//
//ライブラリインクルード
#include <Wire.h>
#include <DS3231.h>
#include "SPI.h"
#include "SD.h"
//SDカード設定
File myFile; //クラス指定
const int chipSelect = 10; //チップセレクトピン指定
//実時間モジュール設定
DS3231 clock;
RTCDateTime dt;
//一般変数
int i;
//ファイル作成・更新時のタイムスタンプを記録するスケッチ------------------------------
char timestamp[30];
// call back for file timestamps
void dateTime(uint16_t *date, uint16_t *time) {
sprintf(timestamp, "%02d:%02d:%02d %2d/%2d/%2d \n",dt.hour,dt.minute,dt.second,dt.month,dt.day,dt.year-2000);
// return date using FAT_DATE macro to format fields
*date = FAT_DATE(dt.year,dt.month,dt.day);
// return time using FAT_TIME macro to format fields
*time = FAT_TIME(dt.hour,dt.minute,dt.second);
}
//------------------------------------------------------------------------------
void setup()
{
Serial.begin(9600);
//実時間モジュールの初期化
Serial.println("Initialize RTC module");
// Initialize DS3231
clock.begin();
// スケッチのコンパイル時の時刻をRTCモジュールに書き込む
//このコードは、1回のみ実行し、2回はコメントアウトして再度コンパイルする
//clock.setDateTime(__DATE__, __TIME__);
//SDカードの初期化
Serial.println("Initializing SD card...");
if (!SD.begin(chipSelect)) {
Serial.println("Initialization failed or does not exist");
while (1);
}
Serial.println("Initialization done.");
Serial.println();
dt = clock.getDateTime();
//ファイル作成・更新時のタイムスタンプを記録するスケッチ------------------------------
SdFile::dateTimeCallback(dateTime);
sprintf(timestamp, "%02d:%02d:%02d %2d/%2d/%2d \n",dt.hour,dt.minute,dt.second,dt.month,dt.day,dt.year-2000);
//------------------------------------------------------------------------------
//一般変数の初期化
i=0;
delay(1000);
//シリアルログの最初の行に表示項目を表示する
Serial.print("Year,");
Serial.print("Month,");
Serial.print("Day,");
Serial.print("Hour,");
Serial.print("Minuts,");
Serial.print("Second,");
Serial.println("Count)");
//ログデータの最初の行に記録項目を記入する
myFile = SD.open("DATA_LOG.csv", FILE_WRITE); //SDカードをオープンする
myFile.print("Year,");
myFile.print("Month,");
myFile.print("Day,");
myFile.print("Hour,");
myFile.print("Minuts,");
myFile.print("Second,");
myFile.println("Count");
myFile.close(); //SDカードをクローズする
}
void loop()
{
//シリアルログの表示
dt = clock.getDateTime();
Serial.print(dt.year); Serial.print(",");
Serial.print(dt.month); Serial.print(",");
Serial.print(dt.day); Serial.print(",");
Serial.print(dt.hour); Serial.print(",");
Serial.print(dt.minute); Serial.print(",");
Serial.print(dt.second); Serial.print(",");
Serial.println(i);
//SDカードへの書き込み
myFile = SD.open("DATA_LOG.csv", FILE_WRITE);
myFile.print(dt.year); myFile.print(",");
myFile.print(dt.month); myFile.print(",");
myFile.print(dt.day); myFile.print(",");
myFile.print(dt.hour); myFile.print(",");
myFile.print(dt.minute); myFile.print(",");
myFile.print(dt.second); myFile.print(",");
myFile.println(i);
myFile.close();
i+=1; //iに1を加える
delay(1000); // 1秒の待ち時間
}まとめ
- SDカードにRTC(モジュール)が発生する時間を書き込む手順が学習できました。
- RTCモジュールとSDモジュールが一体となったデータロガーモジュールがあり、時間データを扱う機能とデータを保存する機能を容易に使用できます。
(参考) データロガーモジュールの記事
ご質問、誤植の指摘などありましたら。「問い合わせ 」のページからお願いします。

