Archivio mensile:Febbraio 2014

JGuida

JGuidaRealizzare il pannello grafico JGuida di larghezza 201px ed altezza 101px rappresentato in figura a destra.
La posizione orizzontale del mouse serve a fornire il valore della sterzata dell’NXT (da -100 a +100), la posizione verticale la velocità del motore (da 0 a 100, dal basso verso l’alto)

Soluzione

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;

import javax.swing.JComponent;

public class JGuida extends JComponent {

	private int speed, steer;

	private class MouseMotionListener extends MouseMotionAdapter {
		@Override
		public void mouseMoved(MouseEvent e) {
			steer = e.getX() - 100;
			speed = 100 - e.getY();
		}
	}

	public JGuida() {
		setPreferredSize(new Dimension(201, 101));
		speed = 0;
		steer = 0;
		addMouseMotionListener(new MouseMotionListener());
	}

	@Override
	public void paintComponent(Graphics g) {
		g.setColor(Color.WHITE);
		g.fillRect(0, 0, 201, 101);
		g.setColor(Color.GRAY);
		for (int i = 10; i <= 90; i += 10)
			g.drawLine(0, i, 200, i);
		for (int i = 10; i <= 190; i += 10)
			g.drawLine(i, 0, i, 100);
		g.setColor(Color.BLACK);
		g.drawRect(0, 0, 200, 100);
		g.drawLine(100, 0, 100, 100);
		g.setFont(new Font("Arial", Font.BOLD, 18));
		g.setColor(Color.BLUE);
		g.drawString("Sinistra", 20, 95);
		g.setColor(Color.RED);
		g.drawString("Destra", 120, 95);
		g.setColor(Color.ORANGE);
		g.drawString("Motore", 70, 25);
	}

	public int getSpeed() {
		return speed;
	}

	public int getSteer() {
		return steer;
	}

}

Rivelatore di Radon

Realizzare un programma per l’NXT che simuli il funzionamento di un sistema per il controllo del livello di Radon in un edificio. Utilizzare il sensore di luce per simulare il rivelatore di Radon.
Creare un ascoltatore di evento connesso con il sensore di luce che visualizza sul display dell’NXT il valore letto ad intervalli di 10 secondi.
Creare un altro ascoltatore di evento connesso con i tasti Destra/Sinistra dell’NXT che serve per aumentare o diminuire il valore di soglia, che deve anch’esso essere visualizzato sul display.
Quando il valore misurato dal sensore supera la soglia prefissata deve essere azionato un ventilatore (motore A dell’NXT); quando il valore misurato scende al di sotto della soglia il ventilatore deve essere fermato.
Utilizzare il tasto ESCAPE per far terminare il programma.

Soluzione

package rivelatoreradon;

import lejos.nxt.Button;
import lejos.nxt.ButtonListener;
import lejos.nxt.LCD;
import lejos.nxt.LightSensor;
import lejos.nxt.Motor;
import lejos.nxt.SensorPort;
import lejos.nxt.SensorPortListener;
import lejos.util.Delay;

public class RivelatoreRadon {

	LightSensor light;
	private int soglia;

	class LeftButtonListener implements ButtonListener {

		@Override
		public void buttonPressed(Button b) {
			soglia--;
			LCD.drawString(soglia + "  ", 0, 4);
		}

		@Override
		public void buttonReleased(Button b) {
		}

	}

	class RightButtonListener implements ButtonListener {

		@Override
		public void buttonPressed(Button b) {
			soglia++;
			LCD.drawString(soglia + "  ", 0, 4);
		}

		@Override
		public void buttonReleased(Button b) {
		}

	}

	class LightSensorPortListener implements SensorPortListener {

		@Override
		public void stateChanged(SensorPort aSource, int aOldValue,
				int aNewValue) {
			int valore = light.readValue();
			LCD.drawString(valore + "  ", 0, 1);
			if (valore >= soglia)
				Motor.A.forward();
			else
				Motor.A.stop();
//			Delay.msDelay(10000);
		}

	}

	public RivelatoreRadon() {
		soglia = 50;
		LCD.drawString("Valore [Bq/mc]", 0, 0);
		LCD.drawString("Soglia [Bq/mc]", 0, 3);
		LCD.drawString(soglia + "  ", 0, 4);
		Button.LEFT.addButtonListener(new LeftButtonListener());
		Button.RIGHT.addButtonListener(new RightButtonListener());
		light = new LightSensor(SensorPort.S1, false);
		SensorPort.S1.addSensorPortListener(new LightSensorPortListener());
	}

