Mätapplikation med Arduino och Java

Berätta om dina pågående projekt.
Användarvisningsbild
4kTRB
Inlägg: 18287
Blev medlem: 16 augusti 2009, 19:04:48

Re: Mätapplikation med Arduino och Java

Inlägg av 4kTRB »

Buffrade bilder och Canvas fungerar inte riktigt bra så därför
lät jag klassen Graph att utöka från klassen JComponent som
är en lättviktigare komponent.

Det fungerar alldeles förträffligt bra att nu dra i en slider för att
justera en marker. Sedan kan jag finjustera med en spinner.

När jag drar i slidern så ändras värdet i spinnern och tvärt om.
Det är spinnern som har händelsehanteraren och ritar om de
buffrade bilderna med uppdaterade värden för markeringslinjerna
och tillhörande värden som syns, och följer med, linjerna.

På något sätt tänkte jag inkludera en graf i NTC-interfacet så jag måste
då också lösa hur jag ska få axlarna att graderas riktigt beroende på
vilken kurva jag får. Max y-värde ges ju av kurvans formel och max x-värde
av mellan vilka motståndsvärden kurvan ritas.

Kod: Markera allt

import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.Point2D;
import javax.swing.JComponent;

public class Graph extends JComponent {
	private static final long serialVersionUID = 1L;
	public static final int AXIS_MARGIN = 68;			// totala marginalen ovan+under och vänster+höger
	public static final int HALF_AXIS_MARGIN = AXIS_MARGIN/2;
	public static final int X_MARKERS_SPACE = 20;		// antal pixlar mellan varje markör på x-axeln
	public static final int Y_MARKERS_SPACE = 10;		// sätter steglängden hos markörer 
	public static final int MARKER_LENGTH = 1;			// markörernas halva längd
	public static final double SCALEFACTOR_Y = 100.0;	// y-axeln ska visa 100ggr mindre värden än dess längd i pixlar	
	private int jComponentWidth;
	private int jComponentHeight;
	private ImageA imgA;
	private ImageB imgB;
	private static Point2D origo;
	private Graphics2D g;
	private int markerLineX1pos;
	private int markerLineY1pos;
	private int markerLineX2pos;
	private int markerLineY2pos;
	private AlphaComposite compA;
	private AlphaComposite compB;
	private int yAxisStart;
	private int xAxisStart;
	private int xAxisEnd;	
	private int yAxisEnd;
	private String sY1;
	private String sY2;
	private String sX1;
	private String sX2;
	private Font f;
	/*
	 * Konstruktor. Skapar en JComponent med höjd, bredd och placeras
	 * med offset i x- och y-led i den behållare där den ingår.
	 * Buffrade bilder placeras sedan på denna JComponent.
	 */
	public Graph(int offsetX, int offsetY,int width, int height) {
		jComponentWidth = width;
		jComponentHeight = height;
		setBackground(Color.WHITE);
		setBounds(offsetX, offsetY, width, height);
		imgA = new ImageA(jComponentWidth,jComponentHeight,Color.WHITE); 						 // skapa en buffrad bild med x-y-axel
		imgB = new ImageB(jComponentWidth-AXIS_MARGIN,jComponentHeight-AXIS_MARGIN,Color.WHITE); // skapa en buffrad bild med plottad funktion
		markerLineX1pos = markerLineX2pos = (int) origo.getX();
		markerLineY1pos = markerLineY2pos = (int) origo.getY();		
		compA = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 1.0f);	// genomskinlighetsgrad
		compB = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.5f);
		yAxisStart = (int) origo.getY();
		xAxisStart = (int) origo.getX();
		xAxisEnd = jComponentWidth - HALF_AXIS_MARGIN;
		yAxisEnd =  HALF_AXIS_MARGIN;
		sY1 = sX1 = sY2 = sX2 = Double.toString(0.0);						// utgångsläge för markörer X1,Y1,X2,Y2
		f = new Font("SansSerif",Font.BOLD,12);								// text/font markörvärde label
	}
	public void paint(Graphics gr) {
		super.paint(gr);		
		g = (Graphics2D) gr;
		g.setFont(f);
		g.setComposite(compA);
		g.drawImage(imgA, null, 0, 0);									// rita den buffrade bilden							
		g.setComposite(compB);	
		g.drawImage(imgB, null, xAxisStart ,HALF_AXIS_MARGIN);			// rita den buffrade bilden
		drawMarkerLineX1(markerLineX1pos); 								// rita en flyttbar x-markering i JComponent
		drawMarkerLineY1(markerLineY1pos);								// rita en flyttbar y-markering i JComponent
		drawMarkerLineX2(markerLineX2pos); 								// rita en flyttbar x-markering i JComponent
		drawMarkerLineY2(markerLineY2pos);								// rita en flyttbar y-markering i JComponent
		g.dispose();
	}
	/*
	 * Ritar en lodrät markeringslinje i grafen på angiven X1-koordinat.
	 */
	private void drawMarkerLineX1(int x) {
		g.setPaint(Color.BLUE);
		sX1 = Double.toString(x-Graph.HALF_AXIS_MARGIN);
		g.drawString(sX1, x+3, yAxisEnd+10);							// rita en label med aktuellt X1-värde
		g.drawLine(x, HALF_AXIS_MARGIN, x, yAxisStart);
	}
	/*
	 * Ritar en lodrät markeringslinje i grafen på angiven X2-koordinat.
	 */
	private void drawMarkerLineX2(int x) {
		g.setPaint(Color.ORANGE);
		sX2 = Double.toString(x-Graph.HALF_AXIS_MARGIN);
		g.drawString(sX2, x+3, yAxisEnd+21);							// rita en label med aktuellt X2-värde
		g.drawLine(x, HALF_AXIS_MARGIN, x, yAxisStart);
	}
	/*
	 * Ritar en vågrät markeringslinje i grafen på angiven Y1-koordinat.
	 */
	private void drawMarkerLineY1(int y) {
		g.setPaint(Color.BLUE);
		sY1 = Double.toString((yAxisStart-y)/SCALEFACTOR_Y);
		g.drawString(sY1, xAxisEnd-10, y-3);							// rita en label med aktuellt Y1-värde
		g.drawLine(HALF_AXIS_MARGIN, y, xAxisEnd, y);
	}
	/*
	 * Ritar en vågrät markeringslinje i grafen på angiven Y2-koordinat.
	 */
	private void drawMarkerLineY2(int y) {
		g.setPaint(Color.ORANGE);
		sY2 = Double.toString((yAxisStart-y)/SCALEFACTOR_Y);
		g.drawString(sY2, xAxisEnd-35, y-3);							// rita en label med aktuellt Y2-värde
		g.drawLine(HALF_AXIS_MARGIN, y, jComponentWidth - HALF_AXIS_MARGIN, y);
	}
	
	/*
	 * Flyttar/uppdaterar y-koordinaten för den vågräta markeringslinjen Y1
	 * Händelsehanterare i GUI aktiverar denna metod 
	 */
	public void setMarkerLineY1pos(int y) {
		markerLineY1pos= yAxisStart - y;
		repaint();
	}
	/*
	 * Flyttar/uppdaterar y-koordinaten för den vågräta markeringslinjen Y2 
	 * Händelsehanterare i GUI aktiverar denna metod 
	 */
	public void setMarkerLineY2pos(int y) {
		markerLineY2pos= yAxisStart - y;
		repaint();
	}
	/*
	 * Flyttar/uppdaterar x-koordinaten för den lodräta markeringslinjen X1
	 * Händelsehanterare i GUI aktiverar denna metod 
	 */
	public void setMarkerLineX1pos(int x) {
		markerLineX1pos= x + xAxisStart;
		repaint();
	}
	/*
	 * Flyttar/uppdaterar x-koordinaten för den lodräta markeringslinjen X2
	 * Händelsehanterare i GUI aktiverar denna metod 
	 */
	public void setMarkerLineX2pos(int x) {
		markerLineX2pos= x + xAxisStart;
		repaint();
	}

	public static void setOrigo(Point2D origo) {
		Graph.origo = origo;
	}
	public static Point2D getOrigo() {
		return origo;
	}
}

