Arduino to PC: Arduino Uno analog input, display on JavaFX LineChart
PC to Arduino: Button to control Arduino Uno on-board LED
Before start, you have to Prepare jSSC on your NetBeans project.
Arduino side: AnalogInputToUSB.ino, run on Arduino Uno.
/*
* AnalogInputUSB
* Read analog input from analog pin 0
* and send data to USB
*/
int ledPin = 13;
int analogPin = A0;
int analogValue = 0;
int incomingByte = 0;
void setup() {
pinMode(ledPin, OUTPUT);
Serial.begin(9600);
}
void loop() {
if (Serial.available() > 0) {
incomingByte = Serial.read();
if(incomingByte & 0x01){
digitalWrite(ledPin, HIGH);
}else{
digitalWrite(ledPin, LOW);
}
}
analogValue = analogRead(analogPin); //Read analog input
analogValue = map(analogValue, 0, 1023, 0, 255);
Serial.write(analogValue); //write as byte, to USB
delay(100);
}a
PC Side, JavaFX_jssc_Uno.java
/*
* Example of using jSSC library to handle serial port
* Receive number from Arduino via USB/Serial and display on Label
*/
package javafx_jssc_uno;
import java.util.logging.Level;
import java.util.logging.Logger;
import javafx.application.Application;
import javafx.application.Platform;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.scene.Scene;
import javafx.scene.chart.LineChart;
import javafx.scene.chart.NumberAxis;
import javafx.scene.chart.XYChart;
import javafx.scene.control.Button;
import javafx.scene.control.ComboBox;
import javafx.scene.control.Label;
import javafx.scene.control.ToggleButton;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.scene.text.Font;
import javafx.stage.Stage;
import jssc.SerialPort;
import static jssc.SerialPort.MASK_RXCHAR;
import jssc.SerialPortEvent;
import jssc.SerialPortException;
import jssc.SerialPortList;
public class JavaFX_jssc_Uno extends Application {
SerialPort arduinoPort = null;
ObservableList<String> portList;
ToggleButton tbLED13;
Label labelValue;
final int NUM_OF_POINT = 50;
XYChart.Series series;
private void detectPort(){
portList = FXCollections.observableArrayList();
String[] serialPortNames = SerialPortList.getPortNames();
for(String name: serialPortNames){
System.out.println(name);
portList.add(name);
}
}
@Override
public void start(Stage primaryStage) {
labelValue = new Label();
labelValue.setFont(new Font("Arial", 28));
detectPort();
final ComboBox comboBoxPorts = new ComboBox(portList);
comboBoxPorts.valueProperty()
.addListener(new ChangeListener<String>() {
@Override
public void changed(ObservableValue<? extends String> observable,
String oldValue, String newValue) {
System.out.println(newValue);
disconnectArduino();
connectArduino(newValue);
tbLED13.setSelected(false);
}
});
//Toggle Button to control LED on Arduino
tbLED13 = new ToggleButton("Arduino LED 13");
tbLED13.setOnAction((ActionEvent event) -> {
updateLED13();
});
//LineChart
final NumberAxis xAxis = new NumberAxis();
final NumberAxis yAxis = new NumberAxis();
yAxis.setLabel("Voltage");
final LineChart<Number,Number> lineChart =
new LineChart<>(xAxis,yAxis);
lineChart.setTitle("Arduino Uno A0 Analog Input");
series = new XYChart.Series();
series.setName("A0 analog input");
lineChart.getData().add(series);
lineChart.setAnimated(false);
//pre-load with dummy data
for(int i=0; i<NUM_OF_POINT; i++){
series.getData().add(new XYChart.Data(i, 0));
}
//
VBox vBox = new VBox();
vBox.getChildren().addAll(
comboBoxPorts,
tbLED13,
labelValue,
lineChart);
StackPane root = new StackPane();
root.getChildren().add(vBox);
Scene scene = new Scene(root, 500, 400);
primaryStage.setTitle(
"arduino-er.blogspot.com: Java + JavaFX + jSSC demo");
primaryStage.setScene(scene);
primaryStage.show();
}
private void updateLED13(){
try {
if(tbLED13.isSelected()){
if(arduinoPort != null){
arduinoPort.writeByte((byte)0x01);
System.out.println("LED 13 ON");
}else{
System.out.println("arduinoPort not connected!");
}
}else {
if(arduinoPort != null){
arduinoPort.writeByte((byte)0x00);
System.out.println("LED 13 OFF");
}else{
System.out.println("arduinoPort not connected!");
}
}
}catch (SerialPortException ex) {
Logger.getLogger(JavaFX_jssc_Uno.class.getName())
.log(Level.SEVERE, null, ex);
}
}
public void shiftSeriesData(float newValue)
{
for(int i=0; i<NUM_OF_POINT-1; i++){
XYChart.Data<String, Number> ShiftDataUp =
(XYChart.Data<String, Number>)series.getData().get(i+1);
Number shiftValue = ShiftDataUp.getYValue();
XYChart.Data<String, Number> ShiftDataDn =
(XYChart.Data<String, Number>)series.getData().get(i);
ShiftDataDn.setYValue(shiftValue);
}
XYChart.Data<String, Number> lastData =
(XYChart.Data<String, Number>)series.getData().get(NUM_OF_POINT-1);
lastData.setYValue(newValue);
}
public boolean connectArduino(String port){
System.out.println("connectArduino");
boolean success = false;
SerialPort serialPort = new SerialPort(port);
try {
serialPort.openPort();
serialPort.setParams(
SerialPort.BAUDRATE_9600,
SerialPort.DATABITS_8,
SerialPort.STOPBITS_1,
SerialPort.PARITY_NONE);
serialPort.setEventsMask(MASK_RXCHAR);
serialPort.addEventListener((SerialPortEvent serialPortEvent) -> {
if(serialPortEvent.isRXCHAR()){
try {
byte[] b = serialPort.readBytes();
int value = b[0] & 0xff; //convert to int
String st = String.valueOf(value);
//Update label in ui thread
Platform.runLater(() -> {
labelValue.setText(st);
shiftSeriesData((float)value * 5/255); //in 5V scale
});
} catch (SerialPortException ex) {
Logger.getLogger(JavaFX_jssc_Uno.class.getName())
.log(Level.SEVERE, null, ex);
}
}
});
arduinoPort = serialPort;
success = true;
} catch (SerialPortException ex) {
Logger.getLogger(JavaFX_jssc_Uno.class.getName())
.log(Level.SEVERE, null, ex);
System.out.println("SerialPortException: " + ex.toString());
}
return success;
}
public void disconnectArduino(){
System.out.println("disconnectArduino()");
if(arduinoPort != null){
try {
arduinoPort.removeEventListener();
if(arduinoPort.isOpened()){
arduinoPort.closePort();
}
arduinoPort = null;
} catch (SerialPortException ex) {
Logger.getLogger(JavaFX_jssc_Uno.class.getName())
.log(Level.SEVERE, null, ex);
}
}
}
@Override
public void stop() throws Exception {
disconnectArduino();
super.stop();
}
public static void main(String[] args) {
launch(args);
}
}
Connect a potentiometer in Arduino Uno side to set analog input A0.
Next:
- Run it remotely on Raspberry Pi 2.
thanks my nigga
ReplyDelete