Zeitdauer eines HIGH-Signals ermitteln

Es soll die Zeitdauer gemessen werden, wie lange ein Eingang auf dem Arduino auf HIGH steht.

Dafür habe ich eine Verzweigung geschrieben, welche eine steigende Flanke erkennt, die zum starten der Zeitmessung dient und eine weitere Verzweigung für eine fallende Flanke zum Stoppen der Messung.
Anschließend subtrahiere ich den Zeitpunkt der fallenden Flanke vom Zeitpunkt der steigende Flanke, somit sollte mir rein die Zeitdauer des HIGH-Signals ausgegeben werden.

Leider funktioniert das nicht so, wie ich es geschrieben habe. Worin liegt der Fehler?

//Zeitmessung des Echos
unsigned long SystemTimeStart;
unsigned long Time;
boolean Echo = LOW;
boolean lastEcho = LOW;
boolean TimerStop = LOW;
boolean lastTimerStop = HIGH;


void setup() {
  
  //Serieller Monitor
  Serial.begin(9600);}


void loop() {
  
  //Zeitmessung des Echos
  Echo = digitalRead(9);
  if (Echo == HIGH && lastEcho == LOW)  // Pegelwechsel LOW => HIGH
  {SystemTimeStart = micros();
  lastTimerStop = HIGH;}
  lastEcho = Echo;
 
  TimerStop = digitalRead(9);
  if (TimerStop == LOW && lastTimerStop == HIGH)    // Pegelwechsel HIGH => LOW
  {Time = micros() - SystemTimeStart;
  lastEcho = LOW;}
  lastTimerStop = TimerStop;
  

  //Ausgabe der Übertragungsdauer
  Serial.print("Time: ");
  Serial.print(Time);
  Serial.println("µs");
  }

Vielen Dank im Voraus

Ich würde das mit einer Statemachine (dt: Endlicher Automat) lösen.
Zum Beispiel so (dein Sketch ein wenig umgebaut):

//Zeitmessung des Echos
unsigned long TimeStart;
unsigned long Time;
const byte inputPin = 9;
byte myState = 0; 

void setup() {
  Serial.begin(115200);     // es sollte schon etwas schneller als 9600 sein 
}

void loop() {
  // Statemachine:
  switch(myState) {
    case 0:            // warten auf HIGH
      if (digitalRead(inputPin)) {
        TimeStart = micros();
        myState = 1;
      }
      break;
    case 1:           // warten auf LOW
      if (!digitalRead(inputPin)) {
        Time = micros() - TimeStart;
        myState = 2;
      }
      break;
    case 2:         // Ausgabe
      Serial.print("Time: ");
      Serial.print(Time);
      Serial.println(" µs");
      myState = 0;
      break;
  }
}

Hallo,

Bau dir dich ein paar Serienprint ein um zu sehen ob die Flanken Erkennung am Anfang und am Ende funktioniert.

Warum willst du das überhaupt mit einer Flanken Erkennung machen. Wenn der Eingang high ist dann gilt doch:
Messzeit= millis() - Startzeit
Und wenn der Eingang low ist gilt
Startzeit=millis()

Oder auch mit micros()

Heinz

Hi

Du denkst zu kompliziert - auch kommt mir Dein Timerstop nicht ganz koscher vor.

Du hast doch nur zwei Flanken, Die Du erkennen musst.
1x LOW->HIGH
1x HIGH->LOW

Die reine Erkennung einer Flanke, dafür reicht ein status_jetzt!=status_alt.
Darin schaust Du, wie 'status_jetzt' ist und entscheidest, ob Du Dir die Startzeit merkst, oder die Endzeit.
Dann Laufzeit=Endzeit-Startzeit - fertig.

Tip(p): Drück Mal STRG+T in der IDE - Das räumt den Code etwas auf (rückt auf Klammerebenen ein).

MfG

Leider funktioniert das nicht so, wie ich es geschrieben habe.

Das ist keine Fehleranalyse. Beschreibe genau, was dein Sketch nicht macht was du willst.

Serial.print helfen immer.
Was macht dein Signal wenn es in der Luft hängt? hast da Pull-Downs?
Bitte stell einen Schaltplan ein.

pinMode()?
Schaltplan?

Von welcher Zeitdauer sprechen wir?
Darf die Messung blockierend sein?
Grüße Uwe

Vielen vielen Dank für die vielen Antworten!! :slight_smile:

