

# Technisches Kompendium: Autonome 3D-Ultraschall-Anemometer-Wetterstation

## Teil 1: Physikalische Theorie, Geometrie & Erweiterte Vektoralgebren (Stationär & Mobil)

### 1.1 Physikalische Grundlagen & Klimakorrelation

Die Messung von Strömungsgeschwindigkeiten mittels Ultraschall basiert
auf dem akustischen Time-of-Flight-Prinzip (ToF). Schallwellen breiten
sich in einem gasförmigen Medium als longitudinale Dichtewellen aus.

#### Die temperatur- und feuchteabhängige Schallgeschwindigkeit ($c$)

Die Ausbreitungsgeschwindigkeit des Schalls in Luft ist eine Funktion
der Lufttemperatur, der Luftfeuchtigkeit und des Luftdrucks. Die
exakte physikalische Gleichung nach dem idealen Gasgesetz lautet:

$$c = \sqrt{\gamma \cdot \frac{R \cdot T_{\text{Kelvin}}}{M}}$$ 

wobei $\gamma$ der Adiabatenexponent, $R$ die universelle
Gaskonstante, $T_{\text{Kelvin}}$ die thermodynamische Temperatur in
Kelvin und $M$ die mittlere molare Masse der feuchten Luft ist.  Da
die molare Masse von Wasserdampf geringer ist als die von trockenem
Stickstoff und Sauerstoff, erhöht Luftfeuchtigkeit die
Schallgeschwindigkeit. Zur hocheffizienten Berechnung auf dem
Raspberry Pi Pico liest das System die Temperatur $T$ (in Grad
Celsius) und die relative Luftfeuchtigkeit $RH$ (in Prozent) über den
$I^2C$-Bus vom BME280 ein. Die softwareseitige Bestimmung der
korrigierten Null-Wind-Schallgeschwindigkeit erfolgt über:

$$c = 331{,}3 \cdot \sqrt{1 + \frac{T}{273{,}15}} \cdot \left(1 +
0{,}14 \cdot \frac{e}{p}\right) \quad \left[\text{in
}\frac{\text{m}}{\text{s}}\right]$$

Für den Standardbetrieb wird dies auf dem Mikrocontroller über die
Linearisierung des Bosch-Datenblatts unter Einbeziehung des
berechneten Sättigungsdampfdrucks $e$ abgebildet. Eine unkompensierte
Temperaturdrift von nur $1^\circ\text{C}$ erzeugt einen scheinbaren
Windmessfehler von $0{,}6\text{ m/s}$ ($2{,}16\text{ km/h}$). Der
BME280 bildet daher das mathematische Koordinatenfundament.

#### Der Windeinfluss auf den Schallwellenvektor

Bewegt sich das Ausbreitungsmedium Luft mit einem dreidimensionalen
Windvektor $\vec{v} = (v_x, v_y, v_z)$, addiert sich dieser rein
vektoriell zur Ausbreitungsrichtung der Schallwelle. Für einen
diskreten Schallpfad mit der geometrischen Länge $s$ und dem
normierten Richtungs-Einheitsvektor $\vec{e}$ ergibt sich die
effektive Phasengeschwindigkeit zu $c_{\text{eff}} = c + \vec{v} \cdot
\vec{e}$. Die resultierende Signallaufzeit $t$ lautet:

$$t = \frac{s}{c + \vec{v} \cdot \vec{e}}$$ 



### 1.2 Geometrie des orthogonalen Über-Eck-Aufbaus (Skaliertes 190-mm-Design)

Das mechanische Messgitter besteht aus drei unabhängigen akustischen
Pfaden (Sensorpaare $i = 1, 2, 3$), die in einem exakten
120-Grad-Winkelraster angeordnet sind. Um Platz für eine
hocheffiziente, runde 150-mm-Solarzelle sowie eine $2\text{ cm}$
breite, umlaufende Dachrinne samt 3-mm-Außenwulst zu schaffen, wurde
das System proportional auf einen Gesamtdurchmesser von $190\text{
mm}$ skaliert.


#### Geometrische Vektorkette

Sender ($S_i$) und Empfänger ($E_i$) eines Paares stehen sich auf dem
Kreisrand diametral gegenüber. Ihre akustischen Hauptachsen sind um
exakt 45 Grad nach unten geneigt.  Da der Neigungswinkel präzise
$45^\circ$ beträgt und das Dreieck proportional mitwächst, spannen
Hinweg, Rückweg und der Kreisdurchmesser ein gleichschenkliges,
rechtwinkliges Dreieck auf. Daraus ergeben sich die festen
Raumkonstanten des neuen Systems:

* Gehäuseradius ($R$): Beträgt durch die Skalierung nun exakt $R =
  75\text{ mm}$ bis zur Sensorachse.
