如何结合Java绘图代码和Java串行代码来读取Arduino传感器值?

时间:2012-08-22 16:42:13

标签: java charts serial-port arduino jfreechart

更新:我正在使用的代码可以在这里找到:https://dl.dropbox.com/u/2108381/MyArduinoPlot.java 我希望这有助于理解我的挑战。提前感谢您的时间。

我想从Arduino中读取传感器值并使用Java库JFreeChart绘制它们。

我在互联网上找到了一些代码(见下文),现在,我想结合用于绘制动态折线图的代码和用于读取Arduino值的代码。这两个代码都是分开工作的,但我仍然坚持将两者结合起来。

绘制动态折线图的代码来自此处(绘制随机数据): http://dirtyhandsphp.blogspot.in/2012/07/how-to-draw-dynamic-line-or-timeseries.html

用Java读取Arduino值的代码来自: http://arduino.cc/playground/Interfacing/Java

我假设(Java中的新手)相关部分在这里:

/**
 * Handle an event on the serial port. Read the data and print it.
 */
public synchronized void serialEvent(SerialPortEvent oEvent) {
    if (oEvent.getEventType() == SerialPortEvent.DATA_AVAILABLE) {
        try {
            int available = input.available();
            byte chunk[] = new byte[available];
            input.read(chunk, 0, available);

            // Displayed results are codepage dependent
            System.out.print(new String(chunk));

//              the code I tried

//              String MyValue = new String(chunk);
//              Double Value = Double.valueOf(MyValue); 

        } catch (Exception e) {
            System.err.println(e.toString());
        }
    }
    // Ignore all the other eventTypes, but you should consider the other ones.
}

在这里:

public void actionPerformed(final ActionEvent e) {


//      Original Code

    final double factor = 0.9 + 0.2*Math.random();
    this.lastValue = this.lastValue * factor;

    final Millisecond now = new Millisecond();
    this.series.add(new Millisecond(), this.lastValue);

    System.out.println("Current Time in Milliseconds = " + now.toString()+", Current Value : "+this.lastValue);

//        my code
//        this.series.add(new Millisecond(), Value);


}

如何让public synchronized void serialEvent返回传感器值,如何将其添加到this.series.add部分?

我是Java的新手。

非常感谢任何直接帮助或与其他网站/帖子的链接。谢谢你的时间。

1 个答案:

答案 0 :(得分:1)

在此example中,javax.swing.Timer会定期向计时器dataset中的ActionListener添加新值。你想从外面做。以下是如何进行的概述:

  1. datasetnewData移至instance variables

    DynamicTimeSeriesCollection dataset;
    float[] newData = new float[1];
    
  2. 添加一种方法,将您的数据附加到图表的dataset

    public synchronized void addData(byte[] chunk) {
        for (int i = 0; i < chunk.length; i++) {
            newData[0] = chunk[i];
            dataset.advanceTime();
            dataset.appendData(newData);
        }
    }
    
  3. serialEvent()

    调用方法
    demo.addChunk(chunk);