Fotometer Marke Eigenbau

Tiegars

Member
Hallo Tobias,

das liegt an der Wandstärke des Glases. Das variiert schon heftig. Ich habe darum mir von 100 Gläser die ausgesucht die 15.85-15.95 Durchmesser haben. Du siehst es auch wen du das Reagenzglas drehst bei der Messung wie sich der Wert verändert. Da glaube ich kann man nix machen. Das Teil ist eben zu empfindlich :)
 

ToBe

Member
Hallo Zusammen,

hatte auch schon vor mit Markierungen zu arbeiten wenn es dann ernst wird! ;) Wobei ich aber damit leben kann wenn es beim Drehen des Glases leichte Veränderungen gibt.

Ich glaube eher, dass das noch nen anderes Problem ist. Das selbe Glas mit dem selben Leitungswasser hat einmal ca. 780 LUX (+- 5 bis 10 LUX beim Drehen), ziehe es raus und stecke es wieder rein, und hat dann ca. 800 LUX (+- 5 bis 10 LUX beim Drehen).
Wobei ich mir jetzt nicht mehr sicher bin, ob ich das Glas nur reingesteckt und wieder rausgezogen habe, oder die USB Verbindung getrennt und wieder verbunden habe.

Vielleicht hat das Masterbrick auch leichte Schwankungen bei der Versorgung der LED?!

Javi, wo genau hast du denn jetzt den Saft der LED abgezwackt? An einem extra Port für ein Bricklet, am gleichen Port wo der Lichtsensor angeschlossen ist oder eine externe Stromquelle?
 

Tiegars

Member
Hallo Tobias,

ich habe ihn am Masterbricklet angeschlossen wie du auch. Ich hatte am Anfang noch Tests gemacht mit einem Powerbricklet der dann an eine externe Stromquelle angeschlossen wurde. Und da ran die Led. Wobei ich nicht glaube das es an dem liegt. Könnte genau so gut am Poti liegen. Die sind ja auch nicht so genau und schwanken auch.
 

ToBe

Member
Hallo Javi,

super Tipp! Ich hatte ja Probleme die LED auf 800 LUX zu regeln. Später ist mir dann aufgefallen (nachdem ich noch mal über deine Bauteileliste geflogen bin), dass ich den 2K-Widerstand vergessen und dafür erst einen 1K-Poti und danach einen 2K-Poti eingebaut habe. Ich habe somit einen 1K Widerstand und einen 2K-Poti eingebaut. Du hast es genau gedreht. Ich könnte mir also gut vorstellen, dass der 2K-Poti nen bisschen ungenauer (mehr schwankt) als der 1K-Poti ist. Denke da könnte ich noch mal angreifen...
 

ToBe

Member
Und hier noch der Code zur Anwendung!

Code:
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());
	}
}
 

ToBe

Member
Nabend!

Also irgendwas ist an dem Bricklet komisch... mit dem BrickViewer habe ich mal die Messungen überprüft. Hatte ja schon geschrieben, dass ich manchmal Unterschiede von ca. 20 LUX habe. Jetzt messe ich meine Probe 10 mal und komme auf entweder ca. 430 oder mal ca. 450 LUX. Wenn ich jetzt z.B. 430 LUX messe, nichts anfasse, und den Rest Button im BrickViewer drücke, wird des Bricklet neugestartet und es werden mir plötzlich 450 LUX angezeigt. Das kann doch nicht sein, oder?
 

Ähnliche Themen

Oben