Kod: Markera allt

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.geom.AffineTransform;
import java.awt.geom.Line2D;
import java.awt.geom.Point2D;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
/*
 * Skapar en buffrad bild som ligger i botten av ett lager med flera bilder.
 * Bilden består av en färgad rektangel som det går att rita i.
 * Denna basbild innehåller en skalad x- och y-axel.
 */
public class ImageA extends BufferedImage {
	private Graphics2D g;
	private Rectangle2D rek;
	private int jComponentWidth;
	private int jComponentHeight;
	private int xAxisLength;
	private int yAxisLength;
	private int xAxisStart;
	private int xAxisEnd;
	private int yAxisStart;
	private int yAxisEnd;
	private Point2D xEnd;
	private Point2D yEnd;
	private Point2D origo;
	private int numberOfxMarkers;
	private int numberOfyMarkers;
	public ImageA(int width, int height, Color color) {
		super(width, height, BufferedImage.TYPE_INT_ARGB);
		jComponentWidth = width;
		jComponentHeight = height;		
		g = this.createGraphics();
		g.setStroke(new BasicStroke(1.0f));
		rek = new Rectangle2D.Double(0,0,width,height);
		g.setPaint(color);
		g.fill(rek);
		g.draw(rek);
		g.setPaint(Color.BLACK);
		drawAxis();
		drawMarkers();
		g.dispose();
	}
	/*
	 * Ritar markeringar med jämna mellanrum på de båda axlarna.
	 * 
	 */
	private void drawMarkers() {
		numberOfxMarkers = xAxisLength/Graph.X_MARKERS_SPACE;
		numberOfyMarkers = yAxisLength/Graph.Y_MARKERS_SPACE;
		int dx = xAxisLength/numberOfxMarkers;
		int dy = yAxisLength/numberOfyMarkers;
		int xs = xAxisStart;
		int xe = xAxisEnd;
		int ys = yAxisStart;
		int ye = yAxisEnd;
		Font font = new Font("SansSerif", Font.PLAIN, 14);
		AffineTransform affineTransform = new AffineTransform();
		affineTransform.rotate(Math.toRadians(90), 0, 0);		
		Font rotatedFont = font.deriveFont(affineTransform);
		g.setFont(rotatedFont);
		for(int i=xs;i<=xe;i+=dx) {		// börja rita x-markörer från origo
			drawXMarker(i,(i-xs));
		}
		font = new Font("SansSerif", Font.PLAIN, 11);
		affineTransform = new AffineTransform();
		affineTransform.rotate(Math.toRadians(0), 0, 0);		
		rotatedFont = font.deriveFont(affineTransform);
		g.setFont(rotatedFont);
		for(int i=ys;i>=ye;i-=dy) {		// börja rita y-markörer från origo
			drawYMarker(i,(ys-i)/Graph.SCALEFACTOR_Y);
		}
	}
	/*
	 * Ritar markörer utmed x-axeln på de positioner som anges av
	 * parametern xpos.
	 */
	private void drawXMarker(int xpos,double scaleNumber) {
		String s = String.valueOf((int)scaleNumber);
		Point xm1 = new Point(xpos,(int)origo.getY()+Graph.MARKER_LENGTH);
		Point xm2 = new Point(xpos,(int)origo.getY()-Graph.MARKER_LENGTH);
		Line2D.Double marker = new Line2D.Double(xm1,xm2);
		g.draw(marker);
		drawXScale(s,xpos-3,(int)(origo.getY()+5));
	}
	/*
	 * Ritar markörer utmed y-axeln på de positioner som anges av
	 * parametern ypos.
	 */
	private void drawYMarker(int ypos, double scaleNumber) {
		String s = String.valueOf(scaleNumber);
		Point ym1 = new Point((int)origo.getX()-Graph.MARKER_LENGTH,ypos);
		Point ym2 = new Point((int)origo.getX()+Graph.MARKER_LENGTH,ypos);
		Line2D.Double marker = new Line2D.Double(ym1,ym2);
		g.draw(marker);
		drawYScale(s,(int)(origo.getX()),ypos);
	}
	/*
	 * Graderar x-axeln med tal 
	 */
	private void drawXScale(String s, int xpos, int ypos) {	
		g.setPaint(Color.BLUE);
		g.drawString(s, xpos-1, ypos+1);
	}
	/*
	 * Graderar y-axeln med tal
	 */
	private void drawYScale(String s, int xpos, int ypos) {	
		g.setPaint(Color.RED);
		g.drawString(s, xpos-20, ypos+3);
	}
	/*
	 * Ritar de två axlarna med origo i sydväst.
	 * Axlarnas längd i pixlar begränsas av JComponent:ens höjd och bredd och
	 * den valda marginalen från dess ytterkanter till där axlarna ritas.
	 */
	private void drawAxis() {
		xAxisLength = jComponentWidth - Graph.AXIS_MARGIN;				
		yAxisLength = jComponentHeight- Graph.AXIS_MARGIN;				
		xAxisStart = jComponentWidth - xAxisLength - Graph.HALF_AXIS_MARGIN; 	
		yAxisEnd = jComponentHeight - yAxisLength - Graph.HALF_AXIS_MARGIN;											
		yAxisStart = jComponentHeight - Graph.HALF_AXIS_MARGIN;		
		xAxisEnd = xAxisLength + xAxisStart;
		Graph.setOrigo(new Point(xAxisStart,yAxisStart));
		origo = Graph.getOrigo();
		xEnd = new Point(xAxisEnd,yAxisStart);
		yEnd = new Point(xAxisStart,yAxisEnd);
		Line2D.Double xAxel = new Line2D.Double(origo,xEnd);
		Line2D.Double yAxel = new Line2D.Double(origo, yEnd);
		g.draw(xAxel);
		g.draw(yAxel);
	}
}

