Mit dem pulseIn() ist es wie mit dem delay(). Das kannst Du auch zu Fuß machen (pulseIn ist einfacher zu handhaben).

Brainstorming (keine Ahnung ob das schon 100% so richtig wäre, bloß wegen der Vorgehensweise):

1. Auf der ECHO-Leitung auf High warten.
2. micros() - Mikrosekunden auslesen.
3. Auf der ECHO-Leitung auf High warten.
4. micros() - Mikrosekunden auslesen.
5. Den ersten vom zweiten Mikros-Wert subtrahieren.

Wenn der Code schnell genug durchläuft (also genügend Durchläufe pro Sekunde schafft) sollten auch diese dann so ermittelten Werte gut genug sein. Voraussetzung ist natürlich, dass keine andere Stelle im Code Hänger verursacht.

Wegen den Steppern nochmal:

Ich will nicht dazu verleiten, andere Hardware einzusetzen. Aber die Steuerung der einzelnen Schritte geschieht doch im Mikrosekundenbereich. Sobald es dort, z.B. über eine halbe Millisekunde (oder weniger), zu Verzögerungen - zwischen den einzelnen Schritten - kommt, merkst Du das u.U., eben daran, dass es nicht gleichmäßig läuft. Deshalb würde ich die Motoren unabhängig steuern.
Wenn ich an einem NANO (z.B.) vier Pins zur Steuerung der Motoren festlege, kann ich mit HIGH oder LOW, auf jedem der Pins, einen Motor aus- oder einschalten. Der NANO muss nur diese vier Leitungen überwachen und würde in loop() einfach nur die Stepper bedienen, damit laufen die dann absolut gleichmäßig. Es würde auch ein 328P in Minimalbeschaltung ausreichen: Quartz und 2 Kondensatoren.

Ob Softwarelösungen per AccelStepper-Lib oder was auch immer da genau so gute Ergebnisse liefern, dazu vermag ich kein Urteil abzugeben, weil ich das noch nicht benutzt habe. Wäre auszuprobieren.
Kommt drauf an, wieviel Software auf den MEGA bzw. den ESP32 zum Laufen kommen soll, wenn da mehrmals irgendwie Interrupts ausgelöst werden, um 3 oder 4 verschiedene Dinge zu steuern, könnten die ISRs sich auch gegenseitig in die Quere kommen. Wenn das Projekt etwas ausladender wird, kommt da sicher mehr als nur 4 Stepper ansteuern und zwei US-Wandler bedienen zusammen. Und zu anderen (Multithreading / Multitasking) hat HaWe auch schon viel geschrieben. Das würde ich mir dann auch mal anschauen.

Muss am Ende jeder selber wissen, wie er es macht.


MfG