はじめに

父親が小屋の気温や照度のデータが取りたいと言っていたのでデータロガーを作ってみました。 温度と照度を 10 分間隔で microSD に csv 形式で保存する仕様です。

今回使うセンサは以下の 2 つ

parts

microSD との接続には秋月で売っている マイクロSDカードスロットDIP化キットを使いました。ブレッドボードで使う場合にはピンヘッダをハンダ付けすると便利です。

接続表

connection table

まず microSD を繋げている時に問題が・・・ arduino の出力電圧が 5V に対し microSD の動作電圧は 2.7 ~ 3.6V 手元にあった 270Ω と 510Ω で分圧することで5*(510/(510+270))≒3.2V

process1

良い感じに減圧出来ました。 最後に 2 つのセンサを取り付けます。 TEMT6000 は上から出力電圧、GND、5V LM61CIZ は文字が書いてある面から見て左から 5V、出力電圧、GND 詳しくは各データシートを参照してください。各端子繋いであげるとこれでハードは出来上がりです。

demo1

あとは arduino にプログラムを書き込むだけ。 今回のプログラムで microSD 関連は公式のライブラリもあったんですが、公式ライブラリをより使いやすく改良された方がいたのでこちらのサイトのものを使わせて頂きました。実際に microSD に書き込まれたログデータがこちら

demo2

arduino に書き込んだスケッチは以下のとおりです。

/*
* using DIP kit
* 2013-4-7
*log temp illumi
*/

#include<SD.h>

const int chipSelect = 10;

int ans , temp , tv ;
float VDD=5.0,R0=1,R1=10;
int lux;
long date=0;

// Subroutine for writing data in SD card,
void PrintToFile(String dataIn){
  File dataFile = SD.open("datalog.txt", FILE_WRITE);  // define the filename,
  if (dataFile) {                                      //if the file in the SD card was open to wrihte,
    dataFile.println(dataIn);                          // write data into the file,
    dataFile.close();                                  // close the file,
    Serial.println(dataIn);                           // print to the serial port too,
  }else {                                              // if the file isn't open, pop up an error message,
    Serial.println("error opening file");
  }
}

void setup(){
  Serial.print("SD read write test start...\n");

  //analogReference(INTERNAL);                         //use internal voltage(1.1 V) as the analog input reference, アナログ入力の最大電力を1.1 Vに設定
  Serial.begin(9600);
  pinMode(10, OUTPUT);
  Serial.print("Initializing SD card...");          //check the Serial communication
  pinMode(chipSelect, OUTPUT);                       //Define chipselect terminal 8 as output,
  if (!SD.begin(chipSelect)) {                       // check the SD card is available or not,
    Serial.println("Card failed, or not present");  // in the case of SD card error,
  }else{
  Serial.println("Card initialized.");              //in the case of SD card is available,
  }

  PrintToFile("date,temp,illumi");
}

void loop(){

  //calculating temp
  ans = analogRead(0);
  tv  = map(ans,0,1023,0,5000); //convert voltage sensor
  temp = map(tv,300,1600,-30,100); //convert temp voltage

  //calculating illumi
  int indata=analogRead(1);
  float ar=(indata*VDD/1024)/R1;
  lux=(20.0/0.01)*ar;

  //calculating date
  date = (millis()/1000/60); //insert elapsed time (minute)

  String dataString = "";
  dataString += date;
  dataString += ",";
  dataString += temp;
  dataString += ",";
  dataString += lux;

  PrintToFile(dataString);

  delay(1000*60*10); // run every 10 minutes
}

今回は microSD に書き込むデータロガーですがネットワークと接続して cosm などのサービスを利用するとスマホと組み合わせたりできて、より面白いような気がします。長期休みも終わり学校が始まったので更新の間隔も広まりそうですが、ちょくちょく何か面白いものを作って行きたいですね。

Reference