Kod: Markera allt

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.geom.Point2D;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
/*
 * Skapar en buffrad bild.
 * Bilden består av en färgad rektangel som det går att rita i.
 * Denna bild innehåller en plottad kurva.
 */
public class ImageB extends BufferedImage {
	private Graphics2D g;
	private Rectangle2D rek;
	private Point2D origo;
	public ImageB(int width, int height, Color color) {
		super(width, height, BufferedImage.TYPE_INT_ARGB);
		origo = Graph.getOrigo();
		g = this.createGraphics();
		g.setStroke(new BasicStroke(1.0f));
		rek = new Rectangle2D.Double(0,0,width,height);
		g.setPaint(color);
		g.fill(rek);	
		g.draw(rek);
		g.setPaint(Color.BLACK);
		plotFunction(SwingWindow.A,SwingWindow.B,SwingWindow.C);		// funktionskonstanter hämtas från main-klassen
		g.dispose();
	}
	/*
	 * Ritar en funktion y(x) i x-y-grafen. y(x) = a + bx + cx^2 
	 * y = 2.31 - 0.0047*R + 1.93*10^-6*R^2
	 * 
	 */
	private void plotFunction(double a, double b, double c) {
		double x1 = 0;
		double y1 = 0;
		double x2 = 0;
		double y2 = 0;	
		while(y2>=0) {		
			y2 = (a + b*x2 + c*Math.pow(x2, 2))*100;
			g.drawLine(x(x1), y(y1), x(x2), y(y2));
			x1 = x2;
			y1 = y2;
			x2 = x2+1;
		}
	}
	/*
	 * Parametern x refererar till en x-koordinat med ett origo som har x=0 och y=0
	 * Returnerar den absoluta x-koordinaten i förhållande till det origo
	 * som ritats i canvas med de faktiska x- och y-koordinaterna.
	 */
	private int x(double x) {
		return (int)(origo.getX()+x-Graph.AXIS_MARGIN/2);
	}
	/*
	 * Parametern y refererar till en y-koordinat med ett origo som har x=0 och y=0
	 * Returnerar den absoluta y-koordinaten i förhållande till det origo
	 * som ritats i canvas med de faktiska x- och y-koordinaterna.
	 */
	private int y(double y) {
		return (int)(origo.getY()-y-Graph.AXIS_MARGIN/2);
	}

}

Kod: Markera allt

