下手の横好きのスクラップブック!!

下手の横好きの、いろいろな記録です。
電子工作・PIC・Arduino・太陽光発電・写真などetc

Arduinoを使ってマイクロSDカードにデータを保存する

2011-10-30 | Arduino

スイッチサイエンスで販売している「sparkfun.com」の「マイクロSDシールド」を利用して、温度と湿度のデータをマイクロSDカードに記録してみました。

micro SD card shield


センサーには手持ちがあったので、温度センサーには「
LM61CIZ」、湿度センサーには「CHS-GSS」を使います。

最初にシールドにピンソケットをつけます。マイクロSDシールドには、5vを3.3vに落とす回路が内蔵されているので、そのままピンソケットでArduinoに接続できます。

ピンソケットを取り付け

シールドにセンサーを取り付ける前にブレッドボードで仮接続し動作確認を行いました。

仮接続

回路図

Arduinoに接続

 

スケッチは「戸田よろず研究所」に掲載されていたものを参考にし、センサーを2個・記録時間を1分間隔に変更しました。

スケッチ

 

#include <SD.h>
const int chipSelect = 8;       //chipselect 端子番号(Sparkfun microSD shield では8を使用
unsigned long sensorValue1 = 0;
unsigned long sensorValue2 = 0;
//original analog read value (10 bit),10bitのアナログ読み取り値
unsigned long Temp10=0;          //value of Temperature(℃)*10, 温度(℃)×10の値、23.5℃→235とする。
unsigned long hyum10=0;

 

unsigned long AveN=100;         // average times for analog read, アナログ入力のための平均化回数
unsigned long i=0;              // repetition, 繰り返し回数
unsigned long timeMS=0;         // time in ms unit, ミリ秒
float aveAin1=0;               // average analog read,平均化されたアナログ入力値
float aveAin2=0;

 

String dataString = "";         // data in the string mode,データ送信用の文字列

 

 
void setup(){
  analogReference(INTERNAL);                         // 基準電圧の設定(1100mv)
  Serial.begin(9600);                               //  シリアル通信のレート
  Serial.print("Initializing SD card...");          //check the Serial communication
  pinMode(8, OUTPUT);                       // チップセレクトに使う8番端子をoutputとする。
  if (!SD.begin(8)) {                       //  SDカードが利用可能などうか確認
    Serial.println("Card failed, or not present");  //  SDカード読み取りエラーの時のメッセージ
  }else{
  Serial.println("Card initialized.");              // SDカードが読み取れた時のメッセージ
  }
}
// main program
void loop() { 
  sensorValue1 = 0;                                   // センサー読み取り値を0に戻す
  sensorValue2 = 0;
  for (i=0; i<AveN; i++){
  sensorValue1 += analogRead(0);                        //  読み取り値を100回足す
  sensorValue2 += analogRead(1);
}
  timeMS=millis()/60000;                                   // プログラム開始後の経過時間(min)
   aveAin1 = sensorValue1 / AveN;                         // センサー読み取り値の平均値
   aveAin2 = sensorValue2 / AveN;
   Temp10=(long) (aveAin1 * 1100/1024);                 //温度の計算。1100 mVを10 bitに分割している。
   hyum10 = (long) (aveAin2 * 1100/1024);               //湿度の計算
   
   dataString=String(timeMS,DEC);                    // 送信用の文字列データを作成(分)
   dataString += ",";                                //  コンマを加える
   dataString += String(Temp10,DEC);                 //  温度の数字を加える。
   dataString += ",";                                //コンマを加える
   dataString += String(hyum10,DEC);                 //湿度の数字を加える
   PrintToFile(dataString);                          //  SDカードにデータ出力するサブルーチンを呼ぶ。
 
   delay(60000);    //1分待つ。
 
}

 

//  SDカードへのデータ書き込みのためのサブルーチン
void PrintToFile(String dataIn){
  File dataFile = SD.open("datalog.txt", FILE_WRITE);  // ファイル名を定義。
  if (dataFile) {                                      // SDカードの対象ファイルを開くことができれば
    dataFile.println(dataIn);                          //  データの記入
    dataFile.close();                                  // ファイルを閉じる
    Serial.println(dataIn);                           // シリアルポートにも出力して確認。
  }else {                                              //  ファイルが開けないときのエラーメッセージ
    Serial.println("error opening file");
  }
}

 


完成

シリアルポートの表示例

今回の装置の消費電流はセンサーも含めて約44mAでした。乾電池で動作させるには若干消費電流が多いのですが、USB端子経由からニッカド電池4本(1.2v x 4)で使えるように電池ケースも作ってみました。計算上は1000mAの電池で約22時間使えます。

電池ケース

11月2日 追記
電池駆動で約1日間データを収集してみました。ベランダの温度・湿度データです。
当日は晴天で直射日光も当たりかなり高い温度を記録しています。エクセルにインポートしてグラフ化した結果時間に7分ほどの遅れがあり、長時間の記録にはむかないようです。

 

 

2017/3/18

スケッチに記入ミスがありましたので、修正いたしました。

コメント (5)    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« 花巻温泉バラ園で秋のバラを撮影 | トップ | 我が家の太陽光発電 201... »
最新の画像もっと見る

5 コメント

コメント日が  古い順  |   新しい順
sd card にdata 記録 (futaro)
2017-03-15 12:02:03
① 計測結果が 788,409?・・・・のようにあたいがおおきいのですが、その後演算処理でもするのでしょうか。

②100回計測ですが
for (i=0; i sensorValue1 += analogRead(0); // 読み取り値を100回足す
sensorValue2 += analogRead(1);
}
ですが正しくは

for(i=0;i=100;i++){
sensorValue1+=analogRead(0);
sensorValue2+=analogRead(1);
}

浅学菲才故教えていただきたいのですが。


返信する
sd card にdata 記録 (futaro)
2017-03-15 12:28:29
① 計測結果が 788,409?・・・・のようにあたいがおおきいのですが、その後演算処理でもするのでしょうか。

②100回計測ですが
for (i=0; i sensorValue1 += analogRead(0); // 読み取り値を100回足す
sensorValue2 += analogRead(1);
}
ですが正しくは

for(i=0;i=100;i++){
sensorValue1+=analogRead(0);
sensorValue2+=analogRead(1);
}

浅学菲才故教えていただきたいのですが。

返信する
SDカードに記録 (下手の横好き)
2017-03-17 08:47:53
確かにおかしいですね。
なぜこうなったか、検証したいのですが、Arduinoとしばらくご無沙汰していましたので、
当時の資料や機材が見つからない状態です。
何とか検証したいとおもっておりますが、しばらくお時間をいただきたいと思います。
返信する
SDEカードに記録 (下手の横好き)
2017-03-17 13:17:12
futaro 様

温度と湿度の換算方法が分かりましたので連絡いたします。

SDカードに記録されたデータを実際の温度と湿度に換算するのは、Excelでグラフ表示するきに下記の換算をしておりました。

温度= (記録値-600)/10
湿度= 記録値/10
返信する
スケッチ修正 (下手の横好き)
2017-03-18 15:22:52
futaro 様
スケッチに一部転記ミスありましたので修正いたしました。ご指摘ありがとうございました。
返信する

コメントを投稿

Arduino」カテゴリの最新記事