Arduino加速度计输出处理为CSV文件

时间:2019-01-24 09:00:25

标签: csv arduino processing accelerometer

我正在尝试将ADXL335加速度计数据从arduino转换为csv文件。使用串行监视器查看时,arduino代码可以完美地工作。处理代码在控制台中返回输出,但不将任何内容写入CSV文件。我不确定为什么无法打印。当我在第二条if语句中取消注释打印时,这些值存储在csv文件中,但是它仅适用于15个值输入,然后重复这些相同的值,直到代码停止。当我们嵌入if语句时,我们再次在csv文件中什么也没有得到。我认为第一个if语句有些问题,但是我不确定如何继续进行故障排除。我想知道如何做到这一点,以便获得加速度计读数的连续输出。提前致谢。

这是我的arduino代码:

void setup() {
    pinMode(14,INPUT);//define mode of pin
    pinMode(15,INPUT);
    pinMode(16,INPUT);
    Serial.begin(9600);//serial communication begin
    delay(10);
}

void loop() 
{
  //Serial.print(",");
  Serial.print("X=");
  Serial.print(analogRead(14));
  Serial.print(",");
  Serial.print("Y=");
  Serial.print(analogRead(15));
  Serial.print(",");
  Serial.print("Z=");
  Serial.print(analogRead(16));
  Serial.println(",");
  delay(100);
}

这是我的处理代码:

void setup() {
   output = createWriter( "data.csv" );
   mySerial = new Serial( this, Serial.list()[1], 9600 );
}
void draw() {
    if (mySerial.available() > 0 ) {
        value = mySerial.readString();
        System.out.print(value);
        output.println(value);
    } 
    if ( value != null ) {
        //output.println(value);
        output.println();
    }
}

void keyPressed() {
    output.flush();  // Writes the remaining data to the file
    output.close();  // Finishes the file
    exit();  // Stops the program
} 

1 个答案:

答案 0 :(得分:1)

首先,您可能需要更改arduino代码以输出有效的CSV行。 我建议暂时松开CSV标头,或从处理中添加它。

暂时尝试:

void loop() 
{
  Serial.print(analogRead(14));
  Serial.print(",");
  Serial.print(analogRead(15));
  Serial.print(",");
  Serial.print(analogRead(16));
  Serial.println(",");
  delay(100);
}

这应该输出类似####,####,####,的内容,它是有效的CSV行。

在处理方面,我还建议先进行缓冲,直到新行(\n)字符为止,您可以使用bufferUntil()serialEvent()

轻松地做到这一点。
import processing.serial.*;

// serial port
Serial mySerial;
// single line containing acc. values as a CSV row string
String values;
// the output
PrintWriter output;

void setup() {
   output = createWriter( "data.csv" );
   try{
     mySerial = new Serial( this, Serial.list()[1], 9600 );
     mySerial.bufferUntil('\n');
   }catch(Exception e){
     println("Error opening serial port: double check USB cable, if Serial Monitor is open, etc.");
     e.printStackTrace();
   }
}
void draw() {
    background(0);
    if(values != null){
      text("most recent values:\n" + values,10,15);
    }
}
// gets called when new data is in, and since we're buffering until \n it's one csv line at a time
void serialEvent(Serial p) {
  values = p.readString();
  if(values != null && values.length() > 0){
    println(values);
    // if values.trim() isn't call, the \n should still be there so print() will suffice in terms of adding a new line
    output.print(values);
  }else{
    println("received invalid serial data");
  }
}

void keyPressed() {
    output.flush();  // Writes the remaining data to the file
    output.close();  // Finishes the file
    exit();  // Stops the program
} 

还要注意对串行连接和读取的串行数据的错误检查 (这是检查可能出问题的好习惯)。 (可选)您可以在setup()的CSV文件中添加标题:

output = createWriter( "data.csv" );
output.println("X,Y,Z,");

就编写CSV文件而言,有许多方法可以执行此操作,并且Processing具有Table class,可让您读取/解析和写入CSV数据。目前,您的PrintWriter方法非常简单:使用它。