import javax.swing.JFrame;
import java.awt.SystemColor;
import javax.swing.JButton;
import javax.swing.Box;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.EventQueue;
import javax.swing.JSpinner;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.event.ChangeListener;
import javax.swing.event.ChangeEvent;
import java.awt.Color;
import javax.swing.SpringLayout;
import javax.swing.SpinnerNumberModel;
import javax.swing.JSlider;

public class SwingWindow extends JFrame {
	
	private static final long serialVersionUID = 1L;
	public final int WINDOW_WIDTH = 800;
	public final int WINDOW_HEIGHT = 520;
	public static final int JC_WIDTH = 772;
	public static final int JC_HEIGHT = 365;
	public final int SPINNER_X_STARTVALUE = 0;
	public final int SPINNER_Y_STARTVALUE = 0;
	// y = 2.31 - 0.0047*x + 1.93*10^-6*x^2
	public static final double A = 2.31;
	public static final double B = -0.0047;
	public static final double C = 0.00000193;
	private static JButton b0;
	private static JButton b1;
	private static JButton b2;
	private static JSpinner spinner_X1;
	private static JSpinner spinner_Y1;
	private static JSpinner spinner_X2;
	private static JSpinner spinner_Y2;
	private static int spinner_X1_value;
	private static int spinner_Y1_value;
	private static int spinner_X2_value;
	private static int spinner_Y2_value;

	private JSlider sliderX1;
	private JSlider sliderY1;
	private JSlider sliderX2;
	private JSlider sliderY2;