Also mal ganz allgemein zu meinem Projekt:
Meine Idee ist es, ein Objekt innerhalb eines Raumes zu orten.
Dafür möchte ich von einem festen Standpunkt aus, ein 433MHz Signal senden (dessen Laufzeit ist für mich vernachlässigbar) und gleichzeitig einen Ultraschall.
Sobald das 433MHz am Messobjekt ankommt, soll die Zeitmessung starten, wie lange der Ultraschall für dieselbe Strecke gebraucht hat.
Mit der Laufzeit des Ultraschalls zum Messobjekt möchte ich die Entfernung ermitteln.
Wenn ich dieses Prinzip von 2 oder 3 Standpunkten aus durchführe, müsste somit eine genaue Ortsbestimmung möglich sein.

Abfolge:
1. Mit einem Impulsgeber, welchen ich im Arduino programmiert habe, soll regelmäßig das 433MHz Signal gesendet werden.
2. Das 433MHz Signal triggert den Ultraschall zum senden am festen Standpunkt zum und am Messobjekt zum empfangen.
3. Das HC-SR04 gibt mit der Zeitdauer des HIGH-Signals die Übertragungszeit an.
4. ...

uwefed:
Von welcher Zeitdauer sprechen wir?
Darf die Messung blockierend sein?
Grüße Uwe

Zeitdauer wird im Bereich von 0,3ms bis 15ms liegen.
Inwiefern blockierend? Also mein restliches Programm darf nicht pausiert werden. (Funktion als Impulsgeber und später weitere Aufgaben)

Rintin:
pinMode()?
Schaltplan?

pinMode()? Ich hab den Pin 8 als Trigger Output definiert.
Fehlt in meinem Programm der Pin 9 als Eingang für den Ultraschall? Dachte das wäre mit Echo = digitalRead(9); im loop überflüssig.

noiasca:
Das ist keine Fehleranalyse. Beschreibe genau, was dein Sketch nicht macht was du willst.

Serial.print helfen immer.
Was macht dein Signal wenn es in der Luft hängt? hast da Pull-Downs?
Bitte stell einen Schaltplan ein.

Mein Sketch hat dauerhaft einen festen Wert angezeigt.
Inwiefern in der Luft hängt? Es gibt doch immer einen definierten Zustand. Bei Input = 0, nichts verändern, bei Input = 1, Zeit messen und ausgeben.
Oder übersehe ich da was?

Schaltplan hab ich noch nicht, da es bisher sehr banal ist. (Mich dennoch zum verzweifeln bringt)
Bisher nutze ich meinen Impulsgeber um den Ultraschall zu triggern und möchte einfach nur die Zeit ausrechnen.
HC-SR04: Vcc an 5V, Trig an Pin 8, Echo an Pin 9, GND an GND

postmaster-ino:
Die reine Erkennung einer Flanke, dafür reicht ein status_jetzt!=status_alt.
Darin schaust Du, wie 'status_jetzt' ist und entscheidest, ob Du Dir die Startzeit merkst, oder die Endzeit.
Dann Laufzeit=Endzeit-Startzeit - fertig.

So wie es uxomm mit der Statemachine macht?

Rentner:
Warum willst du das überhaupt mit einer Flanken Erkennung machen. Wenn der Eingang high ist dann gilt doch:
Messzeit= millis() - Startzeit
Und wenn der Eingang low ist gilt
Startzeit=millis()

Da das im loop steht, wird doch hierbei solange die Flanke HIGH steht, die Zeit neu gesetzt, somit entfällt mir der Zeitpunkt der steigenden Flanke.
Oder wie kann ich das umgehen?

uxomm:
Ich würde das mit einer Statemachine (dt: Endlicher Automat) lösen.
Zum Beispiel so (dein Sketch ein wenig umgebaut):

Hier bekomme ich ein ganz seltsames Ergebnis.
An Pin 9 ist nichts angeschlossen. Der serielle Monitor bleibt leer.
Sobald ich mit dem Oszilloskop den Impulsgeber an Pin 8 messe, werden mir willkürliche Werte ausgegeben. :o Edit: es werden mir ca. 100ms ausgegeben, also mein Intervall für den Impuls

Hier mein aktueller vollständiger Code. Der erste war lediglich ein Ausschnitt des relevanten Teils.

