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

//Save analog input(temperature) to a SD card by Toda Yorozu Kenkyjyo(TYK)

#include < SD.h >           //SDカードライブラリーを読み込む
const int chipSelect = 8;       //chipselect 端子番号(Sparkfun microSD shield では8を使用
unsigned long sensorValue = 0;  //original analog read value (10 bit),10bitのアナログ読み取り値 
unsigned long AnalogInV=0;       //analog in voltage, アナログ電圧の読み取り値(2.75V=275)
unsigned long AveN=100;         // average times for analog read, アナログ入力のための平均化回数
unsigned long i=0;              // repetition, 繰り返し回数
unsigned long timeMS=0;         // time in ms unit, ミリ秒
float aveAin=0;                 // average analog read,平均化されたアナログ入力値
String dataString = "";         // data in the string mode,データ送信用の文字列
  
void setup(){
  analogReference(DEFAULT);                         //use Vcc voltage(3.3 V) as the analog input reference, アナログ入力の最大を3.3 Vとする。
  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とする。 
  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() {  
  sensorValue=0;                                     // initialize the sensorValue,センサー読み取り値を0に戻す(和を取るため)
  for (i=0; i< AveN; i++){                            // Repeat AveN times, AveN回繰り返す。
  sensorValue+=analogRead(0);                        // sum of analogRead(Ain terminal=0) for AveN times, 読み取り値をAveN回足す
  }
  timeMS=millis();                                   //time (msec) after the program was initiated, プログラム開始後の経過時間(ミリ秒)
   aveAin= sensorValue/AveN;                         // average of sensor read, センサー読み取り値の平均値
   AnalogInV=(long) (aveAin*330/1024);                 //calculate AnalogInVoltage, Analog read reference =3.3 V and 10 bit,AnalogInVの計算。3300 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(AnalogInV,DEC);                 // add the AnalogInV data, AnalogInVの数字を加える。 
   PrintToFile(dataString);                          // output data to the SD cardm through the subroutine, SDカードにデータ出力するサブルーチンを呼ぶ。
   delay(1000);                                      //delay 1 sec, 1秒待つ。 
}

// Subroutine for writing data in SD card, SDカードへのデータ書き込みのためのサブルーチン
void PrintToFile(String dataIn){
  digitalWrite(9,HIGH); delay(20);                     //check data writing
  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,シリアルポートにも出力して確認。
  }else {                                              // if the file isn't open, pop up an error message, ファイルが開けないときのエラーメッセージ
    Serial.println("error opening file");
  } 
  digitalWrite(9,LOW);                                //check data writing
}

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

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