	private Graph graph;
	public static SwingWindow swingwindow;
	private Box horizontalBox;
	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		//swingwindow = new SwingWindow();
		//swingwindow.setVisible(true);
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					swingwindow = new SwingWindow();
					swingwindow.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		}); 	
	}

	/**
	 * Create the application.
	 */
	public SwingWindow() {
		super("Swing");	
		setMaximumSize(new Dimension(1000, 800));
		getContentPane().setBackground(new Color(240, 230, 140));
		getContentPane().setLayout(null);
		setBounds(400, 100, WINDOW_WIDTH, WINDOW_HEIGHT);
		setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);	
		setUpGUI();
	}
	/**
	 * Initialize the contents of the frame.
	 */
	private void setUpGUI() {		
		JPanel panel = new JPanel();
		panel.setBackground(SystemColor.menu);
		panel.setBounds(5, 376, 772, 100);
		getContentPane().add(panel);
		SpringLayout sl_panel = new SpringLayout();
		panel.setLayout(sl_panel);
		
		Box horizontalBox_1 = Box.createHorizontalBox();
		sl_panel.putConstraint(SpringLayout.WEST, horizontalBox_1, 10, SpringLayout.WEST, panel);
		sl_panel.putConstraint(SpringLayout.EAST, horizontalBox_1, -10, SpringLayout.EAST, panel);
		horizontalBox_1.setOpaque(true);
		sl_panel.putConstraint(SpringLayout.NORTH, horizontalBox_1, 11, SpringLayout.NORTH, panel);
		panel.add(horizontalBox_1);
		
		JLabel lblYMarker = new JLabel("Y1 marker");
		horizontalBox_1.add(lblYMarker);
		
		Component rigidArea = Box.createRigidArea(new Dimension(20, 20));
		rigidArea.setMinimumSize(new Dimension(15, 20));
		rigidArea.setPreferredSize(new Dimension(15, 20));
		rigidArea.setMaximumSize(new Dimension(15, 20));
		horizontalBox_1.add(rigidArea);
		
		spinner_Y1 = new JSpinner();
		spinner_Y1.setValue(0);
		spinner_Y1.setDoubleBuffered(true);
		spinner_Y1.setMinimumSize(new Dimension(15, 20));
		spinner_Y1.setPreferredSize(new Dimension(15, 20));
		spinner_Y1.addChangeListener(new ChangeListener() {
			public void stateChanged(ChangeEvent e) {
				spinner_Y1_value = (int) spinner_Y1.getValue();
				sliderY1.setValue(spinner_Y1_value);
				graph.setMarkerLineY1pos(spinner_Y1_value);
			}
		}); 
		horizontalBox_1.add(spinner_Y1);
		
		Component rigidArea_5 = Box.createRigidArea(new Dimension(20, 20));
		rigidArea_5.setMinimumSize(new Dimension(15, 20));
		rigidArea_5.setPreferredSize(new Dimension(15, 20));
		rigidArea_5.setMaximumSize(new Dimension(15, 20));
		horizontalBox_1.add(rigidArea_5);
		
		JLabel lblXMarker = new JLabel("X1 marker");
		horizontalBox_1.add(lblXMarker);
		
		Component rigidArea_1 = Box.createRigidArea(new Dimension(20, 20));
		rigidArea_1.setMinimumSize(new Dimension(15, 20));
		rigidArea_1.setPreferredSize(new Dimension(15, 20));
		rigidArea_1.setMaximumSize(new Dimension(15, 20));
		horizontalBox_1.add(rigidArea_1);
		
		spinner_X1 = new JSpinner();
		spinner_X1.setModel(new SpinnerNumberModel(0, 0, 700, 1));
		spinner_X1.setValue(0);
		spinner_X1.setDoubleBuffered(true);
		spinner_X1.setMinimumSize(new Dimension(15, 20));
		spinner_X1.setPreferredSize(new Dimension(15, 20));
		spinner_X1.addChangeListener(new ChangeListener() {
			public void stateChanged(ChangeEvent e) {
				spinner_X1_value = (int) spinner_X1.getValue();
				sliderX1.setValue(spinner_X1_value);
				graph.setMarkerLineX1pos(spinner_X1_value);
			}
		});
		horizontalBox_1.add(spinner_X1);
		
		Component rigidArea_8 = Box.createRigidArea(new Dimension(20, 20));
		rigidArea_8.setMinimumSize(new Dimension(15, 20));
		rigidArea_8.setPreferredSize(new Dimension(15, 20));
		rigidArea_8.setMaximumSize(new Dimension(15, 20));
		horizontalBox_1.add(rigidArea_8);
		
		JLabel lblXMarker_1 = new JLabel("Y2 marker");
		horizontalBox_1.add(lblXMarker_1);
		
		Component rigidArea_6 = Box.createRigidArea(new Dimension(20, 20));
		rigidArea_6.setMinimumSize(new Dimension(15, 20));
		rigidArea_6.setPreferredSize(new Dimension(15, 20));
		rigidArea_6.setMaximumSize(new Dimension(15, 20));
		horizontalBox_1.add(rigidArea_6);
		
		spinner_Y2 = new JSpinner();
		spinner_Y2.addChangeListener(new ChangeListener() {
			public void stateChanged(ChangeEvent e) {
				spinner_Y2_value = (int) spinner_Y2.getValue();
				sliderY2.setValue(spinner_Y2_value);
				graph.setMarkerLineY2pos(spinner_Y2_value);
			}
		});
		spinner_Y2.setDoubleBuffered(true);
		spinner_Y2.setMinimumSize(new Dimension(15, 20));
		spinner_Y2.setPreferredSize(new Dimension(15, 20));
		horizontalBox_1.add(spinner_Y2);
		
		Component rigidArea_7 = Box.createRigidArea(new Dimension(20, 20));
		rigidArea_7.setMinimumSize(new Dimension(15, 20));
		rigidArea_7.setPreferredSize(new Dimension(15, 20));
		rigidArea_7.setMaximumSize(new Dimension(15, 20));
		horizontalBox_1.add(rigidArea_7);
		
		JLabel lblXMarker_2 = new JLabel("X2 marker");
		horizontalBox_1.add(lblXMarker_2);
		
		Component rigidArea_9 = Box.createRigidArea(new Dimension(20, 20));
		rigidArea_9.setMinimumSize(new Dimension(15, 20));
		rigidArea_9.setPreferredSize(new Dimension(15, 20));
		rigidArea_9.setMaximumSize(new Dimension(15, 20));
		horizontalBox_1.add(rigidArea_9);
		
		spinner_X2 = new JSpinner();
		spinner_X2.addChangeListener(new ChangeListener() {
			public void stateChanged(ChangeEvent e) {
				spinner_X2_value = (int) spinner_X2.getValue();
				sliderX2.setValue(spinner_X2_value);
				graph.setMarkerLineX2pos(spinner_X2_value);
			}
		});
		spinner_X2.setDoubleBuffered(true);
		spinner_X2.setPreferredSize(new Dimension(15, 20));
		spinner_X2.setMinimumSize(new Dimension(15, 20));
		horizontalBox_1.add(spinner_X2);
		horizontalBox = Box.createHorizontalBox();
		sl_panel.putConstraint(SpringLayout.WEST, horizontalBox, 0, SpringLayout.WEST, horizontalBox_1);
		sl_panel.putConstraint(SpringLayout.EAST, horizontalBox, -10, SpringLayout.EAST, panel);
		panel.add(horizontalBox);
		
		b0 = new JButton("Plotta Kurva");
		b0.setDoubleBuffered(true);
		b0.setPreferredSize(new Dimension(130, 23));
		b0.setMaximumSize(new Dimension(130, 23));
		b0.addActionListener(new Listener().new PlotFunction());
		
		Component horizontalGlue = Box.createHorizontalGlue();
		horizontalBox.add(horizontalGlue);
		horizontalBox.add(b0);
		
		Component rigidArea_2 = Box.createRigidArea(new Dimension(20, 20));
		rigidArea_2.setMaximumSize(new Dimension(22, 20));
		rigidArea_2.setMinimumSize(new Dimension(22, 20));
		rigidArea_2.setPreferredSize(new Dimension(30, 20));
		horizontalBox.add(rigidArea_2);
		
		b1 = new JButton("Radera Kurva");
		b1.setDoubleBuffered(true);
		b1.setPreferredSize(new Dimension(130, 23));
		b1.setMaximumSize(new Dimension(130, 23));
		b1.addActionListener(new Listener().new Repaint());
		horizontalBox.add(b1);
		
		Component rigidArea_3 = Box.createRigidArea(new Dimension(20, 20));
		rigidArea_3.setMaximumSize(new Dimension(22, 20));
		rigidArea_3.setMinimumSize(new Dimension(22, 20));
		rigidArea_3.setPreferredSize(new Dimension(30, 20));
		horizontalBox.add(rigidArea_3);
		
		b2 = new JButton("------------");
		b2.setDoubleBuffered(true);
		b2.setPreferredSize(new Dimension(130, 23));
		b2.setMaximumSize(new Dimension(130, 23));
		// b2.addActionListener(new Listener().new Render());
		horizontalBox.add(b2);
		
		JButton b3 = new JButton("Avsluta");
		b3.setDoubleBuffered(true);
		b3.setMinimumSize(new Dimension(72, 23));
		b3.setPreferredSize(new Dimension(130, 23));
		b3.setMaximumSize(new Dimension(130, 23));
		b3.addActionListener(new Listener().new Avbryt());
		
		Component rigidArea_4 = Box.createRigidArea(new Dimension(20, 20));
		rigidArea_4.setMaximumSize(new Dimension(22, 20));
		rigidArea_4.setMinimumSize(new Dimension(22, 20));
		rigidArea_4.setPreferredSize(new Dimension(30, 20));
		horizontalBox.add(rigidArea_4);
		horizontalBox.add(b3);
		
		Component horizontalGlue_1 = Box.createHorizontalGlue();
		horizontalBox.add(horizontalGlue_1);
		
		Box horizontalBox_2 = Box.createHorizontalBox();
		sl_panel.putConstraint(SpringLayout.NORTH, horizontalBox, 6, SpringLayout.SOUTH, horizontalBox_2);
		sl_panel.putConstraint(SpringLayout.NORTH, horizontalBox_2, 6, SpringLayout.SOUTH, horizontalBox_1);
		sl_panel.putConstraint(SpringLayout.WEST, horizontalBox_2, 0, SpringLayout.WEST, horizontalBox_1);
		sl_panel.putConstraint(SpringLayout.EAST, horizontalBox_2, 0, SpringLayout.EAST, horizontalBox_1);
		panel.add(horizontalBox_2);
		
		sliderY1 = new JSlider();
		sliderY1.setPreferredSize(new Dimension(220, 26));
		sliderY1.setMajorTickSpacing(1);
		sliderY1.setMaximum(298);
		sliderY1.addChangeListener(new ChangeListener() {
			public void stateChanged(ChangeEvent e) {
				int value = sliderY1.getValue();
				spinner_Y1.setValue(value);				
			}
		});
		sliderY1.setBackground(SystemColor.menu);
		sliderY1.setValue(0);
		sliderY1.setForeground(Color.WHITE);
		horizontalBox_2.add(sliderY1);
		
		sliderX1 = new JSlider();
		sliderX1.setPreferredSize(new Dimension(220, 26));
		sliderX1.setMajorTickSpacing(1);
		sliderX1.setMaximum(700);
		sliderX1.setValue(0);
		sliderX1.addChangeListener(new ChangeListener() {
			public void stateChanged(ChangeEvent e) {
				int value = sliderX1.getValue();
				spinner_X1.setValue(value);
			}
		});
		
		Component rigidArea_10 = Box.createRigidArea(new Dimension(20, 20));
		rigidArea_10.setPreferredSize(new Dimension(15, 20));
		rigidArea_10.setMinimumSize(new Dimension(15, 20));
		rigidArea_10.setMaximumSize(new Dimension(15, 20));
		horizontalBox_2.add(rigidArea_10);
		
		sliderX1.setForeground(Color.WHITE);
		horizontalBox_2.add(sliderX1);
		
		Component rigidArea_11 = Box.createRigidArea(new Dimension(20, 20));
		rigidArea_11.setPreferredSize(new Dimension(15, 20));
		rigidArea_11.setMinimumSize(new Dimension(15, 20));
		rigidArea_11.setMaximumSize(new Dimension(15, 20));
		horizontalBox_2.add(rigidArea_11);
		
		sliderY2 = new JSlider();
		sliderY2.setMinorTickSpacing(1);
		sliderY2.setMajorTickSpacing(1);
		sliderY2.setMaximum(298);
		sliderY2.setValue(0);
		sliderY2.addChangeListener(new ChangeListener() {
			public void stateChanged(ChangeEvent e) {
				int value = sliderY2.getValue();
				spinner_Y2.setValue(value);
			}
		});
		sliderY2.setPreferredSize(new Dimension(220, 26));
		sliderY2.setForeground(Color.WHITE);
		horizontalBox_2.add(sliderY2);
		
		Component rigidArea_12 = Box.createRigidArea(new Dimension(20, 20));
		rigidArea_12.setPreferredSize(new Dimension(15, 20));
		rigidArea_12.setMinimumSize(new Dimension(15, 20));
		rigidArea_12.setMaximumSize(new Dimension(15, 20));
		horizontalBox_2.add(rigidArea_12);
		
		sliderX2 = new JSlider();
		sliderX2.setMinorTickSpacing(1);
		sliderX2.setMajorTickSpacing(1);
		sliderX2.setMaximum(700);
		sliderX2.setValue(0);
		sliderX2.addChangeListener(new ChangeListener() {
			public void stateChanged(ChangeEvent e) {
				int value = sliderX2.getValue();
				spinner_X2.setValue(value);
			}
		});
		sliderX2.setPreferredSize(new Dimension(220, 26));
		sliderX2.setSnapToTicks(true);
		sliderX2.setForeground(Color.WHITE);
		horizontalBox_2.add(sliderX2);
		graph =  new Graph(5,5,JC_WIDTH,JC_HEIGHT);
		getContentPane().add(graph);		
	}
}
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Användarvisningsbild
4kTRB
Inlägg: 18287
Blev medlem: 16 augusti 2009, 19:04:48

