图表并将串行数据保存到处理中

时间:2014-04-17 22:02:38

标签: arduino serial-port processing graphing

只是想说我一直在使用论坛来学习很多,所以感谢所有贡献者和支持者的堆栈溢出。

我是刚接触处理/ arduino的学生,我正在尝试制作一个处理草图,该草图采用串行数据并在不同的图形上绘制多个传感器值,同时具有用户记录所有数据的能力成为CSV。另外,我想知道如何制作一个更新并打印其中一个传感器值的简单文本框。

我的arduino串行打印输出代码的一个非常基本的片段包括:

Serial.print(sensor1);
Serial.print(",");
Serial.print(sensor2);
Serial.print(",");
Serial.print(sensor3);
Serial.println(",");

//Sensor1 and 2, would be on separate graphs, and 3 would be a single printed value updated frequently.

为了处理我已经看到了非常基本的例子,并且想知道更简单/更好的事情:使用map函数做直接图或设置cgraph和cdata数组(在另一个例子中看到)。最后,在使用创建编写器或文件写入器来保存数据时,有没有办法创建新文件而不是覆盖或附加数据?我可以使用if语句来获取用户输入文本以输入文件名以避免覆盖吗?

我会很高兴任何提示或帮助。

1 个答案:

答案 0 :(得分:0)

你应该在最后发送一个新的行字符:

Serial.print(sensor1);
Serial.print(",");
Serial.print(sensor2);
Serial.print(",");
Serial.print(sensor3);
Serial.println();

完成后,您可以使用Serial bufferUntil()来跟踪每一行。然后在serialEvent()中,您可以简单地readString() 在保存为CSV文件方面,您可以将每行附加到ArrayList。 (或者您可以使用典型的String[],但是当新行进入时,您必须手动管理行索引和expand()数组.ArrayList可能更简单)。无论何时想保存CSV文件,都可以轻松地将ArrayList转换为saveStrings()所期望的String []。在保存新文件方面,您只需创建一个时间戳字符串:

import processing.serial.*;
//serial port
Serial arduino;
//timestamp used for CSV filename
String timestamp;
//current CSV line received from Arduino
String currentLine = "";
//all lines received from Arduino
ArrayList<String> csvData = new ArrayList<String>();


void setup(){
  try{
    //be sure use the correct port/baud rate
    arduino = new Serial(this,"/SERIAL_PORT_HERE",115200);
    arduino.bufferUntil('\n');
  }catch(Exception e){
    System.err.println("Error initializing serial port!\nPlease check the PORT NAME, BAUD RATE and USB connections\nAlso close Serial Monitor or other serial port connections (if any)");
    e.printStackTrace();
  }
}
void draw(){
  background(0);
  text(currentLine,10,15);
}
void serialEvent(Serial s){
  //read data from serial port
  currentLine = s.readString();
  //append data to be later saved as a CSV file
  csvData.add(currentLine);
  //process current values - update plot, not fully implemented
  processCurrentLine();
}
void processCurrentLine(){
  //parse and update plot here
  try{
    String[] values = currentLine.split(",");
    printArray(values);
  }catch(Exception e){
    e.printStackTrace();
  }
}
void saveCSV(){
  //create a timestamp to be used for the CSV filename (avoiding the file being overwritten 
  timestamp = day()+"-"+month()+"-"+year()+" "+hour()+":"+minute()+":"+second();
  println("saving CSV file");
  saveStrings(timestamp+".csv",csvData.toArray(new String[csvData.size()]));
}
//save on 's' key 
void keyReleased(){
  if(key == 's') saveCSV();
}
//save on exit
void exit(){
  saveCSV();
  super.exit();
}

如果您使用的是Windows,则可能需要结帐SerialChart。 这是一个很好的简单的基于Qt的UI,用于基于CSV格式的串行数据渲染图形。它还应该允许您保存数据,它也提供了一些配置设置。

Serial Chart preview

<强>更新 我最近注意到Arduino 1.6.6(或更新版本)有一个built in Serial Plotter

Arduino integrated Serial Plotter