//Impulsgeber zum Triggern
#define Trigger 8
int TriggerState;
unsigned long currentMillis;
unsigned long previousMillis = 0;
const long interval = 100;


//Zeitmessung des Echos
unsigned long TimeStart;
unsigned long Time;
const byte inputPin = 9;
byte myState = 0;

void setup() {
  Serial.begin(115200);
}

void loop() {

  //Impulsgeber zum Triggern
  currentMillis = millis();
  if (currentMillis - previousMillis >= interval)
  {
    previousMillis = currentMillis;
    if (TriggerState == LOW)
    {
      TriggerState = HIGH;
    }
    else
    {
      TriggerState = LOW;
    }
    digitalWrite(Trigger, TriggerState);
  }


  // Statemachine
  switch (myState) {
    case 0:            // warten auf HIGH
      if (digitalRead(inputPin)) {
        TimeStart = millis();
        myState = 1;
      }
      break;
    case 1:           // warten auf LOW
      if (!digitalRead(inputPin)) {
        Time = millis() - TimeStart;
        myState = 2;
      }
      break;
    case 2:         // Ausgabe
      Serial.print("Time: ");
      Serial.print(Time);
      Serial.println(" µs");
      myState = 0;
      break;
  }
}

Julian248:
pinMode()? Ich hab den Pin 8 als Trigger Output definiert.
Fehlt in meinem Programm der Pin 9 als Eingang für den Ultraschall? Dachte das wäre mit Echo = digitalRead(9); im loop überflüssig.

Woher soll ein Pin wissen, ob der als Output oder als Input benutzt werden soll?
Das macht man mit pinMode() im setup()

Schaltplan hab ich noch nicht, da es bisher sehr banal ist. (Mich dennoch zum verzweifeln bringt)

So banal der für dich auch sein mag, wir wissen gerade nichts darüber. Falls ein Problem in der Verdrahtung vorliegen sollte, können wir den nicht finden.

Schaltplan

Wie kann man hier Bilder anzeigen lassen?

Neuer Code: pinMode hinzugefügt

//Impulsgeber zum Triggern
#define Trigger 8
int TriggerState;
unsigned long currentMillis;
unsigned long previousMillis = 0;
const long interval = 1000;


//Zeitmessung des Echos
#define Echo 9
unsigned long SystemTimeStart;
unsigned long Time;

boolean state = LOW;
boolean laststate = LOW;

void setup() {

  //Impulsgeber zum Triggern
  pinMode(Trigger, OUTPUT);

  //Zeitmessung des Echos
  pinMode(Echo, INPUT);

  //Serieller Monitor
  Serial.begin(115200);
}

void loop() {

  //Impulsgeber zum Triggern
  currentMillis = millis();
  if (currentMillis - previousMillis >= interval)
  {
    previousMillis = currentMillis;
    if (TriggerState == LOW)
    {
      TriggerState = HIGH;
    }
    else
    {
      TriggerState = LOW;
    }
    digitalWrite(Trigger, TriggerState);
  }


  //Zeitmessung des Echos
  state = digitalRead(9);
  if (state == HIGH && laststate == LOW)  // Pegelwechsel LOW => HIGH
  {
    SystemTimeStart = micros();
  } else if (state == LOW && laststate == HIGH)    // Pegelwechsel HIGH => LOW
  {
    Time = micros() - SystemTimeStart;

    //Ausgabe der Übertragungsdauer bei fallender Taktflanke
    Serial.print("Time: ");
    Serial.print(Time);
    Serial.println("µs");
  }
  laststate = state;
}

Die 5V kommen von einer separaten Batterie? Dann mußt du auf jedenfall das GND noch mit dem Arduino verbinden.

Edit: Wobei, wenn ich mir daw so recht überlege, nimm doch GND und die 5V vom Arduino

Es macht gerade den Eindruck, als würde es funktionieren!!

Vielen vielen Dank!!!

Vielleicht lag es tatsächlich nur an der fehlenden Definition der Pins (INPUT, OUTPUT) oder dem GND

  1. Das 433MHz Signal triggert den Ultraschall zum senden am festen Standpunkt zum und am Messobjekt zum empfangen.

du sendest also mit einem HC04 auf deinem Leuchtturm und empfängst mit einem anderen HC04 auf deinem mobilen Objekt? habe ich das richtig verstanden?

Was machst du später um den HC04 am Objekt so auszurichten dass du einen Direkt-Schall vom Sender erhältst, und nicht eine Reflektion über ein anderes hartes Objekt/Wand?

