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

下手の横好きの、いろいろな記録です。
電子工作・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でシェアする