Taupunkt und absolute Luftfeuchtigkeit berechnen mit perl


Für eine intelligent Kellerlüftungsteuerung muss das perl skript um eine Berechnung des Taupunktes (oder der absoluten Luftfeuchtigkeit) erweitert werden:



#! C:\perl\bin\perl.exe

use strict;
use warnings;

use Win32::SerialPort;
my $port = Win32::SerialPort->new("COM5");


sub 
af_td ($$)
{
# Formeln von http://www.wettermail.de/wetter/feuchte.html

# r = relative Luftfeuchte
# T = Temperatur in °C
        my ($T, $rh) = @_;

# a = 7.5, b = 237.3 für T >= 0
# a = 9.5, b = 265.5 für T < 0 über Eis (Frostpunkt)
        my $a = ($T > 0) ? 7.5 : 9.5;
        my $b = ($T > 0) ? 237.3 : 265.5;

# SDD = Sättigungsdampfdruck in hPa
# SDD(T) = 6.1078 * 10^((a*T)/(b+T))
my $SDD = 6.1078 * 10**(($a*$T)/($b+$T));
# DD = Dampfdruck in hPa
# DD(r,T) = r/100 * SDD(T)
my $DD  = $rh/100 * $SDD;
# AF(r,TK) = 10^5 * mw/R* * DD(r,T)/TK; AF(TD,TK) = 10^5 * mw/R* * SDD(TD)/TK
# R* = 8314.3 J/(kmol*K) (universelle Gaskonstante)
# mw = 18.016 kg (Molekulargewicht des Wasserdampfes)
# TK = Temperatur in Kelvin (TK = T + 273.15)
my $AF  = (10**5) * (18.016 / 8314.3) * ($DD / (273.15 + $T));
my $af  = sprintf( "%.1f",$AF); # Auf eine Nachkommastelle runden

# TD(r,T) = b*v/(a-v) mit v(r,T) = log10(DD(r,T)/6.1078)
my $v   =  log10($DD/6.1078);
my $TD  = $b*$v/($a-$v);
my $td  = sprintf( "%.1f",$TD); # Auf eine Nachkommastelle runden

# TD = Taupunkttemperatur in °C
# AF = absolute Feuchte in g Wasserdampf pro m3 Luft
        return($af, $td);

}

sub 
log10 {
        my $n = shift;
        return log($n)/log(10);
}


$port->baudrate(4800);
$port->databits(8);
$port->parity("none");
$port->stopbits(1);
$port->write_settings || undef $port;



$port->write(pack( 'H[08]', '0202fb00' )); #hexmode
$port->write(pack( 'H[08]', '0202f201' )); #Wetterdaten sofort ausgeben

$port->are_match(pack( 'H[08]', '020ca201' ));

 
while (1)
{
my $c = $port->lookfor(14);
if (defined($c) && length($c) != 0) {
while (1)
{
my $d = $port->read(13);
if (defined($d) && length($d) != 0) {
$c = $c . $d;
}
last if length($c) >= 10
}
print unpack("H[18]", $c) ;
my $addr = unpack("(H)2", substr $c, 0, 1) ;
my $temp = unpack('s', pack( 'S', unpack("n", substr $c, 1, 2)))/10;
my $humidity = unpack("n", substr $c, 3, 2)/10;
my ($af, $td) = af_td($temp, $humidity);

print "a: $addr t: $temp h: $humidity af: $af td: $td\n";
}

  }




Keine Kommentare:

Kommentar veröffentlichen