Oder in anderen Worten, hast du nicht bessere Konzepte bei deiner Recherche im Internet gefunden?
Was hat dir z.B. an BLE-Beacons nicht gefallen?

noiasca:
du sendest also mit einem HC04 auf deinem Leuchtturm und empfängst mit einem anderen HC04 auf deinem mobilen Objekt? habe ich das richtig verstanden?

richtig, bzw. mehrere Türme oder in den Ecken des Raumes

noiasca:
Was machst du später um den HC04 am Objekt so auszurichten dass du einen Direkt-Schall vom Sender erhältst, und nicht eine Reflektion über ein anderes hartes Objekt/Wand?

Laut Datenblatt ist bei den HC04 angeblich ist ein Winkel bis 45° möglich.
Daher werde ich den Empfänger nach oben auslegen.
Der Höhenunterschied ist hoffentlich ausreichend.

noiasca:
Oder in anderen Worten, hast du nicht bessere Konzepte bei deiner Recherche im Internet gefunden?
Was hat dir z.B. an BLE-Beacons nicht gefallen?

Ich habe (bessere) Alternativen gefunden, aber mein Lehrer wünscht sich diese Variante (unabhängig davon, ob es letztendlich funktionieren wird oder nicht).
Die Beacons liefern den Standort meiner Recherche nach auf nur 1 Meter genau.

Meinen Berechnungen nach müsste bei meiner Variante eine Genauigkeit von 2mm möglich sein.
Würde behaupten, solch eine Genauigkeit ist in der Praxis unrealistisch. Vielleicht schaffe ich 1cm, 5mm wären echt genial, aber ich gebe mich auch mit 2-3cm Genauigkeit zufrieden.

mach mal eine schematische Zeichnung deines Aufbaus.
Wie planst du die Verteilung deiner 3(?) Leuchttürme,
im welchen Bereich sollte dein Objekt sich befinden können.
Auch die Höhen der Objekte eintragen.

Imho schaffst keine ausreichende Abdeckung bei einer Verteilung im gleichseitigem Dreieck (mit 60 Grad) und einer angenommen Kegel von 45Grad. Da hast viele weiße Flecken in deinem Zimmer.

Welche Schulstufe? - Welchen Umfang soll deine Arbeit darstellen?
Kann man den Lehrer diese tolle Idee ausreden?

Nun stehe ich vor einem neuen Problem...

Ich habe den Aufbau etwas geändert:

  • Das Messobjekt sendet einen Ultraschallimpuls
  • Die Messtürme sollen diesen Ultraschall auffassen und daraus die Entfernung berechnen

Ich habe die Türme nebeneinander und ungefähr gleich weit vom Messobjekt entfernt aufgestellt. (ca. 16cm)
Ausgegeben wird mir allerdings folgendes:

19:48:36.279 -> Distanz Turm 2: 38.42cm
19:48:36.381 -> Distanz Turm 1: 16.88cm
19:48:36.381 -> Distanz Turm 2: 38.55cm
19:48:36.448 -> Distanz Turm 1: 17.01cm
19:48:36.448 -> Distanz Turm 2: 37.59cm
19:48:36.517 -> Distanz Turm 2: 15.23cm
19:48:36.517 -> Distanz Turm 1: 38.69cm
19:48:36.619 -> Distanz Turm 1: 16.33cm
19:48:36.619 -> Distanz Turm 2: 36.91cm
19:48:36.687 -> Distanz Turm 1: 16.33cm
19:48:36.687 -> Distanz Turm 2: 36.91cm
19:48:36.756 -> Distanz Turm 1: 16.33cm
19:48:36.756 -> Distanz Turm 2: 36.91cm
19:48:36.859 -> Distanz Turm 2: 15.23cm
19:48:36.859 -> Distanz Turm 1: 38.69cm
19:48:36.927 -> Distanz Turm 1: 16.33cm
19:48:36.927 -> Distanz Turm 2: 36.91cm
19:48:36.994 -> Distanz Turm 1: 16.33cm
19:48:36.994 -> Distanz Turm 2: 36.91cm
19:48:37.096 -> Distanz Turm 2: 15.37cm
19:48:37.096 -> Distanz Turm 1: 38.69cm
19:48:37.163 -> Distanz Turm 1: 16.33cm
19:48:37.163 -> Distanz Turm 2: 36.77cm
19:48:37.231 -> Distanz Turm 1: 16.33cm
19:48:37.231 -> Distanz Turm 2: 36.91cm
19:48:37.334 -> Distanz Turm 2: 14.41cm
19:48:37.334 -> Distanz Turm 1: 37.87cm
19:48:37.400 -> Distanz Turm 1: 16.33cm
19:48:37.400 -> Distanz Turm 2: 36.91cm
19:48:37.500 -> Distanz Turm 2: 15.09cm

