// Variablen, mit denen die Messung angepasst werden kann.
long messpause = 000;     // Die "messpause" gibt die zeitliche Verzögerung zwischen zwei Messungen in Millisekunden an. Sie kann beliebig angepasst werden.
long messdauer = 10000;   // Messdauer in Millisekunden

// Variablen, die ggf. geändert werden können.
int trigger = 7;          // Pin7 des Arduino-Boards wird als "trigger" bezeichnet.
int echo = 6;             // Pin6 des Arduino-Boards wird als "echo" bezeichnet.

// 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

// Initialisierung
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
}

// Hauptschleife
void loop() {

if (Serial.available() > 0) {   // Wurde ein Zeichen in die Konsole eingegeben?
  usr_input = Serial.read();
  if ((usr_input == 's')) {     // Starten der Messung, sobald das Zeichen "s" eingegeben wird

    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 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);                             // Dauer: 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.
      delay(messpause);
      }
      usr_input = 0;                        // Zurücksetzen der Variable zum Start der Messung.
    }
  }
}
