Taupunktberechnung von Sensirion (SHT71)

#1262764
Lesenswert?

Hallo

ich benutze einen SHT71 Feuchte und Temperatursensor, von Sensirion zum 
Messen der Lufttemperatur und und Luftfeuchtigkeit.
Beide Werte werden auf einem 2x16 Display ausgegeben. Als µC verwende 
ich einen ATmega88 mit 8kByte flash.
Anhand der Werte lässt sich nun der Taupunkt berechnen. Sensirion 
beietet hier für ein Formel. Nur wenn ich die Formel dann in meinen µC 
übertrage, benötigt allein diese Berechnung mehr als 60% meines flash 
Speichers.Somit ist es mir unmöglich mein Programm zu erweitern.

Hier der Sample Code von Sensirion für den SHT 71:

float calc_dewpoint(unsigned int h , int t)
{
float H,dew_point;
H = (log10(RH)-2.0)/0.4343+(17.62*t)/(243.12+t);
td = 243.12*H/(17.62-H);
return dew_point;
}

Hier meine Frage: Wieso Benötigt diese einfache Rechnung so viel 
Speicher?
Kann man die Rechnung Vereinfachen? Und woran kann man sich dann 
orientieren?
Gast #1262787
Lesenswert?

Hallo D.R. ,
ich habe die Berechnung irgendwo aus dem Internet
und funktioniert gut.

double ausw_taupunkt(void)
  {
  double logEx;
  double taupunkt;
  double h;
  double t;

  t = temperatur;
  h = feucht_true;

  logEx = 0.66077+7.5*t / (237.3+t) + (log10(h)-2);

  taupunkt = (logEx - 0.66077)*237.3/(0.66077+7.5-logEx);
//------------
  minus_tau = 0x00;
  if (taupunkt <= 0)        // Minustemperatur
    {
    taupunkt = 0 - taupunkt;
    minus_tau = 0x01;
    }



//------------
  ausw_wandeln(taupunkt);
  return 0;
  }


Gruß

Jochen
#1262812
Lesenswert?

D. R. schrieb:

> Hier meine Frage: Wieso Benötigt diese einfache Rechnung so viel
> Speicher?

Flaoting Point Rechnerei ist für einen Mega88 nun mal heftig.
Aber 60% ist dann schon ziemlich viel. Hast du die Optimierung 
eingeschaltet?


> Kann man die Rechnung Vereinfachen?

log10(RH)

Geh ich recht in der Annahme, dass RH eine Konstante ist (irgendeine 
Materialkonstante)?
Wenn ja, dann nimm deinen Taschenrechner, rechne den Wert aus und setz 
ihn mal direkt ein -> schon fällt die Logarithmusfunktion aus deinem 
Programm raus -> Programm wird kleiner.

Auch das hier

(log10(RH)-2.0)/0.4343

ist letztendes alles konstant und kann daher im Vorfeld berechnet 
werden.

Der Rest sind dann ein paar Grundrechenarten. Nichts dramatisches mehr.
#1262823
Lesenswert?

Ja die Optimierung ist eingeschaltet.

am log10 liegt das Problem nicht, das mit dem ausklammern hab ich schon 
getestet. Probleme bereitet diese Zeile:


H = (log10(h)-2.0)/0.4343+(17.62*t)/(243.12+t);

Ich hab auch schon den ATmega88 gegen einen Atmega168(16kB flash) 
getauscht um mehr flash zu haben.Nur leider wird das Prorgramm sehr 
langsam.
Leider kenn ich mich auch nicht mit den Timer und Takt Werten aus um den 
ATmega168 optimal anzupassen.

Als Experimentierumgebenung benutze ich ein MiniMexle.

RH ist eingentlich h (tippfehler)

t is die gemssene Temperatur und h die gemessene Luftfecuhte
#1262871
Lesenswert?

Dann wirst du wohl mit den 60% leben müssen.
Das meiste davon werden Bibliotheksfunktionen sein, die nur ein einziges 
mal eingebunden werden und auch nur einmal richtig Platz benötigen, 
selbst wenn sie noch 20 mal aufgerufen werden.

D.h. wenn du weiterentwickelst, wird dein Speicherverbrauch nicht weiter 
so dermassen krass anwachsen, sondern wieder moderat in die Höhe gehen. 
Selbst wenn da noch weitere Floating Point Berechnungen dazukommen.

Und 60% Flash-Verbrauch ist noch nichts worüber du dir graue Haare 
wachsen lassen musst. Nervös brauchst du erst werden, wenn du die 95% 
erreichst.
Gast #1679648
Lesenswert?

Hallo Leute,

das Thema wird in den nächsten Tagen für mich auch interessant wenn die 
Sensoren endlich kommen - ich werd es mit einem Arduino Duemilanuove 
realisieren - hat nen ATM328 drauf.

Aber haben nicht die SHT´s eh nur 5% Genaugkeit von Hause aus??
Was nehmt Ihr für Sensorleitungen? Sollten das Cat5 Kabel sein?

Grüße, Kirschherz

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren