スイッチサイエンスで販売している「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
スケッチに記入ミスがありましたので、修正いたしました。
②100回計測ですが
for (i=0; i sensorValue1 += analogRead(0); // 読み取り値を100回足す
sensorValue2 += analogRead(1);
}
ですが正しくは
for(i=0;i=100;i++){
sensorValue1+=analogRead(0);
sensorValue2+=analogRead(1);
}
浅学菲才故教えていただきたいのですが。
②100回計測ですが
for (i=0; i sensorValue1 += analogRead(0); // 読み取り値を100回足す
sensorValue2 += analogRead(1);
}
ですが正しくは
for(i=0;i=100;i++){
sensorValue1+=analogRead(0);
sensorValue2+=analogRead(1);
}
浅学菲才故教えていただきたいのですが。
なぜこうなったか、検証したいのですが、Arduinoとしばらくご無沙汰していましたので、
当時の資料や機材が見つからない状態です。
何とか検証したいとおもっておりますが、しばらくお時間をいただきたいと思います。
温度と湿度の換算方法が分かりましたので連絡いたします。
SDカードに記録されたデータを実際の温度と湿度に換算するのは、Excelでグラフ表示するきに下記の換算をしておりました。
温度= (記録値-600)/10
湿度= 記録値/10
スケッチに一部転記ミスありましたので修正いたしました。ご指摘ありがとうございました。