Das Programm wird doch von oben nach unten Zeile für Zeile abgearbeitet?
Müsste dann nicht immer Turm 1 und Turm 2 abwechselnd aufgelistet werden?
Teilweise kommen 2 Messergebnisse eines Turmes direkt hintereinander...

Außerdem ist jedes 2. Messergebnis bei ca. 36cm anstatt den realen ca. 16cm
Es ist weder das doppelte, noch bei verschiedenen Entfernungen konstant 20cm...
Wenn ich einen der beiden Türme auf Störung setze (also abdecke) läuft die Messung bei dem anderen Turm korrekt.
Ich frage mich, wie das zustande kommt :o :confused:

Folgenden Code habe ich 2 mal direkt hintereinander in den loop() geschrieben. Je für Turm 1 und Turm 2.

//---------- Messung der Übertragungszeit Turm 2 ----------
  //Einlesen des Echos
  Echo2 = digitalRead(3);



  //Pegelwechsel LOW => HIGH
  if (lastEcho2 == LOW && Echo2 == HIGH)
  {
    StartTime2 = micros();
  }



  //Pegelwechsel HIGH => LOW
  if (lastEcho2 == HIGH && Echo2 == LOW)
  {
    TransmissionTime2 = micros() - StartTime2;

    if (TransmissionTime2 > 20000)
    {
      //Ausgabe Störung (über 20ms = über 5,80m)
      Serial.println("Störung");
      digitalWrite(Error2, HIGH);
    }
    else
    {
      //Störung Rücksetzen
      digitalWrite(Error2, LOW);

      //Umrechnung in Entfernung
      Distance2 = TransmissionTime2 / 1000.00 * 34.3;   //34.3 = Schallgeschwindigkeit in cm/ms
      
      //Ausgabe der Entfernung
      Serial.print("Distanz Turm 2: ");
      Serial.print(Distance2);
      Serial.println("cm");
    }
  }
  lastEcho2 = Echo2;

Vielen Dank im Voraus

Aus dem Fragment ist nichts zu erkennen.
Warum schreibst Du 2 Mal den gleichen Code und machst keine Funktion draus?

Gruß Tommy

Hier ist der vollständige Code meines Arduinos für die Messtürme

Ich habe keine Funktion geschrieben weil ich 1. nicht weiß, wie das geht und 2. sind wie zu sehen verschiedene Variablen verwendet
Also bei Turm 1 alle Variablen mit der Endung 1
und bei Turm 2 alle Variablen mit der Endung 2

//---------- Bibliothek einbinden --------- 
#include <RCSwitch.h>



//---------- 433MHz Receiver --------- 
#define Receive 12
boolean Received;
RCSwitch Trigger = RCSwitch();



//---------- Ultraschall Receiver ----------
  //Turm 1
  #define TriggerOut1 8
  
  //Turm 2
  #define TriggerOut2 2



//---------- Messung der Übertragungszeit ----------
  //Turm 1
  #define EchoPin1 9
  unsigned long StartTime1;
  unsigned long TransmissionTime1;
  boolean Echo1 = LOW;
  boolean lastEcho1 = LOW;

  //Turm 2
  #define EchoPin2 3
  unsigned long StartTime2;
  unsigned long TransmissionTime2;
  boolean Echo2 = LOW;
  boolean lastEcho2 = LOW;



//---------- Umrechnung in Entfernung ----------
  //Turm 1
  float Distance1;

  //Turm 2
  float Distance2;



//---------- Rückmeldung ----------
  //Error Trum 1
  #define Error1 6

  //Error Turm 2
  #define Error2 4



