Sechs Slider steuern sechs LEDs



Ziel:    Mit einem Java-Programm die Helligkeit von 6 LEDs steuern.


Ein Java-Programm (es ist ein sog. "Frontend") mit sechs Sliders (Schieberegler) liefert sechs Zahlenwerte, die über USB zum Arduino gesendet werden.

Arduino steuert mit diesen 6 Werten 6 LEDs, die an den PWM-fähigen Ausgängen hängen.


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


Dies ist eine Erweiterung von dem vorherigen Projekt, in dem nur ein Slider benutzt wird.
Falls also etwas nicht klar für Dich ist, dann lies unbedingt erst jenes Projekt durch!

Die Erweiterung besteht in der Beantwortung der Frage, wie man denn nun mehrere Werte seriell zum Arduino senden kann.


      
                       

Java-Program:


import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JSlider;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

import jssc.SerialPort;
import jssc.SerialPortException;

@SuppressWarnings("serial")
public class SixSlidersToArduino extends JFrame implements ChangeListener {

    JSlider[] sli = new JSlider[6];
    JLabel[] lbl = new JLabel[6];

    int nummer, wert;
    int[] pwmOutput = { 3, 5, 6, 9, 10, 11 }; // Arduino-PWM-Pin-Nummern

    // hier DEINEN Port eintragen:
    private SerialPort sp = new SerialPort("COM8");

    public SixSlidersToArduino() {
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        this.setBounds(20, 20, 690, 400);
        this.setTitle("6 Slider steuern die Helligkeit von 6 LEDs");
        this.setLayout(null);
        this.createComponents();

        this.setVisible(true);

    }

    private void createComponents() {

        // Sliders and Labels
        for (int i = 0; i < 6; i++) {

            sli[i] = new JSlider(JSlider.VERTICAL, 0, 255, 0);
            sli[i].setBounds(50 + 100 * i, 20, 70, 300);
            sli[i].setMajorTickSpacing(50); // Große Skalenstriche
            sli[i].setMinorTickSpacing(5); // Kleine Skalenstriche
            sli[i].setPaintTicks(true);
            sli[i].setPaintLabels(true);
            sli[i].addChangeListener(this);
            this.add(sli[i]);

            lbl[i] = new JLabel("0");
            lbl[i].setBounds(44 + 100 * i, 315, 50, 25);
            lbl[i].setHorizontalAlignment(JLabel.CENTER);
            this.add(lbl[i]);
        }

        // Serial Port:
        try {
            sp.openPort();
            sp.setParams(9600, 8, 1, 0);
        } catch (SerialPortException e) { }

    }

    @Override
    public void stateChanged(ChangeEvent e) {

        for (int i = 0; i < 6; i++) {
            if (e.getSource() == sli[i]) {
                lbl[i].setText(String.valueOf(sli[i].getValue()));
                nummer = i;
            }
        }

        wert = sli[nummer].getValue();

        int[] value = new int[] { pwmOutput[nummer], wert };

        try {
            sp.writeIntArray(value);
        } catch (SerialPortException e1) {    }

    }

    public static void main(String args[]) throws SerialPortException {
        new SixSlidersToArduino();
    }
}



Arduino-Program:

int pinNummer, pwmWert;

void setup() {
  Serial.begin(9600);
}

void loop() {

  while ( Serial.available() > 1 ) {

    // zwei Werte aus dem Puffer lesen
    pinNummer = Serial.read();
    pwmWert = Serial.read();

    analogWrite(pinNummer, pwmWert);

    delay(5);
  }

}