首页 文章

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

提问于
浏览
2

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

我是一名刚接触处理/ 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

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

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

    一旦's done you can use Serial' s 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格式的串行数据渲染图形 . 它还应该允许您保存数据,它也提供一些配置设置 .

    Update 我最近注意到Arduino 1.6.6(或更新版)有built in Serial Plotter

相关问题