作成したプログラムは以下の通りです.
#include <SPI.h>
#include <SD.h>
#include <TimerOne.h>
#include <MsTimer2.h>
const int chipSelect = 10; // Arduino UNOでは10、Arduino MEGAでは53
int ainput; //読み取ったbit数:intは整数
float vinput; //bit数を電圧に変換したもの:floatは浮動小数点数
//電圧測定及びSDカード保存
void mesuring(void){
vinput=5.0*ainput/1023; //上記を電圧mVに変換
Serial.println(vinput);//電圧をシリアル通信でパソコンに送信
/* SDカードに書き込み */
File dataFile = SD.open("datalog.csv", FILE_WRITE);
if (dataFile)
{
dataFile.println(vinput);
}
dataFile.close();
}
void setup(void)
{
/* ----- Setting up serial communication with PC ------ */
/* ここでUSBを介してPCとシリアル通信を始める。9600はシリアル通信のボーレート */
Serial.begin(115200);
while (!Serial) {
; // wait for serial port to connect. Needed for native USB port only
//何らかの問題があってシリアルポートに接続できないときは、このループにトラップされる
}
/* ----- Initialisation of SD card ------ */
Serial.print("Initializing SD card...");
//see if the card is present and can be initialized:
if (!SD.begin(chipSelect)) {
Serial.println("Card failed, or not present");
// don't do anything more:
return;
}
Serial.println("card initialized.");
int i= 100;//サンプリング間隔[micro sec]
Timer1.initialize(1000); //マイクロ秒単位で設定
Timer1.attachInterrupt(mesuring);
}
void loop(void){
ainput=analogRead(A0);
}
1#include<MsTimer2.h>2#include<SD.h>3#include<SPI.h>4#include<TimerOne.h>56const int chipSelect =10;// Arduino UNOでは10、Arduino MEGAでは537volatile int ainput;//読み取ったbit数:intは整数8volatile uint8_t rdy;9File dataFile;1011//電圧測定及びSDカード保存12voidmesuring(void){13if(!rdy){14 ainput =analogRead(A0);15}16 rdy =1;17}1819voidsetup(void){20pinMode(2,INPUT_PULLUP);21pinMode(3,OUTPUT);22/* ----- Setting up serial communication with PC ------ */23/* ここでUSBを介してPCとシリアル通信を始める。9600はシリアル通信のボーレート
24 */25Serial.begin(115200);26while(!Serial){27;// wait for serial port to connect. Needed for native USB port only28//何らかの問題があってシリアルポートに接続できないときは、このループにトラップされる29}3031/* ----- Initialisation of SD card ------ */32Serial.print("Initializing SD card...");33// see if the card is present and can be initialized:34if(!SD.begin(chipSelect)){35Serial.println("Card failed, or not present");36// don't do anything more:37return;38}39Serial.println("card initialized.");4041int i =100;//サンプリング間隔[micro sec]42 Timer1.initialize(1000);//マイクロ秒単位で設定43 Timer1.attachInterrupt(mesuring);44 dataFile =SD.open("datalog.csv", FILE_WRITE);45if(!dataFile){46Serial.println("File Open Error.");47while(1)48;49}50 rdy =0;51}5253voidloop(void){54/* SDカードに書き込み */55if(rdy){56digitalWrite(3,HIGH);57 dataFile.println(ainput, HEX);58// dataFile.write(&ainput,2 );59digitalWrite(3,LOW);60 rdy =0;61Serial.println(ainput, HEX);62}63if(digitalRead(2)==LOW){64 dataFile.close();65Serial.println("Stop.");66while(1)67;68}69}
1#include<MsTimer2.h>2#include<SD.h>3#include<SPI.h>4#include<TimerOne.h>56//#define HARDDEBUG78const int chipSelect =10;// Arduino UNOでは10、Arduino MEGAでは539File dataFile;1011const int BUFSIZE =200;12int rbuf[BUFSIZE];13int wp =0, rp =0;14int overrun =0;1516//電圧測定及びSDカード保存17voidmesuring(void){18#ifdefHARDDEBUG19digitalWrite(4,HIGH);20#endif21 wp =(wp +1)% BUFSIZE;22 rbuf[wp]=analogRead(A0);23if(wp == rp){24 overrun =1;25}26#ifdefHARDDEBUG27digitalWrite(4,LOW);28#endif29}3031voidsetup(void){32pinMode(2,INPUT_PULLUP);33#ifdefHARDDEBUG34pinMode(3,OUTPUT);35pinMode(4,OUTPUT);36#endif37/* ----- Setting up serial communication with PC ------ */38/* ここでUSBを介してPCとシリアル通信を始める。9600はシリアル通信のボーレート
39 */40Serial.begin(115200);41while(!Serial){42;// wait for serial port to connect. Needed for native USB port only43//何らかの問題があってシリアルポートに接続できないときは、このループにトラップされる44}4546/* ----- Initialisation of SD card ------ */47Serial.print("Initializing SD card...");48// see if the card is present and can be initialized:49if(!SD.begin(chipSelect)){50Serial.println("Card failed, or not present");51// don't do anything more:52while(1)53;54}55Serial.println("card initialized.");56 dataFile =SD.open("datalog.csv", FILE_WRITE);57if(!dataFile){58Serial.println("File Open Error.");59while(1)60;61}62Serial.println("File Open.");63 Timer1.initialize(1000);//マイクロ秒単位で設定64 Timer1.attachInterrupt(mesuring);65}6667voidloop(void){68/* SDカードに書き込み */69if(wp != rp){70#ifdefHARDDEBUG71digitalWrite(3,HIGH);72#endif73 rp =(rp +1)% BUFSIZE;74// Serial.println(rbuf[rp]);75pushBuf(rbuf[rp]);76#ifdefHARDDEBUG77digitalWrite(3,LOW);78#endif79}80if(digitalRead(2)==LOW){81 dataFile.close();82Serial.println("Stop.");83while(1)84;85}86if(overrun){87Serial.println("OR");88 overrun =0;89 dataFile.close();90Serial.println(".");91while(1)92;93}94}95uint32_t t0, t1, t2;96voidpushBuf(int val){97int wdat = val *500l/1023;//固定小数点数98 t1 =millis();99 dataFile.print(wdat/100);100 dataFile.print('.');101 dataFile.println(wdat %100);102 t2 =millis();103if(t2 - t1 >8){104Serial.print(t1 - t0);105Serial.print("/");106Serial.println(t2 - t1);107 t0 = t2;108}109}