* Fokuspunkt-Koordinaten ($F$): Der Fokuspunkt liegt im
  Symmetriezentrum senkrecht unter dem Ursprung bei $F = (0, 0, -R) =
  (0, 0, -75\text{ mm})$.
* Vertikale Messhöhe ($H$): Der vertikale Abstand von der oberen
  Sensorebene zur Reflektionsfläche ist formschlüssig identisch mit
  dem Radius: $H = R = 75\text{ mm}$.
* Akustische Teilstrecken ($s_{\text{teil}}$): Der Hinweg (Abwärts)
  und der Rückweg (Aufwärts) bilden Schenkel eines rechten Winkels und
  sind identisch lang: $s_{\text{teil}} = R \cdot \sqrt{2} = 75\text{
  mm} \cdot 1{,}414213 = 106{,}07\text{ mm}$. Die Gesamtlaufstrecke
  pro Kanal ($2 \cdot 106{,}07\text{ mm} = 212{,}14\text{ mm}$) liegt
  damit weit unter der kritischen Dämpfungsgrenze von $40\text{ cm}$.

Im Fokuspunkt $F$ ist eine quadratische, schallharte Glasscheibe
($30\times30\text{ mm}$, $2\text{ mm}$ dick) eingelassen. Sie fungiert
als akustischer Spiegel, der die eintreffende Wellenfront im exakten
90-Grad-Winkel ("über Eck") reflektiert und verlustfrei zum
gegenüberliegenden Empfänger leitet.


### 1.3 Kinematik der Kopplung: Abwärts- vs. Aufwärts-Pfad

Die 90-Grad-Über-Eck-Umlenkung bewirkt eine asymmetrische Filterung
der Windkomponenten auf den Teilstrecken. Wir definieren die
Richtungsvektoren für einen Kanal $i$ bei einem Horizontalwinkel
$\phi_i$:

* Vektor Hinweg ($\vec{e}_{\text{Hin},i}$): Der Schall wandert vom
  Kreisrand nach innen unten zum Fokus.  $$\vec{e}_{\text{Hin},i} =
  -0{,}7071 \cdot [\cos(\phi_i), \sin(\phi_i), 1]$$
* Vektor Rückweg ($\vec{e}_{\text{Rück},i}$): Nach der Reflexion läuft
  der Schall in dieselbe Richtung (von der Mitte weg nach außen zum
  gegenüberliegenden Empfänger), steigt jedoch aufwärts.
$$\vec{e}_{\text{Rück},i} = 0{,}7071 \cdot [-\cos(\phi_i),
-sin(\phi_i), 1]$$

#### Kinematische Konsequenzen:

   1. Horizontalwind-Addition: Da der Schall seine horizontale
      Flugrichtung von einer Seite des Kreises zur anderen beibehält,
      wirkt ein horizontaler Windvektor auf dem Hinweg und dem Rückweg
      gleichsinnig. Er beschleunigt oder bremst das Signal auf der
      gesamten Flugstrecke.
   2. Vertikalwind-Elimination: Auf dem Hinweg fliegt der Schall nach
      unten, also gegen einen Aufwind $v_z$. Auf dem Rückweg fliegt er
      nach oben, also mit dem Aufwind $v_z$. Innerhalb eines einzigen
      Messdurchlaufs hebt sich der Vertikalwindeinfluss in der
      akkumulierten Gesamtlaufzeit ($t_{\text{ges}} = t_{\text{Hin}} +
      t_{\text{Rück}}$) mathematisch vollständig auf.

Daraus folgt: Um $v_z$ zu extrahieren, darf nicht die Zeitdifferenz
einer Richtungsumkehr gebildet werden; stattdessen muss die absolute
Abweichung der Gesamtlaufzeit zur theoretischen reinen
Schallgeschwindigkeit $c$ herangezogen werden.


### 1.4 Lineares Gleichungssystem & Kartesische Transformation

Zur Berechnung extrahiert der Raspberry Pi Pico die reinen
Absolutzustände der vorwärts gemessenen Laufzeiten $t_i$. Wir
definieren für jeden der drei um 120 Grad verschobenen Kanäle ($\phi_1
= 0^\circ, \phi_2 = 120^\circ, \phi_3 = 240^\circ$) die scheinbare
Windkomponente $w_i$. Diese berechnet sich aus der geometrischen
Teilstrecke $s_{\text{teil}} = R \cdot \sqrt{2}$ und den im Flash
gespeicherten mechanischen Nullpunkt-Offsets $o_i$:

$$w_i = \left(\frac{s_{\text{teil}}}{t_i / 1000000.0}\right) - c - o_i$$ 

Das LGS projiziert die Raumachsen über die Koeffizientenmatrix. Durch
Inversion auf dem RP2040/RP2350 isolieren sich die gehäuserelativen
Windvektoren (in $\text{m/s}$):

