arduinoを用いてad変換をし,データを配列に格納してからsdカードへ一気に保存することを試みています.ただ,格納用の配列が大きくなると,プログラムが作動しません.なぜでしょうか.プログラムは以下の通りです.
#include <SPI.h>
#include <SD.h>
#include <Utility.h>
//#include <SdFat.h>
//SdFat SD;
//SPI通信のチップセレクトの設定
const int chipSelect = 4;
void setup(void)
{
//サンプリング周波数の設定レジスタを操作して(ADCクロックの分周比を設定)
//ADC_DIV2|8000
//ADC_DIV4|4000
//ADC_DIV8|2000
//ADC_DIV16|1000
//ADC_DIV32|500
//ADC_DIV64|250
//ADC_DIV128|125
setADCFrequency(ADC_DIV64);
Serial.begin(2000000);
//温度変換
float a = 0.1033;
float b = 0.1639;
//サンプリング時間[sec]の宣言
unsigned short int sampling_time_sec = 100;
//タイムスタンプ用の変数の宣言
unsigned long int time_stamp_begining;
unsigned long int time_stamp_end;
//データセットの行数の宣言
unsigned long int num_of_lines_per_one_dataset = 70;
num_of_lines_per_one_dataset += 1;
//ADC値格納のための配列の宣言
unsigned short int chanel1[num_of_lines_per_one_dataset] = {0};
unsigned short int chanel2[num_of_lines_per_one_dataset] = {0};
unsigned short int chanel3[num_of_lines_per_one_dataset] = {0};
unsigned short int chanel4[num_of_lines_per_one_dataset] = {0};
unsigned short int chanel5[num_of_lines_per_one_dataset] = {0};
//カウンター変数の宣言
int i = 0;
int j = 0;
SD.begin(chipSelect);
//see if the card is present and can be initialized:
if (!SD.begin(chipSelect)) {
// don't do anything more: return;
}
Serial.println("card initialized.");
//CSVファイルのオープン
File dataFile = SD.open("datalog.csv", FILE_WRITE);
if (dataFile) {
//ヘッダーの書き込み
dataFile.print("Time stamp[microsec],CH.1,CH.2,Ch.3,CH.4,");
//単データセット当たりの行数をSDカードへ書き込み
dataFile.println("Number of lines pre dataset");
//データのサンプリング及びSDカード
while (1) { //ADC開始 i = 0; time_stamp_begining = micros(); chanel1[i] = analogRead(A1); chanel2[i] = analogRead(A2); chanel3[i] = analogRead(A3); chanel4[i] = analogRead(A4); chanel5[i] = analogRead(A5); for (i = 1; i < num_of_lines_per_one_dataset - 2; i++) { chanel1[i] = analogRead(A1); chanel2[i] = analogRead(A2); chanel3[i] = analogRead(A3); chanel4[i] = analogRead(A4); chanel5[i] = analogRead(A5); } i++; chanel1[i] = analogRead(A1); chanel2[i] = analogRead(A2); chanel3[i] = analogRead(A3); chanel4[i] = analogRead(A4); chanel5[i] = analogRead(A5); time_stamp_end = micros(); //ADC終了 //SDカードへ書き込み開始 i = 0; dataFile.print(time_stamp_begining); dataFile.print(","); dataFile.print(chanel1[i]); dataFile.print(","); dataFile.print(chanel2[i]); dataFile.print(","); dataFile.print(chanel3[i]); dataFile.print(","); dataFile.print(chanel4[i]); dataFile.print(","); //Serial.print(time_stamp_begining); Serial.print(","); Serial.print(a/1023*5000*chanel1[i]); Serial.print(","); Serial.print(a/1023*5000*chanel2[i]); Serial.print(","); Serial.print(a/1023*5000*chanel3[i]); Serial.print(","); Serial.print(a/1023*5000*chanel4[i]); Serial.print(","); if (j == 0) { dataFile.print(chanel5[i]); dataFile.print(","); dataFile.println(num_of_lines_per_one_dataset - 1); Serial.print(chanel5[i]*500.0/1024); Serial.print(","); Serial.println(num_of_lines_per_one_dataset - 1); } if (j != 0) { dataFile.println(chanel5[i]); Serial.println(chanel5[i]*500.0/1024); } j++; for (i = 1; i < num_of_lines_per_one_dataset - 2; i++) { dataFile.print(","); dataFile.print(chanel1[i]); dataFile.print(","); dataFile.print(chanel2[i]); dataFile.print(","); dataFile.print(chanel3[i]); dataFile.print(","); dataFile.print(chanel4[i]); dataFile.print(","); dataFile.println(chanel5[i]); Serial.print(","); Serial.print(a/1023*5000*chanel1[i]); Serial.print(","); Serial.print(a/1023*5000*chanel2[i]); Serial.print(","); Serial.print(a/1023*5000*chanel3[i]); Serial.print(","); Serial.print(a/1023*5000*chanel4[i]); Serial.print(","); Serial.println(chanel5[i]*500.0/1024); } i++; dataFile.print(time_stamp_end); dataFile.print(","); dataFile.print(chanel1[i]); dataFile.print(","); dataFile.print(chanel2[i]); dataFile.print(","); dataFile.print(chanel3[i]); dataFile.print(","); dataFile.print(chanel4[i]); dataFile.print(","); dataFile.println(chanel5[i]); //Serial.print(time_stamp_end); Serial.print(","); Serial.print(a/1023*5000*chanel1[i]); Serial.print(","); Serial.print(a/1023*5000*chanel2[i]); Serial.print(","); Serial.print(a/1023*5000*chanel3[i]); Serial.print(","); Serial.print(a/1023*5000*chanel4[i]); Serial.print(","); Serial.println(chanel5[i]*500.0/1024); //サンプリング時間に達したらループを抜ける if (time_stamp_end / 1000000 > sampling_time_sec) { dataFile.close(); break; } }
}
}
void loop(void) {}
あなたの回答
tips
プレビュー