	public static void main(String[] args) {
		new RivelatoreRadon();
		Button.ESCAPE.waitForPressAndRelease();
	}
}

JParabola

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

public class JParabola extends JOxy {

	private double a, b, c;

	public double f(double x) {
		return a * x * x + b * x + c;
	}

	public JParabola() {
		a = 1.0;
		b = 0.0;
		c = 0.0;
	}

	public void paintComponent(Graphics g) {
		super.paintComponent(g);

		g.setColor(Color.BLUE);
		for (int i = 0; i < getWidth() - 1; i++) {
			double x1 = xr(i);
			double y1 = f(x1);
			double x2 = xr(i+1);
			double y2 = f(x2);
			g.drawLine(i, yg(y1), i + 1, yg(y2));
		}
	}

	public double getA() {
		return a;
	}

	public void setA(double a) {
		this.a = a;
	}

	public double getB() {
		return b;
	}

	public void setB(double b) {
		this.b = b;
	}

	public double getC() {
		return c;
	}

	public void setC(double c) {
		this.c = c;
	}

}

JOxy

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;

import javax.swing.JComponent;

public class JOxy extends JComponent {

	private int sx, sy, tx, ty;
	private String asseX, asseY;
	private double xMouse, yMouse;

	private class AscoltaMouse extends MouseMotionAdapter {
		public void mouseMoved(MouseEvent e) {
			int x=e.getX();
			int y=e.getY();
			xMouse=xr(x);
			yMouse=yr(y);
			repaint();
		}
	}

	public JOxy() {
		setPreferredSize(new Dimension(400, 400));
		setSx(50);
		setSy(50);
		setTx(100);
		setTy(100);
		setAsseX("X");
		setAsseY("Y");
		addMouseMotionListener(new AscoltaMouse());
	}

	public int xg(double x) {
		return (int) Math.round(tx + x * sx);
	}

	public int yg(double y) {
		return (int) Math.round(getHeight() - 1 - ty - y * sy);
	}

	public double xr(int x) {
		return (double) (x - tx) / sx;
	}

	public double yr(int y) {
		return (double) (getHeight() - 1 - ty - y) / sy;
	}

	public void paintComponent(Graphics g) {
		int w = getWidth() - 1;
		int h = getHeight() - 1;

		g.setColor(Color.WHITE);
		g.fillRect(0, 0, w, h);
		g.setColor(Color.BLACK);

		// asse X
		g.drawLine(0, yg(0), w, yg(0));
		for (int i = (int) xr(0); i <= (int) xr(w); i++) {
			g.drawLine(xg(i), yg(0) - 5, xg(i), yg(0) + 5);
			g.drawString(i + "", xg(i) + 3, yg(0) - 3);
		}
		g.drawString(asseX, w - 5 - g.getFontMetrics().stringWidth(asseX), yg(0) - 20);

		// asse Y
		g.drawLine(xg(0), 0, xg(0), h);
		for (int i = (int) yr(h); i <= yr(0); i++) {
			g.drawLine(xg(0) - 5, yg(i), xg(0) + 5, yg(i));
			g.drawString(i + "", xg(0) + 3, yg(i) - 3);
		}
		g.drawString(asseY, xg(0) + 20, 15);

		g.drawString("("+xMouse+","+yMouse+")", xg(xMouse), yg(yMouse));
	}

	public int getSx() {
		return sx;
	}

	public void setSx(int sx) {
		if (sx < 20)
			sx = 20;
		this.sx = sx;
	}

	public int getSy() {
		return sy;
	}

	public void setSy(int sy) {
		if (sy < 20)
			sy = 20;
		this.sy = sy;
	}

	public int getTx() {
		return tx;
	}

	public void setTx(int tx) {
		if (tx < 0)
			tx = 0;
		this.tx = tx;
	}

	public int getTy() {
		return ty;
	}

	public void setTy(int ty) {
		if (ty < 0)
			ty = 0;
		this.ty = ty;
	}

	public String getAsseX() {
		return asseX;
	}

	public void setAsseX(String asseX) {
		this.asseX = asseX;
	}

	public String getAsseY() {
		return asseY;
	}

	public void setAsseY(String asseY) {
		this.asseY = asseY;
	}

}