//---------------------------------------- void setup ----------------------------------------
void setup() {



//---------- 433MHz Receiver ----------
  pinMode(Receive, INPUT);
  Trigger.enableReceive(0);



//---------- Ultraschall Receiver ----------
  //Turm 1
  pinMode(TriggerOut1, OUTPUT);

  //Turm 2
  pinMode(TriggerOut2, OUTPUT);



//---------- Messung der Übertragugnszeiten ----------
  //Turm 1
  pinMode(EchoPin1, INPUT);

  //Turm 2
  pinMode(EchoPin2, INPUT);



//---------- Rückmeldung ----------
  //Turm 1
  pinMode(Error1, OUTPUT);

  //Turm 2
  pinMode(Error2, OUTPUT);



//---------- Serieller Monitor ----------
  Serial.begin(115200);
}



//---------------------------------------- void loop ----------------------------------------
void loop() {



//---------- 433MHz Signal empfangen ----------
  Received = digitalRead(12);



//---------- Triggern der Ultraschall Receiver ----------
  //Turm 1
  digitalWrite(TriggerOut1, Received);

  //Turm 2
  digitalWrite(TriggerOut2, Received);



//---------- Messung der Übertragungszeit Turm 1 ----------
  //Einlesen des Echos
  Echo1 = digitalRead(9);



  //Pegelwechsel LOW => HIGH
  if (lastEcho1 == LOW && Echo1 == HIGH)
  {
    StartTime1 = micros();
  }



  //Pegelwechsel HIGH => LOW
  if (lastEcho1 == HIGH && Echo1 == LOW)
  {
    TransmissionTime1 = micros() - StartTime1;

    if (TransmissionTime1 > 20000)
    {
      //Ausgabe Störung (über 20ms = über 5,80m)
      Serial.println("Störung");
      digitalWrite(Error1, HIGH);
    }
    else
    {
      //Störung Rücksetzen
      digitalWrite(Error1, LOW);

      //Umrechnung in Entfernung
      Distance1 = TransmissionTime1 / 1000.00 * 34.3;   //34.3 = Schallgeschwindigkeit in cm/ms

      //Ausgabe der Entfernung
      Serial.print("Distanz Turm 1: ");
      Serial.print(Distance1);
      Serial.println("cm");
    }
  }
  lastEcho1 = Echo1;



//---------- Messung der Übertragungszeit Turm 2 ----------
  //Einlesen des Echos
  Echo2 = digitalRead(3);



  //Pegelwechsel LOW => HIGH
  if (lastEcho2 == LOW && Echo2 == HIGH)
  {
    StartTime2 = micros();
  }



  //Pegelwechsel HIGH => LOW
  if (lastEcho2 == HIGH && Echo2 == LOW)
  {
    TransmissionTime2 = micros() - StartTime2;

    if (TransmissionTime2 > 20000)
    {
      //Ausgabe Störung (über 20ms = über 5,80m)
      Serial.println("Störung");
      digitalWrite(Error2, HIGH);
    }
    else
    {
      //Störung Rücksetzen
      digitalWrite(Error2, LOW);

      //Umrechnung in Entfernung
      Distance2 = TransmissionTime2 / 1000.00 * 34.3;   //34.3 = Schallgeschwindigkeit in cm/ms
      
      //Ausgabe der Entfernung
      Serial.print("Distanz Turm 2: ");
      Serial.print(Distance2);
      Serial.println("cm");
    }
  }
  lastEcho2 = Echo2;
}

Julian248:
Ich habe keine Funktion geschrieben weil ich 1. nicht weiß, wie das geht und 2. sind wie zu sehen verschiedene Variablen verwendet

  1. kann man lernen und verringert die Fehlermöglichkeiten
  2. kann man mit struct und evtl. einem Array daraus problemlos erledigen
  3. Ein Sketch mit so vielen unnötigen Leerzeilen ist im Forum sehr schlecht lesbar

Gruß Tommy

Tommy56:
2. kann man mit struct und evtl. einem Array daraus problemlos erledigen

Dadurch können sich mit meinem Programmierwissen (noch mehr) Fehler einschleichen, daher habe ich es vermieden.
Du könntest auch kurz erklären wie das funktioniert oder einen Link einfügen, bei dem die Funktion ausführlich gezeigt wird.

Tommy56:
3. Ein Sketch mit so vielen unnötigen Leerzeilen ist im Forum sehr schlecht lesbar

Im gesamten ist der Sketch somit aber übersichtlicher. Teilaufgaben lassen sich leichter unterscheiden und mit Kommentaren versehen.

Lösung:
Copy&Paste in z.B. ein WordPad oder in den Arduino Editor