Minns jag rätt när du var intresserad av hur seriekommunikationen fungerade?
Du ska väl inte bygga en heltigenom likadan pryl som den här?
Mätapplikation med Arduino och Java
Re: Mätapplikation med Arduino och Java
Nej! Mitt projekt har ingenting att göra med NTC:er.
Idén till mitt projekt uppstod för flera år sedan när jag, Hans (netrunner på forumet) och Erik (så vitt jag vet inte på forumet) mätte effektiviteten (lyftkraft för ingångseffekt (Spänning X Ström)) för ett antal propellrar och motorer. Hans ville veta vid vilken kombination av propeller och motor, ett batteri räckte längsta möjliga tid, med mesta möjliga last. Hans var mycket inne på att bygga Drönare vid den tiden.
Vi använde en mekanisk rigg av trä med en våg, samtidigt som vi styrde motorpådraget och mätte spänning, ström och läste av vågen manuellt. Jag tyckte att det borde kunna automatiseras.
Nu har jag med hjälp av Claude.ai kommit väldigt långt i arduino koden. Och sitter och testar kommandon i seriemonitorn. Det börjar kännas som om det är dags att ta tag i Java delen. Så jag har plockat upp läroboken i Java och läst på om Swing, kommunikation via nätverks sockets och Threds.
Det jag vill lära mig från din kod är först och främst hanteringen av serieporten. Och sedan kanske lite graf ritning.
Med vänliga hälsningar Magnus Fransson.
Idén till mitt projekt uppstod för flera år sedan när jag, Hans (netrunner på forumet) och Erik (så vitt jag vet inte på forumet) mätte effektiviteten (lyftkraft för ingångseffekt (Spänning X Ström)) för ett antal propellrar och motorer. Hans ville veta vid vilken kombination av propeller och motor, ett batteri räckte längsta möjliga tid, med mesta möjliga last. Hans var mycket inne på att bygga Drönare vid den tiden.
Vi använde en mekanisk rigg av trä med en våg, samtidigt som vi styrde motorpådraget och mätte spänning, ström och läste av vågen manuellt. Jag tyckte att det borde kunna automatiseras.
Nu har jag med hjälp av Claude.ai kommit väldigt långt i arduino koden. Och sitter och testar kommandon i seriemonitorn. Det börjar kännas som om det är dags att ta tag i Java delen. Så jag har plockat upp läroboken i Java och läst på om Swing, kommunikation via nätverks sockets och Threds.
Det jag vill lära mig från din kod är först och främst hanteringen av serieporten. Och sedan kanske lite graf ritning.
Med vänliga hälsningar Magnus Fransson.
Re: Mätapplikation med Arduino och Java
Ok jag ska se om det går att ordna. Jag har nästan inte kodat i Java efter det här. Lätt att bli ringrostig. Det där med grafen var nog ett litet sidoprojekt tror jag.
Re: Mätapplikation med Arduino och Java
Seriekommunikation kan du testa med att blinka lysdioden på Arduinokortet med de här klasserna.
Vill minnas det är en knapp att trycka i GUI på för att blinka. com.fazecast.jSerialComm.SerialPort
finns på GitHub.
src\start\AppWin
src\serial\AppWinSerial
src\controller\AppWinThreadController
och så Aurdino-koden.....
Vill minnas det är en knapp att trycka i GUI på för att blinka. com.fazecast.jSerialComm.SerialPort
finns på GitHub.
src\start\AppWin
Kod: Markera allt
package start;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import controller.AppWinThreadController;
import serial.AppWinSerial;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
public class AppWin {
private static final int DEFAULTBAUDRATE = 19200;
private static AppWinThreadController threadController;
private static Thread threadControllerThread;
private static AppWinSerial appwinSerial;
private static void setUpSerial() {
appwinSerial = new AppWinSerial();
appwinSerial.setBaudRate(AppWin.DEFAULTBAUDRATE); // default baudrate för kommunikation med Arduino
}
public static AppWinSerial getAppWinSerial() {
return appwinSerial;
}
/**
* Launch the application.
* @param args
*/
public static void main(String[] args) {
Display display = Display.getDefault();
Shell shell = new Shell();
shell.setSize(239, 169);
shell.setLocation(800, 200);
shell.setText("SWT Application");
AppWin.setUpSerial();
//----------------------------------------------------------------START
Button btnNewButton = new Button(shell, SWT.NONE);
btnNewButton.addMouseListener(new MouseAdapter() {
@Override
public void mouseDown(MouseEvent e) {
if(threadController == null) {
threadController = new AppWinThreadController();
threadControllerThread = new Thread(threadController); // låt trådkontrollern bli en tråd
try {
threadControllerThread.start(); // starta upp Seriekommunikationen
}
catch(IllegalThreadStateException itse) {
System.out.println("IllegalThreadStateException");
}
}
}});
btnNewButton.setBounds(10, 32, 75, 25);
btnNewButton.setText("START");
//----------------------------------------------------------------EXIT
Button btnNewButton_1 = new Button(shell, SWT.NONE);
btnNewButton_1.addMouseListener(new MouseAdapter() {
@SuppressWarnings("removal")
@Override
public void mouseUp(MouseEvent e) {
if (threadControllerThread != null) {
appwinSerial.setStopSignal();
try {
threadControllerThread.interrupt();
}
catch(SecurityException se) {
se.printStackTrace();
}
shell.close();
display.close();
try {
this.finalize();
} catch (Throwable e1) {
e1.printStackTrace();
}
}
System.out.println("Exit!");
System.exit(0);
}
});
btnNewButton_1.setBounds(10, 82, 75, 25);
btnNewButton_1.setText("EXIT");
//----------------------------------------------------------------Switcha LED
Button btnSwitchaLed = new Button(shell, SWT.NONE);
btnSwitchaLed.addMouseListener(new MouseAdapter() {
@Override
public void mouseUp(MouseEvent e) {
if (threadControllerThread != null) {
appwinSerial.toggleSignal(); // toggla styrvillkoret för LED
try {
threadControllerThread.interrupt();
}
catch(SecurityException se) {
se.printStackTrace();
}
}
}
});
btnSwitchaLed.setBounds(103, 32, 75, 25);
btnSwitchaLed.setText("Switcha LED");
shell.open();
shell.layout();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
}
}
Kod: Markera allt
package serial;
import java.io.DataOutputStream;
import java.io.IOException;
import com.fazecast.jSerialComm.SerialPort;
/*
* Klassen representerar en seriell com-port där Arduino finns ansluten.
*/
public class AppWinSerial implements Runnable{
private int baudRate; // serieportens i GUI valda överföringshastighet
private SerialPort serialPort = null;
private DataOutputStream javaToArduinoOut = null;
private boolean stopSignal;
private boolean toggle;
/*
* Konstruktor till objekt av typen AppWinSerial
*/
public AppWinSerial() {
this.stopSignal = false;
this.toggle = false;
}
public void run() {
try {
startSerial();
} catch (InterruptedException e) {
System.out.println("InterruptedException in Serial run()");
}
}
/*
* Skiftar flaggan som använd för att avgöra
* om LED ska tändas eller släckas
*/
public void toggleSignal() {
if(this.toggle)
this.toggle = false;
else
this.toggle = true;
}
public boolean getToggleSignal() {
return this.toggle;
}
/*
* Om denna flagga sätts true så indikeras att
* kommunikationen med Arduino ska avslutas
*/
public void setStopSignal() {
this.stopSignal = true;
}
public boolean getStopSignal() {
return this.stopSignal;
}
/*
* Baudrate Default är 9600bps
* Metoden sätter värdet
*/
public void setBaudRate(int baudrate) {
baudRate = baudrate;
}
/*
* Returnerar aktuellt satt baudrate
*/
public int getBaudRate() {
return baudRate;
}
/*
* Påbörjar en kontakt med den COM-port som Arduino är ansluten till och
* Denna metod anropas vid tryck på knappen START i GUI.
*/
private void startSerial() throws InterruptedException {
boolean flag = this.comPortSetUp(); // konfigurerar porten
if(flag) {
this.LEDcontroller();
}
}
/*
* Metod. Scannar av vilka COM-portar som finns tillgängliga och om Arduino är ansluten
* till någon av dessa. Port med Arduino öppnas och porten konfigureras.
*/
public boolean comPortSetUp() throws InterruptedException {
boolean ArduinoUnoFlag = false;
int ArduinoUnoIndex = -1;
SerialPort[] sp = SerialPort.getCommPorts();
System.out.println("Antal tillgängliga seriella portar: "+sp.length);
for(int j=0;j<sp.length;j++) {
System.out.println(sp[j].getDescriptivePortName()+" öppen = "+sp[j].isOpen());
if(sp[j].getDescriptivePortName().contains("Arduino Uno")){
ArduinoUnoFlag = true;
ArduinoUnoIndex = j;
}
}
if(ArduinoUnoFlag) {
serialPort = sp[ArduinoUnoIndex];
if(serialPort.isOpen()) {
serialPort.closePort(); // Close connection
}
if(!serialPort.isOpen()) {
serialPort.openPort(); // Open connection
}
Thread.sleep(500);
serialPort.clearDTR(); // Arduino Reset
serialPort.setBaudRate(this.getBaudRate());
serialPort.setComPortTimeouts(SerialPort.TIMEOUT_READ_SEMI_BLOCKING, 2500, 0);
System.out.println(serialPort.getDescriptivePortName()+ " öppnad = "+serialPort.isOpen());
}
return ArduinoUnoFlag;
}
/*
*
*/
public void LEDcontroller() {
try
{
javaToArduinoOut = new DataOutputStream(serialPort.getOutputStream());
}
catch(IllegalStateException e)
{
e.printStackTrace();
}
while(true)
{
if(Thread.interrupted()) {
if(this.stopSignal) { // denna tråd har blivit avbruten
break; // för att avsluta
}
try {
if(this.toggle) { // för att toggla LED
System.out.println("SLÄCK");
javaToArduinoOut.writeByte(0);
}
else {
System.out.println("TÄND");
javaToArduinoOut.writeByte(1);
}
}
catch(IOException e) {
e.printStackTrace();
}
}
} // end while
if(serialPort.isOpen()) {
serialPort.closePort(); // koppla ned com-porten
}
try {
javaToArduinoOut.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
Kod: Markera allt
package controller;
import serial.AppWinSerial;
import start.AppWin;
public class AppWinThreadController implements Runnable {
private Thread arduinoSerialThread;
private static final int TIMER_INTERVAL = 500;
private AppWinSerial appwinSerial;
public AppWinThreadController() {
}
public void run() {
appwinSerial = AppWin.getAppWinSerial();
arduinoSerialThread = new Thread(appwinSerial); // låt appwinSerial bli en tråd
Thread.currentThread().setName("ControllerThread");
arduinoSerialThread.start();
while(true) {
try {
Thread.sleep(TIMER_INTERVAL);
}
catch(InterruptedException ie) {
arduinoSerialThread.interrupt();
}
if(Thread.interrupted() && appwinSerial.getStopSignal()) {
arduinoSerialThread.interrupt();
break;
}
}
}
}
och så Aurdino-koden.....
Kod: Markera allt
// the setup function runs once when you press reset or power the board
int data;
void setup() {
pinMode(LED_BUILTIN, OUTPUT);
digitalWrite(LED_BUILTIN, HIGH);
Serial.begin(19200);
while (!Serial) {
; // wait for serial port to connect. Needed for native USB
}
}
void loop() {
if (Serial.available() > 0) {
data = Serial.read();
if (data == 1) { // om en boolean true skickats så LED = High
digitalWrite(LED_BUILTIN, HIGH);
}
else {
digitalWrite(LED_BUILTIN, LOW);
}
}
}
