【问题标题】:Graph and save serial data into processing绘制串行数据并将其保存到处理中
【发布时间】:2014-04-17 22:02:37
【问题描述】:

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

我是处理/arduino 的新手,我正在尝试制作一个处理草图,该草图采用串行数据并在不同图表上绘制多个传感器值,同时让用户能够将所有数据记录到 CSV .我还想知道如何制作一个简单的文本框来更新和打印其中一个传感器值。

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

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 数组(在另一个示例中看到)。最后,在使用 create writer 或 filewriter 保存数据时,有没有办法创建新文件而不是覆盖或附加数据?我可以使用 if 语句让用户输入文本以输入文件名以避免覆盖吗?

如果有任何提示或帮助,我将不胜感激。

【问题讨论】:

    标签: arduino serial-port processing graphing


    【解决方案1】:

    您可能应该在末尾发送一个换行符:

    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 转换为 String[],这正是 saveStrings() 所期望的。在保存新文件方面,您可以简单地创建一个时间戳字符串:

    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 格式的串行数据呈现图形。它还应该允许您保存数据,并且还提供了一些配置设置。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-23
      • 1970-01-01
      • 2020-01-27
      • 1970-01-01
      • 2019-10-22
      • 2015-09-25
      • 2023-01-18
      相关资源
      最近更新 更多