Zeit zwischen 2 Impulsen mittels Lichtschranke messen

Guten morgen, ich habe hier eine Lichtschranke, mit der ich beim Gitarre spielen die Liedgeschwindigkeit mit dem Fuß messen bzw. mein Tempo überwachen möchte. Dafür habe ich hier eine Lichtschranke mittels Laser als Fußpedal. Die Lichtschranke ist gegeben und ich muss mit der Ausführung auskommen.

Die Lichtschranke gibt mir einen Impuls (Anstiegszeit 1ms, Rücken etwa 10ms, Amplitude 2V) aus, den ich am Analogeingang und Mapping sehr gut konkretisieren kann. Konkretisiert mit 1/0 oder auch HIGH und LOW. Am Interrupt-Eingang kann ich das Signal nicht auswerten. Scheinbar ist die Amplitude zu niedrig oder der Impuls/Rücken gefällt dem µC nicht.

Meine Schwierigkeit ist gerade, die Zeit zwischen den Impulsen zu ermitteln. Meine Strategien waren folgende:

  1. Die Zeit zwischen 2 Ereignissen mittels Differenz (millies) zu ermitteln. Aber das hat schon gar nicht gefruchtet!
void loop() {
Zaktsignal = digitalRead(Taktpin);
if (Taktsignal == HIGH) {    
  Startzeit = millis(); 
  Serial.print(" Dauer: ");
  Serial.println(Dauer);
  delay(200); 
                        }
else {
   Dauer =   millis() - Startzeit;
     }
millies_aktuell = millis(); 
}
  1. Ein anderer Ansatz war die Lösung mit einem Merker, der mir sehr gut gefällt. Aber scheinbar überläuft er den Merker und hängt ständig in der IF-Bedingung fest:
  if (SignalKonkret >= 1) {
              
                                if (Zeitmerker == 0) {
                                  Startzeit = millis();
                                   Serial.print("Startzeit: ");
                                   Serial.println(Startzeit);
                                  Zeitmerker = 1;
                                                    }
                                
                                
                                
                                if (Zeitmerker == 1) {
                                  Endzeit = millis();
                                   Serial.print("Endzeit: ");
                                   Serial.println(Endzeit);
                                  Zeitspanne = Endzeit - Startzeit;
                                  Zeitmerker = 0;
                                   Serial.print("Zeitspanne: ");
                                   Serial.println(Zeitspanne);
                                                    }
            
                           
              // Serial.println(Zeitspanne);
               delay(10);    } 
               
          else { 
                              //blabla
               }

Ich hatte gehofft, dass mir eine Lösung beim schreiben des Beitrages hier einfällt, aber leider war es nicht so. :frowning:

Vielleicht hat jemand eine Idee oder einen Lösungsansatz? Vielleicht ist auch eine andere Richtung viel besser?

Vielen Dank und ich freue mich auf Beiträge! VG aus Nürnberg!!

(deleted)

...und dann hast Du zusätzlich bei 10ms HIGH-Anteil noch ein massives Problem mit delay(200) in der ersten Lösung bzw. delay(10) in der Zweiten. Das führt immer dazu, dass die wirkliche Flanke nicht erkannt werden kann - es passiert ja 200ms bzw. 10ms gar nix.

Die Ausgabe auf die serielle Schnittstelle sollte außerhalb der Zeitnahme und -Berechnung erfolgen.

Oh, danke für die Ideen!

Die Transistorschaltung fällt fast weg, ich hab gerade so einen Nano untergebracht.

Aber ich werde PulseIn morgen gleich anschauen/testen.

und die Hinweise für den delay bzw. die serialPrint-Anweisungen ausserhalb der Schleifen- an das hab ich gar nicht geachtet!

Ich geb' Feedback! Danke!

Schau mal hier in Posting #48:

https://forum.arduino.cc/index.php?topic=662988.45

Das ist ein Code der für etwas unsaubere digitale Signale dieser Art funktioniert. Allerdings für externe Signale die einen Interrupt auslösen.

Ansonsten könntest du ja beim konkretisieren von deinem Signal eine Hysterese einplanen, dann brauchst du die "Features" des Codes oben nicht sondern musst wie schon gesagt nur die Zeit zwischen Zustandsänderungen erfassen.