// Variablen, mit denen die Messung angepasst werden kann
long messdauer = 3500;   // Messdauer in Millisekunden

// Einstellungen die nicht geändert werden dürfen.
int dauer = 0;            // Definition der Variablen "dauer", unter der die Zeit gespeichert wird, die ein Impuls bis zur Reflektion und zurück benötigt. Startwert ist hier 0.
int entfernung = 0;       // Definiton der Variablen „entfernung“, unter der die berechnete Entfernung in Millimetern gespeichert wird.
long startzeit;           // Startzeit der Messung
long aktuellezeit;        // Variable zum speichern der jeweils aktuellen Zeit
long time_since_s;        // Variable zur Bestimmung der Zeit seit Messbeginn
char usr_input = 0;       // Variable zum Start der Messung
int trigger = 7;          // Pin7 des Arduino-Boards wird als "trigger" bezeichnet.
int echo = 6;             // Pin6 des Arduino-Boards wird als "echo" bezeichnet.

void setup() {                                            
  pinMode(trigger, OUTPUT);   // Trigger-Pin ist ein Ausgang
  pinMode(echo, INPUT);       // Echo-Pin ist ein Eingang
  Serial.begin(9600);         // Startet die serielle Kommunikation
}

void loop() {

  if (Serial.available() > 0) {   // Wurde ein Zeichen in die Konsole eingegeben?
    usr_input = Serial.read();    // Der Variablen "usr_input" wird die Konsoleneingabe zugewiesen.
    if ((usr_input == 's')) {     // Starten der Messung, wenn "usr_input", also die Konsoleneingabe, "s" beträgt

      Serial.println ("Messung startet in");  //dreisekündiger Countdown
      Serial.println ("3 ...");
      delay(1000);
      Serial.println ("2 ...");
      delay(1000);
      Serial.println ("1 ...");
      delay(1000);
      Serial.println ("START!");                            

      startzeit = millis();       // Der Variable startzeit wird die aktuelle Systemzeit zugewiesen.
      time_since_s = 0;           // Der Variable time_since_s (Zeit seit Eingabe von "s") wird der Wert 0 zugewiesen.

      while (time_since_s <= messdauer) {     // Überprüft, ob die bisher vergangene Zeit "time_since_s" kleiner als die eingestellte Messdauer ist.
        digitalWrite(trigger, LOW);           // Hier nimmt man die Spannung für kurze Zeit vom Trigger-Pin, damit man später beim senden des Trigger-Signals ein rauschfreies Signal hat.
        delay(5);                             // Pausendauer: 5 Millisekunden
        digitalWrite(trigger, HIGH);          // Jetzt sendet man einen Ultraschallimpuls los.
        delay(10);                            // Dieser „Ton“ erklingt für 10 Millisekunden.
        digitalWrite(trigger, LOW);           // Dann wird der „Ton“ abgeschaltet.
        dauer = pulseIn(echo, HIGH);          // Mit dem Befehl „pulseIn“ zählt der Mikrokontroller die Zeit in Mikrosekunden, bis der Schall zum Ultraschallsensor zurückkehrt.
        time_since_s = millis() - startzeit;  // Berechnet die Zeit seit Beginn der Messung
        entfernung = (dauer / 2) * 0.3432;    // Nun berechnet man die Entfernung in Millimetern. Man teilt zunächst die Zeit durch zwei (Weil man nur eine Strecke berechnen möchte und nicht die Strecke hin- und zurück). Den Wert multipliziert man mit der Schallgeschwindigkeit in der Einheit Zentimeter/Mikrosekunde und erhält dann den Wert in Zentimetern.
        Serial.print (time_since_s);          // Ausgabe der Zeitdauer seit Beginn der Messung.
        Serial.print ("; ");                  // Ausgabe eines Trennzeichens.
        Serial.println(entfernung);           // Ausgabe der Entfernung über den seriellen Monitor.
      }
      usr_input = 0;                        // Zurücksetzen der Variablen, zum Start einer erneuten Messung erneut "s" in die Konsole eingeben. 
    }
  }
}
