Please let me know that scanner is not working properly it is missing data from serial port. Is there any other method to obtain values from serial port from Arduino? I am using Accelerometer ADXL335 and Arduino sending 3-axes values, I want to attain on my Java program. If anyone please guide me how to resolve it.
import java.awt.BasicStroke;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.Stroke;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.Serializable;
import java.util.Random;
import java.util.Scanner;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JPanel;
import javax.swing.Timer;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.ValueAxis;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.XYItemRenderer;
import org.jfree.data.time.DynamicTimeSeriesCollection;
import org.jfree.data.time.Second;
import org.jfree.data.xy.XYDataset;
import org.jfree.ui.ApplicationFrame;
import com.fazecast.jSerialComm.SerialPort;
import com.fazecast.jSerialComm.SerialPortDataListener;
public class Grid_Layout extends ApplicationFrame {
/**
*
*/
private static final long serialVersionUID = 1L;
private static final int CHART_WIDTH = 600;
private static final int CHART_HEIGHT = 300;
private static final String TITLE1 = "X-Axis";
private static final String TITLE2 = "Y-Axis";
private static final String TITLE3 = "Z-Axis";
private static final String START = "Start";
private static final String STOP = "Stop";
private static final float MINMAX = 200;
private static final int COUNT = 2 * 60;
private static final int FAST = 100;
private static final int SLOW = FAST * 5;
private static final Random random = new Random();
private static final JComboBox<String> portList = new JComboBox<String>();
private static final JButton connect = new JButton("Connect");
private static final TextField text = new TextField(10);
private Timer timer;
private Timer timer2;
private Timer timer3;
private static SerialPort chosenPort;
private static int x = 0;
private static float number;
private static class GridChart extends ChartPanel {
/**
*
*/
private static final long serialVersionUID = 1L;
public GridChart(JFreeChart chart) {
super(chart);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(CHART_WIDTH, CHART_HEIGHT);
}
}
public Grid_Layout(final String title) {
super(title);
final XYDataset dataset = createDataset1();
JFreeChart chart = createChart(dataset);
final XYDataset dataset2 = createDataset2();
JFreeChart chart2 = createChart2(dataset2);
final XYDataset dataset3 = createDataset3();
JFreeChart chart3 = createChart3(dataset3);
final JButton run = new JButton(STOP);
run.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String cmd = e.getActionCommand();
if (STOP.equals(cmd)) {
timer.stop();
timer2.stop();
timer3.stop();
run.setText(START);
} else {
timer.start();
timer2.start();
timer3.start();
run.setText(STOP);
}
}
});
final JComboBox<String> combo = new JComboBox<String>();
combo.addItem("Fast");
combo.addItem("Slow");
combo.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if ("Fast".equals(combo.getSelectedItem())) {
timer.setDelay(FAST);
timer2.setDelay(FAST);
timer3.setDelay(FAST);
} else {
timer.setDelay(SLOW);
timer2.setDelay(SLOW);
timer3.setDelay(SLOW);
}
}
});
// populate the drop-down box
SerialPort[] portNames = SerialPort.getCommPorts();
for (int i = 0; i < portNames.length; i++)
portList.addItem(portNames[i].getSystemPortName());
connect.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (connect.getText().equals("Connect")) {
// attempt to connect to the serial port
chosenPort = SerialPort.getCommPort(portList.getSelectedItem().toString());
chosenPort.setComPortTimeouts(SerialPort.TIMEOUT_SCANNER, 0, 0);
if (chosenPort.openPort()) {
connect.setText("Disconnect");
portList.setEnabled(false);
}
randomValue();
} else {
// disconnect from the serial port
chosenPort.closePort();
portList.setEnabled(true);
connect.setText("Connect");
text.setText(null);
// series.clear();
x = 0;
}
}
});
JPanel gridPanel = new JPanel(new GridLayout(2, 2));
gridPanel.add(new GridChart(chart));
gridPanel.add(new GridChart(chart2));
gridPanel.add(new GridChart(chart3));
JPanel btnPanel = new JPanel(new FlowLayout());
btnPanel.add(run);
btnPanel.add(combo);
btnPanel.add(portList);
btnPanel.add(connect);
btnPanel.add(text);
this.add(gridPanel);
this.add(btnPanel, BorderLayout.SOUTH);
}
private float randomValue() {
// create a new thread that listens for incoming text and populates the graph
Thread thread = new Thread() {
@Override
public void run() {
try {
Scanner scanner = new Scanner(chosenPort.getInputStream());
while (scanner.hasNextByte()) {
try {
String line = scanner.nextLine();
// number = Integer.parseInt(line);
System.out.println(line);
//text.setText(String.valueOf(number));
} catch (Exception e) {
System.out.println(e);
}
}
scanner.close();
} catch (NullPointerException e) {
}
}
};
thread.start();
return number;
}
private float[] gaussianData() {
float[] a = new float[COUNT];
for (int i = 0; i < a.length; i++) {
a[i] = randomValue();
}
return a;
}
private JFreeChart createChart(final XYDataset dataset) {
final JFreeChart result = ChartFactory.createTimeSeriesChart(TITLE1, "Time (seconds)", "Intensity (cm/s)",
dataset, true, true, false);
final XYPlot plot = result.getXYPlot();
ValueAxis domain = plot.getDomainAxis();
domain.setAutoRange(true);
ValueAxis range = plot.getRangeAxis();
//range.setRange(-MINMAX, MINMAX);
range.setAutoRange(true);
XYItemRenderer render = plot.getRenderer();
render.setSeriesPaint(0, Color.blue);
return result;
}
private JFreeChart createChart2(final XYDataset dataset) {
final JFreeChart result = ChartFactory.createTimeSeriesChart(TITLE2, "Time (seconds)", "Intensity (cm/s)",
dataset, true, true, false);
final XYPlot plot = result.getXYPlot();
ValueAxis domain = plot.getDomainAxis();
domain.setAutoRange(true);
ValueAxis range = plot.getRangeAxis();
//range.setRange(-MINMAX, MINMAX);
range.setAutoRange(true);
XYItemRenderer render = plot.getRenderer();
render.setSeriesPaint(0, Color.red);
return result;
}
private JFreeChart createChart3(final XYDataset dataset) {
final JFreeChart result = ChartFactory.createTimeSeriesChart(TITLE3, "Time (seconds)", "Intensity (cm/s)",
dataset, true, true, false);
final XYPlot plot = result.getXYPlot();
ValueAxis domain = plot.getDomainAxis();
domain.setAutoRange(true);
ValueAxis range = plot.getRangeAxis();
//range.setRange(-MINMAX, MINMAX);
range.setAutoRange(true);
XYItemRenderer render = plot.getRenderer();
render.setSeriesPaint(0, Color.black);
return result;
}
public void start() {
timer.start();
timer2.start();
timer3.start();
}
private XYDataset createDataset1() {
final DynamicTimeSeriesCollection dataset = new DynamicTimeSeriesCollection(1, COUNT, new Second());
dataset.setTimeBase(new Second(0, 0, 0, 24, 5, 2022));
dataset.addSeries(gaussianData(), 0, "X");
timer = new Timer(FAST, new ActionListener() {
float[] newData = new float[1];
@Override
public void actionPerformed(ActionEvent e) {
newData[0] = randomValue();
dataset.advanceTime();
dataset.appendData(newData);
}
});
return dataset;
}
private XYDataset createDataset2() {
final DynamicTimeSeriesCollection dataset = new DynamicTimeSeriesCollection(1, COUNT, new Second());
dataset.setTimeBase(new Second(0, 0, 0, 26, 5, 2022));
dataset.addSeries(gaussianData(), 0, "Y");
timer2 = new Timer(FAST, new ActionListener() {
float[] newData2 = new float[1];
@Override
public void actionPerformed(ActionEvent e) {
newData2[0] = randomValue();
dataset.advanceTime();
dataset.appendData(newData2);
}
});
return dataset;
}
private XYDataset createDataset3() {
final DynamicTimeSeriesCollection dataset = new DynamicTimeSeriesCollection(1, COUNT, new Second());
dataset.setTimeBase(new Second(0, 0, 0, 26, 5, 2022));
dataset.addSeries(gaussianData(), 0, "Z");
timer3 = new Timer(FAST, new ActionListener() {
float[] newData3 = new float[1];
@Override
public void actionPerformed(ActionEvent e) {
newData3[0] = randomValue();
dataset.advanceTime();
dataset.appendData(newData3);
}
});
return dataset;
}
public static void main(final String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
Grid_Layout demo = new Grid_Layout("Vibration Analyser");
//demo.setLayout(new GridLayout(2, 2, 20, 20));
demo.pack();
demo.setLocationRelativeTo(null);
demo.setVisible(true);
demo.start();
}
});
}
}