Arduinoを用いて日照、温度を記録してSDカードに書き込みスケッチ(プログラム)です。 ここでは日照、温度以外にもう一つの値を読み取れるよう3チャンネルの入力を用いています。 正確な値を得るために、アナログ入力の値を20回読み取り、 その平均値を求めています。「現在の時間(ミリ秒単位),読み取り電圧×100(小数点以下切り捨て)」を 記入します。SD cardへの書き込みではfloat形式はうまくいかなかったため 全て文字に変換しています。SDカードへアクセスした瞬間 PIN9がHIGHになりますので、ここにLEDを接続して確認用ランプとします。

//Save analog input(Brightness) to an SD card by Toda Yorozu Kenkyjyo(TYK)
//Serial data sendings are off for practical use as datalogger

#include 
const int chipSelect = 8;        //chipselect 端子番号(Sparkfun microSD shield では8を使用
unsigned long sensorValue0 = 0;  //original analog read value0 (10 bit),10bitのアナログ読み取り値0 
unsigned long sensorValue1 = 0;  //original analog read value1 (10 bit),10bitのアナログ読み取り値1
unsigned long sensorValue2 = 0;  //original analog read value2 (10 bit),10bitのアナログ読み取り値2
unsigned long Brightness=0;      //value of brightness from a Lux sensor NJL7502Lからの読み取り値。
unsigned long PowerVoltage=0;    //value of input voltage,電源の電圧等、予備用。
unsigned long Temp=0;             //value of input voltage,温度IC LM35からの読み取り値
unsigned long AveN=20;          // average times for analog read, アナログ入力のための平均化回数
unsigned long i=0;               // repetition, 繰り返し回数
unsigned long timeMS=0;          // time in ms unit, ミリ秒
float aveAin0=0;                  // average analog read0,平均化されたアナログ入力値0
float aveAin1=0;                  // average analog read1,平均化されたアナログ入力値1
float aveAin2=0;                  // average analog read2,平均化されたアナログ入力値2
String dataString = "";          // data in the string mode,データ送信用の文字列
  
void setup(){
  //analogReference(DEFAULT);                         //not use DEFAULT voltage(3.3 V) as the analog input reference, アナログ入力の最大電力を3.3 Vとする(未使用)。
  analogReference(INTERNAL);                         //use INTERNAL voltage(1.1 V) as the analog input reference, アナログ入力の最大電力を1.1 Vとする。
  pinMode(chipSelect, OUTPUT);                       //Define chipselect terminal 8 as output, チップセレクトに使う8番端子はoutputとする。 
  pinMode(2, OUTPUT);                                //Define pin No.2 as output, カードへの書き込み確認ランプ 
    // Serial.begin(9600);                               // serial communication rate, シリアル通信のレート
    // Serial.print("Initializing SD card...");          //check the Serial communication 
  pinMode(chipSelect, OUTPUT);                       //Define chipselect terminal 8 as output, チップセレクトに使う8番端子はoutputとする。 
  digitalWrite(2,HIGH); delay(3); digitalWrite(2,LOW); // LED of No.2 pin on for checking file access, ファイルアクセス確認用のLED on
  if (!SD.begin(chipSelect)) {                       // check the SD card is available or not, SDカードが利用可能などうか確認
    //  Serial.println("Card failed, or not present");  // in the case of SD card error, SDカード読み取りエラーの時のメッセージ
  }else{
    // Serial.println("Card initialized.");              //in the case of SD card is available, SDカードが読み取れた時のメッセージ
  }
}
// main program, 主プログラム
void loop() {  
  sensorValue0=0;                                     // initialize the sensorValue0,センサー読み取り値を0に戻す(和から平均を求めるため)
  sensorValue1=0;                                     // initialize the sensorValue1,センサー読み取り値を0に戻す(和から平均を求めるため)
  sensorValue2=0;                                     // initialize the sensorValue2,センサー読み取り値を0に戻す(和から平均を求めるため)
  for (i=0; i< AveN; i++){                            // Repeat AveN times, AveN回繰り返す。
  sensorValue0+=analogRead(0);                        // sum of analogRead(Ain terminal=0) for AveN times, 読み取り値をAveN回足す
  sensorValue1+=analogRead(1);                        // sum of analogRead(Ain terminal=0) for AveN times, 読み取り値をAveN回足す
  sensorValue2+=analogRead(2);                        // sum of analogRead(Ain terminal=0) for AveN times, 読み取り値をAveN回足す
  }
  timeMS=millis();                                   //time (msec) after the program was initiated, プログラム開始後の経過時間(ミリ秒)
   aveAin0= sensorValue0/AveN;                         // average of sensor read, センサー読み取り値の平均値0
   aveAin1= sensorValue1/AveN;                         // average of sensor read, センサー読み取り値の平均値1
   aveAin2= sensorValue2/AveN;                         // average of sensor read, センサー読み取り値の平均値2
   Temp=(long) (aveAin0);                             //Analog read reference0 =1100 mV and 10 bit,Brightnessの計算。1100 mVを10 bitに分割している
   Brightness=(long) (aveAin1);                       // Analog read reference1 =1100 mV and 10 bit,Brightnessの計算。1100 mVを10 bitに分割している。
   PowerVoltage=(long) (aveAin2);                      //Analog read reference2 =1100 mV and 10 bit,Brightnessの計算。1100 mVを10 bitに分割している。
   dataString=String(timeMS,DEC);                    //make a data to send in string mode, string conversion cannot treat float numbers, 送信用の文字列データを作成
   dataString += ",";                                // add comma, コンマを加える
   dataString += String(Temp,DEC);                  // add the Temperature data, Temperatureの数字を加える。 
   dataString += ",";                                // add comma, コンマを加える  
   dataString += String(Brightness,DEC);             // add the Brightness data, Brightnessの数字を加える。 
   dataString += ",";                                // add comma, コンマを加える  
   dataString += String(PowerVoltage,DEC);           // add the Brightness data, Brightnessの数字を加える。 
   PrintToFile(dataString);                          // output data to the SD cardm through the subroutine, SDカードにデータ出力するサブルーチンを呼ぶ。
   delay(1000);                                      //delay 1000 msec, 1秒待つ。
}

// Subroutine for writing data in SD card, SDカードへのデータ書き込みのためのサブルーチン
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, SDカードの対象ファイルを開くことができれば
    dataFile.println(dataIn);                          // write data into the file, データの記入 
    dataFile.close();                                  // close the file, ファイルを閉じる
   // Serial.println(dataIn);                           // print to the serial port too,シリアルポートにも出力して確認。
   digitalWrite(2,HIGH); delay(1
   ); digitalWrite(2,LOW); // LED of No.2 pin on for checking file access, ファイルアクセス確認用のLED on
  }else {                                              // if the file isn't open, pop up an error message, ファイルが開けないときのエラーメッセージ
   // Serial.println("error opening file");
  } 
}

戸田よろず研究所トップページへ

ここで公開するアイデア/装置は安全性を保障しておりません。 用途に応じた設計を行い、十分な安全検査を行ってからご利用ください。 本サイトの情報の営利目的での利用はご遠慮ください。 本サイトの内容の無断転載を禁じます。© 2011 TYK