Table of Contents
何を学習するの?
- Arduinoにカメラ、GPS受信機、センサー等を取り付けて、そのデータをメモリーに記録することができます。
- データロガーシールドはSDモジュールとRTC(実時間)モジュールが一体になった構造で、データをSDカードに記録する際に時刻情報も残すことができます。このデータロガーシールドにデータを保存する方法を学習します。
データロガーシールドはどう使うの?
- SDモジュールとRTC(実時間)モジュールを使ってSDカードにデータを記録する方法を、[RTC(実時間)モジュールの時間を表示させる]と[SDカードにデータを記録する方法]で学習しました。しかし独立したSDモジュールとRTC(実時間)モジュールをArduinoにそれぞれ接続するので配線が面倒です。
- データロガーシールドはSDモジュールとRTC(実時間)モジュールを含んでいます。データロガーシールドを使えば測定データと時刻情報をSDカードに保存できます。
必要な部品と接続方法は?
- Arduino UNO R3に接続できる、SDモジュールとRTC(実時間)モジュール両方を実装したデータロガーシールドをAmazonで検索して購入しました。
製品・商品の詳細と購入先は?
- Amazon — [Arduino用のUNO R3 最終版スタータキット]
- Amazon — [データロガーシールド]
- データロガーシールドはArduino UNO R3に差し込めばそれで接続が完成です!
データロガーシールドの使用順序は?
- ① RTC(実時間)モジュールに時刻を書き込みます
- ② SDカードにデータを書き込みます
RTC(実時間)モジュールに時刻を書き込みます
- データロガーシールドのRTC(実時間)モジュールの時間はバッテリーを入れるだけでは不定の時間になっています。スケッチをコンパイルした時刻をRTC(実時間)モジュールに書き込みます。
////////////////////////////////////////////////////////
// RTC(実時間)モジュールの時間設定を行い、時間を画面へ表示する
// SDカードモジュールへの操作は行わない
////////////////////////////////////////////////////////
//ライブラリインクルード
#include <Wire.h>
#include <DS3231.h>
#include "SPI.h"
#include "SD.h"
//実時間モジュール設定
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モジュールに書き込む
clock.setDateTime(__DATE__, __TIME__);
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("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(実時間)モジュールから日時と時刻を呼び出し、このデータをSDカードに書き込みます。
//////////////////////////////////////////////
// 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モジュールに書き込む
// 一回書き込めば、再書き込みは不要なのでコメントアウトする
// 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("Count,");
Serial.print("Year,");
Serial.print("Month,");
Serial.print("Day,");
Serial.print("Hour,");
Serial.print("Minuts,");
Serial.println("Second,");
//ログデータの最初の行に記録項目を記入する
myFile = SD.open("DATA_LOG.csv", FILE_WRITE); //SDカードをオープンする
myFile.print("Count,");
myFile.print("Year,");
myFile.print("Month,");
myFile.print("Day,");
myFile.print("Hour,");
myFile.print("Minuts,");
myFile.println("Second");
myFile.close(); //SDカードをクローズする
}
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);
//SDカードへの書き込み
Serial.println("Write Data to SD Card...");
myFile = SD.open("DATA_LOG.csv", FILE_WRITE);
myFile.print(i); myFile.print(",");
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.println(dt.second);
myFile.close();
i+=1; //iに1を加える
delay(1000); // 1秒の待ち時間
}
スケッチの動作を確認します
- シリアルモニタを使ってスケッチの動作を確認します。
- SDカードには[DATA_LOG.CSV]が作られています
データロガーに温度センサ、GPS受信機、JPEGカメラのデータを記録した例です
- [温度センサーとRTC(実時間)モジュールをI2Cで接続してデータをSDカードに保存しました] 温度センサの測定値をSDカードに保存しました。
- [Arduinoに接続したGPS受信機の測位データをSDカードに記録しました] GPSの測位データをSDカードに保存しました。
- [Arduinoにjpegカメラを付けて一定間隔で撮影した画像をSDカードに保存しました] JPEGカメラの画像データをSDカードに保存しました。
ご質問、誤植の指摘などありましたら。「問い合わせ 」のページからお願いします。