Zeitmessung mit Java

Oftmals ist es wichtig, zwischen zwei Ereignissen die Zeit zu stoppen. Dazu dient die Klasse Stopwatch. Laut der Dokumentation kennt die Klasse nur zwei Methoden:

Method Summary
 int elapsed() 
          Return elapsed time in milliseconds
 void reset() 
          Reset watch to zero

 Zum Einen kann die Zeit in Millisekunden abgerufen werden, zum Anderen kann man die Uhr resetten, so dass sie wieder von vorne anfängt zu zählen.

 

Quelltext
import lejos.hardware.Button;
import lejos.hardware.lcd.LCD;
import lejos.utility.Delay;
import lejos.utility.Stopwatch;

public class MeinRoboter {
	Stopwatch stopUhr;

	MeinRoboter() { // Konstruktor
		stopUhr = new Stopwatch();
		stopUhr.reset();
	}

	public static void main(String[] args) {
		MeinRoboter m = new MeinRoboter();
		while (Button.ESCAPE.isUp()) {
			int zeit = m.stopUhr.elapsed();
			LCD.drawString(String.valueOf(zeit), 0, 4);

			if (Button.DOWN.isDown()) {
				m.stopUhr.reset();
			}

			Delay.msDelay(1000);
			LCD.clear();
		}
	}
	
}

Wie schnell ist unser Roboter?

Ws soll die Geschwindigkeit des Roboters bei unterschiedlichen Leistungen untersicht werden. 

Die Streckelänge zwischen zwei Markierungen ist bekannt. Es soll die Zeit gemessen werden, die der Roboter für diese Strecke braucht.

Überlegungen zum Quelltext

Der Quelltest orientiert sich am Linienzähler

  • Er muss zusätzlich mit einer Stopuhr versehen werden. Dies muss man im Konstruktor definieren
  • Wir brauchen noch zusätzliche Variablen für die zwei Zeiten t0 und t1 ( beide Integer) und einen Doublewert geschwindigkeit, diese können in der main-Routine angelegt werden.
  • Die Ausgabe der Geschwindigkeit geht über LCD.drawString(Double.toString(geschwindigkeit), 0, 0)
Quelltext
import lejos.hardware.Button;
import lejos.hardware.lcd.LCD;
import lejos.hardware.motor.UnregulatedMotor;
import lejos.hardware.port.MotorPort;
import lejos.hardware.port.SensorPort;
import lejos.hardware.sensor.EV3ColorSensor;
import lejos.robotics.EncoderMotor;
import lejos.utility.Delay;
import lejos.utility.Stopwatch;
 
public class geschwindigkeit {
 
    // Eigenschaften des Roboter
    EV3ColorSensor lichtSensor;
    float[] farbe;
 
    EncoderMotor MotorL;
    EncoderMotor MotorR;
 
    Stopwatch stopUhr;
    
    // Der Konstruktor
    geschwindigkeit() {
        // Lichtsensor
        lichtSensor = new EV3ColorSensor(SensorPort.S1);
        lichtSensor.setCurrentMode("Red");
        farbe = new float[lichtSensor.sampleSize()];
        // Motoren
        MotorL = new UnregulatedMotor(MotorPort.B);
        MotorR = new UnregulatedMotor(MotorPort.C);        
        // StopUhr
        stopUhr = new Stopwatch();
        stopUhr.reset();
    }
 
    // Hauptprogramm
    public static void main(String[] args) {
    	int t0=0;
    	int t1=0;
    	double geschwindigkeit=0;
    	
        boolean hell = true;
        boolean hell_alt = true;
        int wechsel = 0;
        int v = 100;
 
        geschwindigkeit m = new geschwindigkeit();
        m.MotorL.forward();
        m.MotorR.forward();
        m.lichtSensor.fetchSample(m.farbe, 0);
        // wert_alt = m.farbe[0];
 
        while (Button.ESCAPE.isUp()) {
            // Messvorgang starten --> Messwert in farbe[0] gespeichert
            m.lichtSensor.fetchSample(m.farbe, 0);
            // entscheiden ob hell oder dunkel
            if (m.farbe[0] < 0.2) {
                hell = false;
            }
            if (m.farbe[0] > 0.4) {
                hell = true;
            }
            // jetz nachschauen, ob sich was geändert hat
            if (hell != hell_alt) { 
                wechsel = wechsel + 1;
				int zeit = m.stopUhr.elapsed();  // Zeit in Millisekunden
                if(wechsel ==1){
                	t0=zeit;
                }
                
                if(wechsel ==3){
                	t1=zeit;
					geschwindigkeit=100/((t1-t0)/1000);
					v=0;
            }
            // aktuellen Wert merken für den nächsten Vergleich
            hell_alt = hell;
            }
            
            // ende if
            m.MotorL.setPower(v);
            m.MotorR.setPower(v);
             
        } // ende while
        // zum Schluss nochmal die Variable für 3 Sekunden anschauen
        LCD.drawString(Double.toString(geschwindigkeit), 0, 0);    
        Delay.msDelay(3000);
    } // ende main
}// ende class

Versuch: Messung der Geschwindigkeit bei verschiedenen Leistungsstufen

Untersucht unterschiedliche Leistungsstufen: pro Stufe wird die Geschwindigkeit von Hand und mit Hilfe des Javaprogramms berechnet.

Versuch zu v=25

  1. Versuch 2. Versuch 3. Versuch Mittelwert  m/s 
von Hand          
vom EV3           

Versuch zu v=50

  1. Versuch 2. Versuch 3. Versuch Mittelwert  m/s 
von Hand          
vom EV3           

Versuch zu v=75

  1. Versuch 2. Versuch 3. Versuch Mittelwert  m/s 
von Hand          
vom EV3           

Versuch zu v=100

  1. Versuch 2. Versuch 3. Versuch Mittelwert  m/s 
von Hand          
vom EV3