package fotometer;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.math.BigDecimal;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingConstants;
import javax.swing.border.EmptyBorder;
import com.tinkerforge.BrickletAmbientLight;
import com.tinkerforge.IPConnection;
public class Fotometer extends JFrame {
/**
*
*/
private static final long serialVersionUID = 1L;
private static final String host = "localhost";
private static final int port = 4223;
private static final String UID = "aw7";
private JPanel contentPane;
private JComboBox comboBox;
JButton btnMessungStarten = new JButton("Messung starten");
JButton btnMessungStoppen = new JButton("Messung stoppen");
JButton btnMessungUebernehmen = new JButton("Messung uebernehmen");
final JLabel lblErgebnis = new JLabel();
final JLabel lblHinweis = new JLabel();
final JLabel lblUeberschrift1 = new JLabel();
final JLabel lblUeberschrift2 = new JLabel();
final JLabel lblUeberschrift3 = new JLabel();
final JLabel lblUeberschrift4 = new JLabel();
final JLabel lblWert1 = new JLabel();
final JLabel lblWert2 = new JLabel();
final JLabel lblWert3 = new JLabel();
final JLabel lblWert4 = new JLabel();
private String ergebnisText = "";
private String comboBoxListe[] = {"JBL-Eisen", "JBL-Phosphat", "JBL-Nitrat", "Tetra-Nitrat", "AG-Kalium"};
private BigDecimal ergebnis;
private double nullWert = 800;
private double jbl_eisen[][] = {{800, 0}, {783, 19}, {778, 38}, {766, 63}, {739, 125}, {700, 250}, {615, 500}, {475, 1000}, {310, 2000}};
private double jbl_phosphat[][] = {{800, 0}, {788, 3}, {780, 5}, {772, 10}, {756, 21}, {720, 42}, {655, 83}, {550, 167}, {400, 334}, {270, 669}, {225, 1338}};
// private double jbl_nitrat[][] = {{660, 0}, {520, 6}, {430, 18}, {392, 25}, {371, 50}, {337, 100}};
private double jbl_nitrat[][] = {{660, 0}, {520, 6}, {460, 13}, {430, 18}, {392, 25}, {371, 50}, {337, 100}};
private double tetra_nitrat[][] = {{477, 0}, {382, 6}, {352, 13}, {307, 18}, {283, 25}, {232, 50}, {203, 100}};
private double ag_kalium[][] = {{771, 0}, {670, 1}, {412, 3}, {292, 9}, {211, 12}, {194, 13}, {182, 14}, {148, 16}, {125, 17}};
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
Fotometer frame = new Fotometer();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Timer der im Sekundentakt das Bricklet abfragt
*/
javax.swing.Timer messung = new javax.swing.Timer( 1000, new ActionListener()
{
public void actionPerformed( ActionEvent e )
{
ergebnis = berechneMittelwert(abfragenSensor(), String.valueOf(comboBox.getSelectedItem()));
if(ergebnis.compareTo(BigDecimal.ZERO) == 0)
ergebnisText = "Referenzbereich überschritten!";
else
ergebnisText = String.valueOf(ergebnis + " mg/L");
lblErgebnis.setText(ergebnisText);
}
});
/**
* Create the frame.
*/
public Fotometer() {
setTitle("Fotometer 2.0");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 503, 340);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(null);
comboBox = new JComboBox(comboBoxListe);
comboBox.setBounds(38, 67, 130, 20);
contentPane.add(comboBox);
// Label Ergebnis
lblErgebnis.setHorizontalAlignment(SwingConstants.CENTER);
lblErgebnis.setFont(new Font("Tahoma", Font.PLAIN, 30));
lblErgebnis.setBounds(0, 128, 487, 57);
lblErgebnis.setText("0.0 mg/L");
contentPane.add(lblErgebnis);
// Label Hinweis
lblHinweis.setHorizontalAlignment(SwingConstants.CENTER);
lblHinweis.setFont(new Font("Tahoma", Font.PLAIN, 14));
lblHinweis.setForeground(Color.red);
lblHinweis.setBounds(0, 134, 487, 57);
lblHinweis.setText("Verbindung zum Fotometer fehlgeschlagen!");
lblHinweis.setVisible(false);
contentPane.add(lblHinweis);
// Label Ueberschrift 1
lblUeberschrift1.setHorizontalAlignment(SwingConstants.CENTER);
lblUeberschrift1.setFont(new Font("Tahoma", Font.PLAIN, 12));
lblUeberschrift1.setBounds(47, 230, 40, 20);
lblUeberschrift1.setText("Fe");
contentPane.add(lblUeberschrift1);
// Label Ueberschrift 2
lblUeberschrift2.setHorizontalAlignment(SwingConstants.CENTER);
lblUeberschrift2.setFont(new Font("Tahoma", Font.PLAIN, 12));
lblUeberschrift2.setBounds(164, 230, 40, 20);
lblUeberschrift2.setText("PO4");
contentPane.add(lblUeberschrift2);
// Label Ueberschrift 3
lblUeberschrift3.setHorizontalAlignment(SwingConstants.CENTER);
lblUeberschrift3.setFont(new Font("Tahoma", Font.PLAIN, 12));
lblUeberschrift3.setBounds(281, 230, 40, 20);
lblUeberschrift3.setText("NO3");
contentPane.add(lblUeberschrift3);
// Label Ueberschrift 4
lblUeberschrift4.setHorizontalAlignment(SwingConstants.CENTER);
lblUeberschrift4.setFont(new Font("Tahoma", Font.PLAIN, 12));
lblUeberschrift4.setBounds(398, 230, 40, 20);
lblUeberschrift4.setText("K");
contentPane.add(lblUeberschrift4);
// Label Wert 1
lblWert1.setHorizontalAlignment(SwingConstants.CENTER);
lblWert1.setFont(new Font("Tahoma", Font.PLAIN, 12));
lblWert1.setBounds(17, 257, 100, 20);
lblWert1.setText("0.0 mg/L");
contentPane.add(lblWert1);
// Label Wert 2
lblWert2.setHorizontalAlignment(SwingConstants.CENTER);
lblWert2.setFont(new Font("Tahoma", Font.PLAIN, 12));
lblWert2.setBounds(134, 257, 100, 20);
lblWert2.setText("0.0 mg/L");
contentPane.add(lblWert2);
// Label Wert 3
lblWert3.setHorizontalAlignment(SwingConstants.CENTER);
lblWert3.setFont(new Font("Tahoma", Font.PLAIN, 12));
lblWert3.setBounds(251, 257, 100, 20);
lblWert3.setText("0.0 mg/L");
contentPane.add(lblWert3);
// Label Wert 4
lblWert4.setHorizontalAlignment(SwingConstants.CENTER);
lblWert4.setFont(new Font("Tahoma", Font.PLAIN, 12));
lblWert4.setBounds(368, 257, 100, 20);
lblWert4.setText("0.0 mg/L");
contentPane.add(lblWert4);
// Button Messung starten
btnMessungStarten.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
lblHinweis.setVisible(false);
messung.start();
btnMessungStarten.setEnabled(false);
btnMessungStoppen.setEnabled(true);
}
});
btnMessungStarten.setBounds(287, 34, 142, 23);
btnMessungStarten.setEnabled(false);
contentPane.add(btnMessungStarten);
// Button Messung stoppen
btnMessungStoppen.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
messung.stop();
btnMessungStarten.setEnabled(true);
btnMessungStoppen.setEnabled(false);
}
});
btnMessungStoppen.setEnabled(false);
btnMessungStoppen.setBounds(287, 66, 142, 23);
contentPane.add(btnMessungStoppen);
// Button Nullstellung
JButton btnNullstellung = new JButton("Nullstellung");
btnNullstellung.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
lblHinweis.setVisible(false);
lblErgebnis.setVisible(true);
messung.stop();
lblErgebnis.setText("0.0 mg/L");
btnMessungStarten.setEnabled(true);
btnMessungStoppen.setEnabled(false);
nullWert = abfragenSensor();
}
});
btnNullstellung.setBounds(38, 34, 130, 23);
contentPane.add(btnNullstellung);
// Button Messung uebernehmen
btnMessungUebernehmen.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
setzeMesswerte(String.valueOf(comboBox.getSelectedItem()));
}
});
// btnMessungUebernehmen.setEnabled(false);
btnMessungUebernehmen.setBounds(287, 100, 142, 23);
contentPane.add(btnMessungUebernehmen);
}
public double abfragenSensor()
{
IPConnection ipcon = new IPConnection();
BrickletAmbientLight al = new BrickletAmbientLight(UID, ipcon);
double illuminance = 0.0;
try
{
ipcon.connect(host, port);
illuminance = al.getIlluminance()/10.0;
ipcon.disconnect();
}
catch (Exception e)
{
lblErgebnis.setVisible(false);
lblHinweis.setVisible(true);
btnMessungStarten.setEnabled(false);
btnMessungStoppen.setEnabled(false);
e.printStackTrace();
}
return illuminance;
}
public BigDecimal berechneMittelwert(double lux, String wassertest)
{
// v1 + ((v2 - v1) / (k2 - k1)) * (k - k1)
// 13 + ((18-13) / (307-352)) * (330-352)
double zwErgebnis = 0;
double referenzWerte[][] = null;
double referenzWertKlein[][] = {{0,0}};
double referenzWertGross[][] = {{0,0}};
BigDecimal ergebnis = BigDecimal.ZERO;
lux = lux + (800 - nullWert);
if(wassertest.equalsIgnoreCase("JBL-Eisen"))
referenzWerte = jbl_eisen;
else if(wassertest.equalsIgnoreCase("JBL-Phosphat"))
referenzWerte = jbl_phosphat;
else if(wassertest.equalsIgnoreCase("JBL-Nitrat"))
referenzWerte = jbl_nitrat;
else if(wassertest.equalsIgnoreCase("Tetra-Nitrat"))
referenzWerte = tetra_nitrat;
else if(wassertest.equalsIgnoreCase("AG-Kalium"))
referenzWerte = ag_kalium;
for(int i = 0; i < referenzWerte.length-1; i++)
{
if(referenzWerte[i][0] >= lux && referenzWerte[i+1][0] <= lux)
{
referenzWertKlein[0][0] = referenzWerte[i+1][0];
referenzWertKlein[0][1] = referenzWerte[i+1][1];
referenzWertGross[0][0] = referenzWerte[i][0];
referenzWertGross[0][1] = referenzWerte[i][1];
zwErgebnis = referenzWertKlein[0][1] + ((referenzWertGross[0][1] - referenzWertKlein[0][1]) / (referenzWertGross[0][0] - referenzWertKlein[0][0])) * (lux - referenzWertKlein[0][0]);
if(wassertest.equalsIgnoreCase("JBL-Phosphat"))
zwErgebnis = zwErgebnis / 100;
else if(wassertest.equalsIgnoreCase("JBL-Eisen"))
zwErgebnis = zwErgebnis / 1000;
ergebnis = new BigDecimal(zwErgebnis);
ergebnis = ergebnis.setScale(2, BigDecimal.ROUND_HALF_UP);
}
}
return ergebnis;
}
public void setzeMesswerte(String wassertest)
{
if(wassertest.equalsIgnoreCase("JBL-Eisen"))
lblWert1.setText(lblErgebnis.getText());
else if(wassertest.equalsIgnoreCase("JBL-Phosphat"))
lblWert2.setText(lblErgebnis.getText());
else if(wassertest.equalsIgnoreCase("JBL-Nitrat"))
lblWert3.setText(lblErgebnis.getText());
else if(wassertest.equalsIgnoreCase("Tetra-Nitrat"))
lblWert3.setText(lblErgebnis.getText());
else if(wassertest.equalsIgnoreCase("AG-Kalium"))
lblWert4.setText(lblErgebnis.getText());
}
}