Re: Mätapplikation med Arduino och Java

Inlägg av 4kTRB »

Gjorde det lättare för mig och inhandlade en
Adafruit PT100 RTD Temperature Sensor Amplifier - MAX31865

Så nu ska jag lära mig programmera den och SPI dessutom.
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Senast redigerad av 4kTRB 28 februari 2020, 19:01:35, redigerad totalt 1 gång.
Användarvisningsbild
4kTRB
Inlägg: 18287
Blev medlem: 16 augusti 2009, 19:04:48

Re: Mätapplikation med Arduino och Java

Inlägg av 4kTRB »

Har nu lyckats att mäta med MAX31865 kortet efter diverse
inställningar i Eclipse för att det skulle bli rätt med <SPI.h>
och <Adafruit_MAX31865.h>. Det går bra att ha dessa lokalt
i mappen med programkoden om man bara ser till att ändra
till "SPI.h" och "Adafruit_MAX31865.h" på rätt ställen men det behövs inte
om man talar om för Eclipse att de finns i .arduinocdt mappen.

Anslöt en trimpot som en 2-tråds RTD och kör exemplet från Adafruit.
Användarvisningsbild
4kTRB
Inlägg: 18287
Blev medlem: 16 augusti 2009, 19:04:48

Re: Mätapplikation med Arduino och Java