$$v_{x,\text{rel}} = \frac{\frac{2.0}{3.0} \cdot w_1 - \frac{1.0}{3.0}
\cdot w_2 - \frac{1.0}{3.0} \cdot w_3}{0{,}7071}$$

$$v_{y,\text{rel}} = \frac{\frac{1.0}{1{,}73205} \cdot (w_2 -
w_3)}{0{,}7071}$$

$$v_{z,\text{rel}} = \frac{\frac{w_1 + w_2 + w_3}{3.0}}{0{,}7071}$$



### 1.5 Erweiterte Vektoralgebra für den mobilen Bootsbetrieb

Wird das System mobil (z. B. auf einem Boot oder Fahrzeug) montiert,
verändern sich die Rahmenbedingungen grundlegend: Das Gehäuse erfährt
Schräglagen durch Wellen/Windkrängung, dreht sich permanent im Raum
und die Sensoren messen die Vektorsumme aus wahrem Wind und Fahrtwind
(scheinbarer Wind). Über einen Hardware-Jumper an GPIO 7 schaltet die
Firmware in den Live-Transformationsmodus.

#### A. 3D-Lagekompensation via 6-Achsen-IMU (LSM6DS3)

Bei Seegang neigt sich die Sensorebene. Die IMU liefert permanent die
Neigungswinkel $\beta_{\text{Roll}}$ (Kippen um die X-Achse) und
$\gamma_{\text{Pitch}}$ (Kippen um die Y-Achse). Bevor eine Einnordung
stattfindet, projiziert der Pico die rohen, fehlerhaften Vektoren
($v_{x,\text{rel}}, v_{y,\text{rel}}, v_{z,\text{rel}}$) über die
dreidimensionale Rotationsmatrix zurück in die hydrodynamisch flache
Erdebene:

$$v_{x,\text{eben}} = v_{x,\text{rel}} \cdot
\cos(\gamma_{\text{Pitch}}) + v_{z,\text{rel}} \cdot
\sin(\gamma_{\text{Pitch}})$$

$$v_{y,\text{eben}} = v_{x,\text{rel}} \cdot \sin(\beta_{\text{Roll}})
\cdot \sin(\gamma_{\text{Pitch}}) + v_{y,\text{rel}} \cdot
\cos(\beta_{\text{Roll}}) - v_{z,\text{rel}} \cdot
\sin(\beta_{\text{Roll}}) \cdot \cos(\gamma_{\text{Pitch}})$$

$$v_{z,\text{eben}} = -v_{x,\text{rel}} \cdot
\cos(\beta_{\text{Roll}}) \cdot \sin(\gamma_{\text{Pitch}}) +
v_{y,\text{rel}} \cdot \sin(\beta_{\text{Roll}}) + v_{z,\text{rel}}
\cdot \cos(\beta_{\text{Roll}}) \cdot \cos(\gamma_{\text{Pitch}})$$

#### B. Geografische Einnordung via Magnetometer (MMC5603NJ)

Das Magnetometer liefert im Mobilbetrieb bei jedem Messintervall den
aktuellen Azimut-Ausrichtungswinkel des Gehäuses relativ zum
magnetischen Nordpol ($\theta_{\text{Kompass}}$). Der lagebereinigte
Horizontalvektor wird über eine Rotationsmatrix in das erdfeste
Koordinatensystem gedreht:

$$v_{x,\text{erde}} = \cos(\theta_{\text{Kompass}}) \cdot
v_{x,\text{eben}} - \sin(\theta_{\text{Kompass}}) \cdot
v_{y,\text{eben}}$$

$$v_{y,\text{erde}} = \sin(\theta_{\text{Kompass}}) \cdot
v_{x,\text{eben}} + \cos(\theta_{\text{Kompass}}) \cdot
v_{y,\text{eben}}$$

#### C. Wahre Windberechnung via GPS-Vektorsubtraktion (True Wind)

Das integrierte GPS-Modul liefert im mobilen Betrieb die Live-Daten
für die Geschwindigkeit über Grund ($v_{\text{SOG}}$ in $\text{m/s}$)
und den Kurs über Grund ($\theta_{\text{COG}}$). Der physikalisch
wahre Windvektor $\vec{v}_{\text{wahr}}$ (True Wind), befreit vom
fahrtbedingten Eigenwind, berechnet sich durch subtraktiven
Vektorausgleich:

$$v_{x,\text{wahr}} = v_{x,\text{erde}} - v_{\text{SOG}} \cdot
\cos(\theta_{\text{COG}})$$

$$v_{y,\text{wahr}} = v_{y,\text{erde}} - v_{\text{SOG}} \cdot
\sin(\theta_{\text{COG}})$$

