Zeitkritische senden und Sensor Mittelwert

Hallo,
Ich möchte auf einen seriellen half duplex Bus Sensordaten schicken.
Ein Master schickt Anfragen (ein Byte gefolgt von 1500us Pause) auf den Bus. Kommt die richtige Anfrage, möchte ich 3 Byte als Antwort schicken.
Byte1 ist bus spezifisch und identifiziert den Wert, byte2und3 beinhaltet den tatsächlichen Wert.
Ich möchte einen Sensorwert übertragen.
Der Sensor rauscht stark, daher muss ich mehrere Werte mitteln.
Die 3 Antwortbytes sind zeitkritisch.

Ich hätte gerne, dass der Sensorwert kontinuierlich im Hintergrund aus analogA0 ausgelesen und laufend geglättet/gemittelt wird.

Gleichzeitig soll kontinuierlich auf RX gelauscht werden und analysiert bis das entsprechende Byte, gefolgt von der gesuchten Pause, gesendet wird.
Dann soll der jeweils aktuell geglättete Sensorwert in 2 Byte zerlegt und auf den Bus gesendet werden.

In meinem Sketch erfolgen beide Aufgaben hintereinander.
Das geht natürlich nicht, da die för Schleife zur Mitteilung viel zu lange dauert. Selbst wenn ich die Anzahl verringere.

Kann mir jemand erklären wie man 2 solche Aufgaben parallel laufen lassen kann?

Anbei mein Sketch.
In meinem Sketch wird im Loop der Bus abgehört und in der Funktion Sensorwert() wird der Sensorwert berechnet.
In meinem Sketch erfolgt die Berechnung erst nach dem Loop.
Ich bräuchte die Sensorwert Berechnung und Bus Anhörung gleichzeitig.
Geht das? Wenn ja, wie?
Für Tipps oder links zu passenden Anleitungen wäre ich sehr dankbar.

Zusätzlich arbeite ich aktuell mit einer transitor Schaltung, die TX und RX des Arduino auf ein Kabel des half duplex Buses zusammenlegt.
Sollte es dafür eine einfache Softwarelösung geben wäre es perfekt. Dieses Thema hat aktuell keine Priorität.

LG Roland

sendALT.INO (822 Bytes)

Dazu Zauberwort heißt "Gleitender Mittelwert"

Mittelwert = (analogread() + Mittelwert * (Filter-1)) / Filter

Jedes mal, wenn du den AD ausliest (am besten mit festen Zeitabständen) wird der wert sofort zur Mittelwertbildung verrechnet.

"Filter" ist der Wert, der bestimmt, wie stark der Messwert gefiltert wird.

Schau dir mal die Lib RunningMedian an.

Danke,
Werde mir beide Optionen ansehen.