Forum: Compiler & IDEs Taupunktberechnung von Sensirion (SHT71)


von D. R. (ace07)


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?

von Jochen (Gast)


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

von Siegfried (Gast)


Lesenswert?

Da stimmt etwas nicht. Wo wird denn dew_point berechnet?

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;
}

von D. R. (ace07)


Lesenswert?

Ohh,

hier noch mal ohne Tippfehler:

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

von Karl H. (kbuchegg)


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.

von D. R. (ace07)


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

von Karl H. (kbuchegg)


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.

von D. R. (ace07)


Lesenswert?

Naja mit Temperatur und Luftfuchtigkeit Berechnung und dem dazugehörigen 
Main + Ausgabe am Display bin ich bei 91%.

Die grauen Haare wachsen also schon....gibt es eventuell eine elegantere 
Lösung?

von gast (Gast)


Lesenswert?

Du könntest den Log folgendermaßen loswerden:

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

log10(h) = log2(h)/log2(10)

Log2 ist wahrscheinlich leichter zu berechnene (bitpositionen)

von D. R. (ace07)


Lesenswert?

Wie gesagt am log10 liegt es nicht, auch wenn ich den ändere komm ich 
auf maximal 10% ersparniss.

von gast (Gast)


Lesenswert?

Du kannst natürlich alles auf Integer-Rechnung umstellen und für den Log 
eine statische Tabelle anlegen.

Teste mal, was passiert, wenn Du alle Variablen als int deklarierst und 
den Log rausnimmst. Wieviel Flash hast Du dann belegt?

von spess53 (Gast)


Lesenswert?

Hi

>Die grauen Haare wachsen also schon....gibt es eventuell eine elegantere
>Lösung?

Nicht eleganter, aber einfacher: ATMega168 oder ATMega328

MfG Spess

P.S. In Assembler brauche ich ca. 3k.

von D. R. (ace07)


Lesenswert?

Passt! Programm läuft!

von Ironman (Gast)


Lesenswert?

Hallo D.R.

wie hast Du letztendlich das Probelm gelöst? Ich stehe gerade vor dem 
gleichen Problem.

Gruß Ironman

von kutte (Gast)


Lesenswert?

guck mal hier:
http://www.tuxgraphics.org/common/src2/article07091/eth_rem_dev_sensirion-3.3.tar.gz
in der Datei ist f.d. Taupunktberechnung (dewpoint calculation) eine 
Routine enthalten, die nur Integerarithmetik benötigt. Allerdings ist 
die Genauigkeit dann nur (??) noch 5 %.
Läuft bei mir bestens.
Kutte

von Kirschherz (Gast)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.