Die 6 Analogwerte auf dem Computer als Kennlinien ausgeben



Ziel:   

Arduino sendet Informationen zu einem Java-Programm.


   


Ein Java-Programm (es ist ein sog. "Frontend") empfängt die 6 Analogwerte vom Arduino und gibt sie als Kennlinien und Zahlenwerte aus.
Die Werte werden über USB (also seriell) vom Arduino zum Computer gesendet.


Du solltest vorher unbedingt dieses Experiment erfolgreich durchgeführt haben.



Schaltung:

Um die Schaltung einfach zu halten, wollen wir erstmal nur einen Analogeingang benutzen:


           

Der einstellbare Widerstand ist ein Poti oder ein Trimmer von 10 KiloOhm.
Größere Werte gehen auch problemlos.



Das Arduino-Programm:

int Wert0, Wert1, Wert2, Wert3, Wert4, Wert5; 

void setup() {
    Serial.begin(9600);
}
 
void loop() {
  Wert0 = analogRead(A0);
  Wert1 = analogRead(A1);
  Wert2 = analogRead(A2);
  Wert3 = analogRead(A3);
  Wert4 = analogRead(A4);
  Wert5 = analogRead(A5);
 
  String myString = "@" + String(Wert0) + ";"
                        + String(Wert1) + ";"
                        + String(Wert2) + ";"
                        + String(Wert4) + ";"
                        + String(Wert4) + ";"
                        + String(Wert5) + "#";

 
  Serial.println(myString);
  Serial.flush();
  delay(250); 
}


Die sechs Werte werden den 6 Analogeingängen entnommen und zu einem String "myString" zusammengebaut,
der z. B. so aussehen könnte:

              @317;299;300;314;320;250#

Es gibt vorn ein „@“ und hinten ein „#“ sowie dazwischen die mittels Semikolons getrennten Werte.
Dieser String wird dann gesendet mit:    Serial.println(myString);

Nachdem das Programm in den Arduino geschoben wurde, sendet dieser nun im Abstand von 250ms diesen String mit den aktuellen Werten über die serielle Schnittstelle.





Das Java-Program:

In Deinem Java-Projekt legst Du ein neues Package namens: "analog" an, wenn Du es dort nicht schon hast.

In dem Package "analog" legst Du eine neue Klasse namens "SechsAnalogWerteInFrameAlsKennlinieAusgeben" an.

Ist die geforderte Klasse bei Dir angelegt, steht schon einwenig Code darin.
Den kannst Du komplett löschen und statt dessen dort den folgenden Programmcode hineinkopieren:


package analog;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;

import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

import jssc.SerialPort;
import jssc.SerialPortEvent;
import jssc.SerialPortEventListener;
import jssc.SerialPortException;

@SuppressWarnings("serial")
public class SechsAnalogWerteInFrameAlsKennlinieAusgeben extends JFrame implements SerialPortEventListener {

   
    private KennlinenPanel p;
    private String sammler = "";

    //hier musst Du Deinen Port angeben:
    private SerialPort serialPort = new SerialPort("/dev/tty.usbmodem24131");

    private JLabel[] lbl = new JLabel[6];
    private int xWert = 0;

    public SechsAnalogWerteInFrameAlsKennlinieAusgeben() {
       
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setBounds(100, 100, 730, 720);
        this.setTitle("6 Analogwerte als Kennlinien ausgeben");
        this.setLayout(null);

        createLabels();
       
        p = new KennlinenPanel();
        this.add(p);
       
        this.setVisible(true);
       
        initSerialPort();
    }

    private void createLabels() {
        for (int i = 0; i < 6; i++) {
            lbl[i] = new JLabel();
            lbl[i].setBounds(10, 70 + 108*i, 50, 25);
            this.add(lbl[i]);   
        }
    }

    private void initSerialPort() {
        try {
            serialPort.openPort();
            serialPort.setParams(9600, 8, 1, 0);
            serialPort.addEventListener(this);
        } catch (SerialPortException ex) {
            System.out.println(ex);
        }
    }

    public void serialEvent(SerialPortEvent e) {
        try {
            sammler += serialPort.readString();
            sammler = sammler.replaceAll("null", "");
            sammler = sammler.replaceAll("\n", "");
            sammler = sammler.replaceAll("\r", "");

            // Test auf Vorhandensein von "@" und dahinter "#"
            if ( sammler.indexOf("@") > -1 && sammler.indexOf("#") > sammler.indexOf("@") ) {

                // String zwischen '@' und '#' herausholen
                sammler = sammler.substring(1, sammler.indexOf("#"));

                String[] wertAsString = sammler.split(";");
                int[] wert = new int[6];

                for (int nummer = 0; nummer < 6; nummer++) {
                    lbl[nummer].setText(wertAsString[nummer]);
                    wert[nummer] = Integer.parseInt(wertAsString[nummer]) / 20;
                }

                xWert++;
                p.setX(xWert);
                p.setV(wert);
                p.malen();

                sammler = "";
            }

        } catch (SerialPortException ex) {
            System.out.println(ex);
        }
    }

    public static void main(String[] args) {
        new SechsAnalogWerteInFrameAlsKennlinieAusgeben();
    }
}


@SuppressWarnings("serial")
class KennlinenPanel extends JPanel {

    private Graphics2D grf;
   
    private int x;                // die x-Position
    private int[] v = new int[6]; // die 6 Werte
   
    Color[] c = { Color.RED, Color.GREEN, Color.MAGENTA, Color.BLUE, Color.BLACK, Color.ORANGE };

    KennlinenPanel() {
        this.setBounds(50, 20, 650, 650);
        this.setBorder(BorderFactory.createLineBorder(Color.black));
    }

    public void setV(int[] v) {
        this.v = v;
    }

    public void setX(int x) {
        this.x = x;
    }

    protected void paintComponent(Graphics g) {
        grf = (Graphics2D) g;
        grf.setPaintMode();

        for (int i = 0; i < 6; i++) {
            grf.setColor(c[i]);
            grf.fillOval(x, 60 + v[i] + 105 * i, 3, 3); // 3 Pixel große Punkte
        }
    }

    public void malen() {
        repaint();
    }
}