Daraus extrahieren sich die finalen, wahren MySensors-Daten:

$$\text{Wahre Windgeschwindigkeit} = \sqrt{v_{x,\text{wahr}}^2 +
v_{y,\text{wahr}}^2}$$

$$\text{Wahre Windrichtung} = \text{atan2}(v_{y,\text{wahr}},
v_{x,\text{wahr}}) \cdot \frac{180}{\pi}$$


### 1.6 Bidirektionaler Internet-DEM-Höhenabgleich (Dachmodus)

Befindet sich das System im stationären Dachbetrieb (Jumper offen),
bleibt die GPS- und IMU-Schiene zur Maximierung der Energieeinsparung
über den BSS84-MOSFET kompromisslos abgeschaltet ($0\text{
Watt}$). Einmalig während des manuellen 3-Sekunden-Tastendrucks (im
Werks-Kalibriermoment) wird das GPS hochgefahren und sendet die
exakten X/Y-Koordinaten (Breiten- und Längengrad) an das
FHEM-Zentral-Gateway.  FHEM empfängt diese Daten und führt über eine
integrierte Internetschnittstelle asynchron einen Request ($C\_REQ$)
an ein Digitales Höhenmodell (Digital Elevation Model – DEM) aus. Das
über die Radarvermessung (SRTM) geeichte Höhenmodell gibt die
zentimetergenaue Geländehöhe $h$ in Metern über Normalnull per Funk an
den Pico zurück, welcher diese dauerhaft im Flash speichert.  Der
BME280 misst im täglichen Routinebetrieb den absoluten lokalen
Stationsluftdruck ($p_{\text{abs}}$). Die Transformation des Drucks
auf Meereshöhe ($p_0$) zur fehlerfreien Luftdruckprognose in FHEM
erfolgt über die barometrische Höhenformel:

$$p_0 = p_{\text{abs}} \cdot \left(1 - \frac{0{,}0065 \cdot
h}{T_{\text{BME280}} + 0{,}0065 \cdot h +
273{,}15}\right)^{-5{,}255}$$


### 1.7 Hybrides Regenmess-Konzept (Wippe & Piezo-Sensorik)

Das vergrößerte 190-mm-Gehäuse fängt den Niederschlag über die
$2\text{ cm}$ breite Dachrinne auf. Jedes Gramm Wasser, das auf die
schattenfreie Solarzellen-Abdeckung trifft, läuft wind- und
schwerkraftbedingt in diese Rinne ab. Die effektive meteorologische
Wasserbezugsfläche entspricht somit der vollen Kreisfläche des
Gehäuses:

$$A_{\text{Auffang}} = \pi \cdot R_{\text{gesamt}}^2 = \pi \cdot
(0{,}095\text{ m})^2 \approx 0{,}02835\text{ m}^2$$

#### Duales Erfassungsprinzip

Das gesammelte Wasser wird über drei getrennte Schläuche in den
isolierten Nassbereich des neuen Unterteils geleitet. Dort wird es
über ein hybrides Messprinzip ausgewertet:

   1. Stationäre Absolut-Referenz (Kippwippe): Das Wasser wird im
      Unterteil gebündelt und tropft auf eine mechanische
      Zwei-Schalen-Wippe. Bei Erreichen des Zielvolumens
      (z. B. $5\text{ ml}$) kippt diese um und bewegt einen
      Neodym-Magneten berührungslos an einem digitalen Hall-Sensor
      vorbei. Dies löst einen präzisen Interrupt auf Core 0 des Picos
      aus.
   2. Akustische Echtzeit-Messung (Piezo-Element): Ein hauchdünnes
      Piezo-Element klebt mittig unter dem oberen
      Acrylschutzglas. Jeder Tropfenaufprall erzeugt mechanische
      Schwingungen im Acryl, die sich kreisförmig im Brennglasprinzip
      zur Mitte ausbreiten. Core 1 des Picos tastet das analoge Signal
      mit $10\text{ kHz}$ ab und berechnet die kinetische Energie
      (Amplitude und Integral).
   3. Feldkalibrierung & Live-Eichung: Im stationären Betrieb dient
      die Wippe als unbestechlicher „Lehrer“. Bei jedem Wippenschlag
      eicht der Pico das vom Piezo-Sensor kumulierte Signalintegral
      live im laufenden Betrieb nach.
   4. Mobiler Filtermodus: Im mobilen Betrieb (Jumper geschlossen)
      wird das Signal der Wippe komplett ignoriert, um Fehlzählungen
      durch Fahrzeugschwingungen auszuschließen. Die Regenmessung
      erfolgt rein akustisch über das geeichte Piezo-Element, wobei
      ein digitaler Bandpass-Filter das mechanische Rütteln des Windes
      an den Masten herausrechnet.