Inlägg av 4kTRB »

Har tagit en paus med projektet och det senaste jag gjort var att jag städade upp i koden ordentligt. När jag labbar med kod så kommer jag på nya enklare lösningar och lägger till det och rensar inte alltid bort den gamla koden, sånt som är onödigt. Sedan har jag testat en simulerad datainsamling med vridpotentiometrar för NTC och temperatur och det fungerar som tänkt.

Jag är i alla fall fast besluten att ha ett fungerande NTC-mätinstrument på labbänken framöver. Det återstår trots allt inte särskilt mycket för att det ska bli verklighet. Tänkte mig en låda med usb och anslutningsanordning för NTC brevid ett värmeelement.
Användarvisningsbild
4kTRB
Inlägg: 18287
Blev medlem: 16 augusti 2009, 19:04:48

Re: Mätapplikation med Arduino och Java

Inlägg av 4kTRB »

Äntligen kan jag börja där jag slutade i höstas.

Köpte hem en RTD-sensor från electrokit som jag nu ser fram emot att ansluta till MAX-kortet.

Var tvungen att inhandla ny dator då min Toshiba var svår att få ordning på, den har varit med mig i många år nu.
Har nu en modernare HP med i5 och 16GB ram och ssd-disk. 17 tum skärm dessutom.

Det blir lättare med större skärm när jag använder Windowbuilder i Eclipse, https://www.eclipse.org/windowbuilder/
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Användarvisningsbild
4kTRB
Inlägg: 18287
Blev medlem: 16 augusti 2009, 19:04:48

Re: Mätapplikation med Arduino och Java

Inlägg av 4kTRB »

Var inne på att inhandla ett, ganska så platt, effefektmotstånd från Arcol och ELFA (platta gröna saker), de ska ju kunna klara 250 grader,
och montera på en aluminiumbit. Fast jag blir i nuläget lite osäker på om det verkligen går att komma upp i den tempen för då
måste det ju kylas med kanske en fläkt och pålagd effekt måste kanske sänkas?

Så jag funderade på om jag kunde inhandla en billig lödpenna och utforma alustycket som en klämma och montera lödpennan där.
Den tål ju värme bra och jag skulle lätt kunna ansluta den till en vanlig dimmer.
Användarvisningsbild
4kTRB
Inlägg: 18287
Blev medlem: 16 augusti 2009, 19:04:48

Re: Mätapplikation med Arduino och Java

Inlägg av 4kTRB »

Borrade ett 10mm hål i en kylfläns och köpte en billig lödpenna från Jula (hade fått
1 stjärna av kritikerna). Lödpennan visade sig passa 100% i hålet (hur kan detta vara?)

Inte nog med detta, lödspetsens hål på 4mm passade perfekt till sensorn.

Nu kommer jag nog borra ett hål i alubiten en bit från lödpennan och därintill montera test-
objektet, NTC-motståndet, fast jag vet inte vad som blir bra riktigt än.

Testprogrammet visar drygt 300 grader och jag ska eventuellt använda en dimmer till
lödkolven för att sänka tempen plus att uppvärmningen blir långsammare.
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Användarvisningsbild
4kTRB
Inlägg: 18287
Blev medlem: 16 augusti 2009, 19:04:48

Re: Mätapplikation med Arduino och Java

Inlägg av 4kTRB »

Nu har lödpennan varit på en timme och nu visar det 358 grader!!

Vart ska detta sluta?
Användarvisningsbild
4kTRB
Inlägg: 18287
Blev medlem: 16 augusti 2009, 19:04:48

Re: Mätapplikation med Arduino och Java

Inlägg av 4kTRB »

361 grader
:)
Användarvisningsbild
4kTRB
Inlägg: 18287
Blev medlem: 16 augusti 2009, 19:04:48

Re: Mätapplikation med Arduino och Java

Inlägg av 4kTRB »

367
Användarvisningsbild
4kTRB
Inlägg: 18287
Blev medlem: 16 augusti 2009, 19:04:48

Re: Mätapplikation med Arduino och Java

Inlägg av 4kTRB »

