Luftdruckmessung mit MPX4100A und AVR-NETIO

Begonnen von betateilchen, 12 Juli 2013, 13:25:38

Vorheriges Thema - Nächstes Thema

betateilchen

Hier zwei Codeschnipsel, mit denen sich aus den Messwerten eines Luftdrucksensors MPX4100 sowohl der gemessene absolute Luftdruck als auch der daraus ermittelte relative Luftdruck errechnen lassen.

Die Anbindung des Sensors erfolgt an das AVR-NETIO wie im Wiki beschrieben, der so ermittelte portvalue wird dann zur Luftdruckberechnung verwendet.

Der Sensor selbst benötigt nur eine minimale Aussenbeschaltung (drei Kondensatoren) und wurde auch deshalb gewählt, weil er schon weitgehend temperaturkompensiert und kalibriert ist. Ich denke, viel einfacher kann man die Luftdruckmessung nicht mehr machen.



Für den gemessenen absoluten Luftdruck absDruck() wird der portvalue als Parameter übergeben und anhand der Umrechnungsformel aus dem Sensordatenblatt verarbeitet.


sub
absDruck($){
my $mpx = $_[0];
my $Pa = (($mpx/1024)+0.1518)/0.001059;
return int($Pa);
}




Für den relativen Luftdruck relDruck() werden drei Parameter benötigt: portvalue, Aussentemperatur am Messort, Höhe des Messortes über N.N.
Die Werte Temperatur und Höhe haben direkten Einfluß auf die Berechnung des relativen Luftdrucks, der zu Vergleichszwecken immer auf Meereshöhe bezogen und temperaturabhängig ist.
Eigentlich spielt auch die Luftfeuchte noch eine Rolle, aber der Einfluß ist so marginal, dass er sich lediglich in Nachkommastellen auswirkt. Deshalb habe ich darauf verzichtet, diesen Parameter zu berücksichtigen.

Die Umrechnung selbst erfolgt anhand der Empfehlung des Deutschen Wetterdienste, die auch in Wikipedia gut erklärt ist.


sub
relDruck($$$){
# Messwerte
my $Pa   = absDruck($_[0]);
my $Temp = $_[1];
my $Alti = $_[2];

# Konstanten
my $g0 = 9.80665;
my $R  = 287.05;
my $T  = 273.15;
my $Ch = 0.12;
my $a  = 0.065;
my $E  = 0;

if($Temp < 9.1){
   $E = 5.6402*(-0.0916 + exp(0.06 * $Temp));
   }
else {
   $E = 18.2194*(1.0463 - exp(-0.0666 * $Temp));
   }

my $xp = $Alti * $g0 / ($R*($T+$Temp + $Ch*$E + $a*$Alti/2));
my $Pr = $Pa*exp($xp);
return int($Pr);
}



Viel Spaß damit - vielleicht nützt es ja jemandem.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

C64Emulator

Zitat von: betateilchen schrieb am Fr, 12 Juli 2013 13:25Der Sensor selbst benötigt nur eine minimale Aussenbeschaltung (drei Kondensatoren) und wurde auch deshalb gewählt, weil er schon weitgehend temperaturkompensiert und kalibriert ist. Ich denke, viel einfacher kann man die Luftdruckmessung nicht mehr machen.
Na, da lässt sich drüber streiten...
Ich habe ein Breakout-Board mit einem Pressure Sensor von Bosch (BMP180) an den I2C-Bus des RaspberryPi angelötet und kann den Luftdruck auch messen. Bilder und HowTo gibt es im Raspberry Pi-Bereich des FHEM-Forums
War auch ziemlich einfach...
:-)
Helmut.


betateilchen

ZitatNa, da lässt sich drüber streiten...

Ich sehe da keinen Grund zum Streiten.

Deine Lösung (ich hatte sie vorher schon gelesen) ist genau so einfach und das ist doch prima.  Es kommt in erster Linie darauf an, welche Hardware man als Basis zur Verfügung hat und welchen Sensor man verwenden möchte. Und auf den Preis des Sensors :)

Ausserdem brauche ich für meine Lösung keine Codeschnipsel ausserhalb von FHEM und keine Systemaufrufe ins Betriebssystem.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!