366
=(
Användarvisningsbild
4kTRB
Inlägg: 18287
Blev medlem: 16 augusti 2009, 19:04:48

Re: Mätapplikation med Arduino och Java

Inlägg av 4kTRB »

Borrade ett hål i kylflänsen någon cm från kolven för RTD och ett strax
intill för NTC.

Testade att värma till 150 grader, kylfänsen är lite för stor, det går lite väl långsamt
de sista 25 graderna, den är inte isolerad vilket nog varit bättre.

Hur som helst fick jag mätvärden Temp/NTC. Jag har kodat så värden inte ska sparas
på fil förrens temperaturen skiftar 1 grad.

Det fungerar men jag hade inte räknat med att temperaturmätningen skulle vippa lite fram och tillbaka.
Som syns så hände det ibland. Så där får jag justera koden. Sedan hade jag inte haft något emot en
tidsangivelse vid varje nytt värde så det får jag ordna till.
24 611
25 599
26 582
25 580
26 580
27 563
26 561
27 561
28 543
29 523
30 503
31 486
32 467
33 449
34 432
35 416
36 401
37 387
38 373
39 359
38 359
39 359
40 347
39 347
40 346
39 346
40 344
41 334
40 332
41 332
42 322
41 322
42 321
43 310
42 309
43 309
42 309
43 309
42 309
43 308
44 299
45 289
44 289
45 288
46 279
45 279
46 278
47 267
48 260
49 251
50 243
51 235
52 226
53 218
54 211
55 205
56 197
57 190
58 184
57 184
58 184
59 179
58 177
59 177
60 172
61 166
62 162
61 161
62 161
63 157
62 156
63 157
62 157
63 156
64 152
65 146
66 142
67 137
68 133
69 130
70 126
69 125
70 125
71 121
70 121
71 121
72 117
71 117
72 117
73 114
72 114
73 114
72 114
73 114
72 114
73 114
74 110
73 110
74 110
73 110
74 110
73 110
74 110
75 106
74 106
75 106
74 106
75 106
76 103
75 103
76 103
77 100
76 99
77 100
76 100
77 100
76 100
77 100
76 99
77 99
78 97
77 97
78 97
77 97
78 97
77 97
78 97
77 97
78 97
79 94
78 94
79 94
78 93
79 94
80 91
79 91
80 91
79 91
80 91
79 91
80 91
79 91
80 91
81 87
80 87
81 87
80 87
81 87
80 87
81 87
80 87
81 87
80 87
81 87
80 87
81 87
82 85
81 83
82 85
81 83
82 83
81 83
82 85
81 85
82 83
81 85
82 83
81 83
82 83
81 85
82 85
81 85
82 85
81 83
82 83
83 81
84 80
85 77
86 75
87 73
88 72
89 69
90 67
91 66
92 63
93 62
94 60
95 57
96 56
97 55
98 53
99 52
100 50
101 48
102 47
103 46
104 45
105 44
106 42
107 41
108 40
109 39
110 38
111 37
112 35
113 34
114 33
115 32
114 32
115 32
116 31
117 30
118 30
119 29
120 29
121 27
122 26
123 26
124 25
125 25
126 24
127 24
128 23
129 23
130 22
131 22
132 21
131 22
132 21
133 21
134 19
133 19
134 19
135 19
136 19
137 18
136 18
137 18
138 18
137 18
138 18
137 18
138 18
139 18
138 18
139 18
138 17
139 18
140 17
141 17
142 17
143 16
142 16
143 16
142 16
143 16
144 16
143 16
144 16
145 16
146 15
147 15
146 15
147 15
146 15
147 15
146 15
147 15
148 15
147 15
148 15
147 15
148 15
147 15
148 15
147 15
148 15
149 15
148 15
149 15
148 15
149 15
148 15
149 15
150 14
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Användarvisningsbild
4kTRB
Inlägg: 18287
Blev medlem: 16 augusti 2009, 19:04:48

Re: Mätapplikation med Arduino och Java

Inlägg av 4kTRB »

En del värden ser lite mysko ut.
Sensorn och NTC-motståndet har säkert olika tidskonstant
plus att det kan vara något mer som påverkar.
Användarvisningsbild
4kTRB
Inlägg: 18287
Blev medlem: 16 augusti 2009, 19:04:48

Re: Mätapplikation med Arduino och Java

Inlägg av 4kTRB »

Redigerade koden och nu fås ett och endast ett nytt värde
på NTC-motståndet för varje 1 grad ökning i temperatur.

Varför jag fick andra värden på NTC-resistansen vet jag inte,
NTC kanske kräver en viss "burn-in" som det så ofta talas om
när det gäller hifi-pedofilernas virgina ic-kretsar?

Ska försöka ta fram en kurva NTC(temp) så man ser hur den ser ut.
24 465
25 465
26 457
27 446
28 432
29 421
30 408
31 394
32 382
33 370
34 358
35 344
36 334
37 322
38 310
39 300
40 290
41 281
42 271
43 262
44 253
45 245
46 237
47 230
48 222
49 214
50 207
51 199
52 193
53 188
54 181
55 176
56 170
57 165
58 158
59 156
60 151
61 146
62 141
63 137
64 132
65 128
66 125
67 121
68 117
69 114
70 110
71 106
72 104
73 101
74 99
75 95
76 93
77 91
78 87
79 87
80 82
81 81
82 77
83 76
84 74
85 72
86 69
87 67
88 64
89 63
90 62
91 60
92 57
93 56
94 54
95 53
96 50
97 49
98 48
99 47
100 46
101 45
102 44
103 44
104 41
105 41
106 39
107 38
108 37
109 37
110 35
111 34
112 34
113 33
114 32
115 31
116 30
117 31
118 29
119 27
120 27
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Användarvisningsbild
4kTRB
Inlägg: 18287
Blev medlem: 16 augusti 2009, 19:04:48

Re: Mätapplikation med Arduino och Java

Inlägg av 4kTRB »

Jag ska försöka klämma in bryggan och MAX31865-kortet på ett plug-in-shield som
går att plugga in direkt ovanpå Arduino UNO R3. Det borde gå att få till en liten
kompakt låda med värmeelement och Arduino att ansluta till datorn via USB.
Skriv svar