Forum: Mikrocontroller und Digitale Elektronik char in Float-Wert umwanden und auf LCD ausgeben


von Markus S. (e-moler)


Lesenswert?

hallo zusammen
ich bastle gerade ein Themperaturmessgerät für Körpertemperatur.
Dazu verwende ich den LPC935 und die Keil µVision 3 
Entwicklungsumgebung.
bis jetzt habe ich den Sensor die Messschaltung und ausgabe auf einem
4x20 LC-Display soweit parad.
die Messwerte leifert mir der integrierte AD-Wandler als char-Wert

Beschreibung zum Messvorgang:
es wird sekundenweise ein Wert aufgezeichnet und mit dem vorherigen 
verglichen.
steigt nun der Wert nicht mehr an (Temperaturgang abgeschlossen)
werten noch fünf weitere Werte aufgezeichnet.
bis dahin hab ichs!
jetzt habe ich mir vorgestellt die letzten fünf Werte zusammen zu zählen 
dann durch fünf teilen um so einen möglichst genauen wert zu erhalten.

Jetzt die Frae:
wie recne ich fünf char-Werte zusammen, muss ich das Wergebniss in eine 
int-Variable schreiben, wie bekomme ich das ganze schließlich in eine 
float-Variable und wie gebe ich das auf dem Display aus!

>>haut rein<<

von Markus S. (e-moler)


Lesenswert?

oh hups habs ins falsche forum gehauen tschuldigung

von Philipp B. (philipp_burch)


Lesenswert?

Öhm...
1
char temp[5];
2
3
//einlesen...
4
5
uint16_t avg = 0;
6
for (uint8_t i = 0; i < 5; ++i) {
7
  avg += temp[i];
8
}
9
avg /= 5;

Etwa so. Allerdings würde ich nur vier oder gleich acht Werte mitteln, 
dann sparst du dir die Division (Einfaches shift tut's dann auch).
Wozu eigentlich das "Float" im Titel? Geht doch alles wunderbar mit 
Ganzzahlen.

von Markus S. (e-moler)


Lesenswert?

auf dem LCD soll mir die Körpertemperatur ausgeeben werden und das auf 
ein zehntel genau desswegen habe ich an float gedacht.
und was meinst du mit: >>(Einfaches shift tut's dann auch)<<

von Stefan E. (sternst)


Lesenswert?

Markus Spitznagel wrote:
> auf dem LCD soll mir die Körpertemperatur ausgeeben werden und das auf
> ein zehntel genau desswegen habe ich an float gedacht.

Wir können dir deine Frage nicht beantworten, weil wir ja nicht wissen, 
was dein ADC überhaupt genau ausspuckt. Welcher Temperatur entspricht 
denn z.B. ein ADC-Wert von 147?

von Markus S. (e-moler)


Lesenswert?

also bei 35°C   sind es 0x46 bis  0x49
     bei 35,1°C sind es 0xA0 bis  0xA4
     bei 35,2°C sind es 0x0xA5 bis  0xAA
und so weiter
es sind immer 4 schritte je 0,1°C
kann man das vernünftig umrechnen?

von Stefan E. (sternst)


Lesenswert?

Markus Spitznagel wrote:
> also bei 35°C   sind es 0x46 bis  0x49
>      bei 35,1°C sind es 0xA0 bis  0xA4
>      bei 35,2°C sind es 0x0xA5 bis  0xAA
> und so weiter
> es sind immer 4 schritte je 0,1°C

Und der Bereich 4A bis 9F? Und von 46 bis 49 sind es 3 Schritte, von A5 
bis AA dagegen sind es 5. Ok, sind vielleicht Schreibfehler.
Wenn der Sensor linear arbeitet, und du tatsächlich immer 4 Schritte je 
0,1°C hast, dann ist die Umrechnung sehr einfach:
float temp = NULL_Temp + (float)ADC_Wert * 0.025;
NULL_Temp ist dabei die Temperatur, die einem ADC-Wert von 0 entspricht.
Wenn der Sensor zwar linear arbeitet, es aber nicht genau 4 Schritte pro 
0,1°C sind, geht es so:
float temp = NULL_Temp + (float)ADC_Wert * Temp_Range / 255.0;
Temp_Range ist die Temperaturdifferenz zwischen den ADC-Werten 0 und FF.

von Markus S. (e-moler)


Lesenswert?

ja waren schreibfehler meinerseits es sind immer 4-Schritte je zehntel 
Grad C
ich wrd das gleich mal testen ob das da geht!
jetzt ist da bei mir grad noch ein problem aufgetaucht:
mein 4x20 LC-Display malt 2 Streifen über den Text in der ersten und der 
dritten Zeile! Dich streifen sind so eher durchschimmernd also man kann 
den Text grad noch so lesen!
ind noch was:  wenn ich schreibe
  printf("%2.f",temperatur);
müsste mir doch eine Zahl mit zwei nachkommastellen angezeigt werden.
ichhab aber rur ein Zahlenwert vor dem komma und dahinter eine handvoll 
nullen.

von Mike (Gast)


Lesenswert?

Du könntest auch versuchen das mit Ganzkommazahlen hinzubekommen. Für 
die Nachkommastelle einfach alles mit 10 erweitern (so das dann z.B. 350 
herauskommt). Damit ersparst du dir die FP Bibliotheken und eventuelle 
Rundungsfehler.

> mein 4x20 LC-Display malt 2 Streifen über den Text in der ersten und der
> dritten Zeile! Dich streifen sind so eher durchschimmernd also man kann

Ich würde sagen Kontrast zu hoch und Display nicht richtig initialisiert 
bzw. defekt.

von Markus S. (e-moler)


Lesenswert?

also zuerstmal @ Stefan die umrechnung klappet wunderbar, ober TOP!
jetzt ist das noch so ein problem mit dem anzeigen!
wenn ich der floatVariablen direckt einen Wert zuweise dann zeigt es die 
auch auf dem Display an aber wenn ich aus der Berechnung das ergebniss 
reinschreibe zeigts  nur 0.0000000 auf dem Disolay an!

@Mike ichabs grad eben nochmal alles getestet!
initialisiert wirds es prächtig, den kontrast hab ich verstell- dadurch 
geht es aber nicht weg. komischerweise kommt das nicht bei allen 
DisplayAusgaben vor nur manchmal. ichhab eigentlich befürchtet das 
Display vielleicht kaputt ist weil ich gestern, mit einem aus Kunstfaser 
gestrickten Pulli bekleidet, der immer gerne knistert, mit  dem LCD 
herumhantiert habe, das ist aber wahrscheinlich glücklicherweise nicht 
der Fall.

von Karl H. (kbuchegg)


Lesenswert?

Markus Spitznagel wrote:
> ind noch was:  wenn ich schreibe
>   printf("%2.f",temperatur);
> müsste mir doch eine Zahl mit zwei nachkommastellen angezeigt werden.

Nö.
%2.f
bedeutet: Ausgabe einer Gleitkommazahl, wobei die Zahl in einem
Feld der Breite 2 ausgegeben werden soll. Bei der Feldbreite von
2 sind eventuelles Vorzeichen und Dezimalpunkt bereits enthalten.
Wenn du 2 Nachkommastellen haben willst:
%.2f

von Markus S. (e-moler)


Lesenswert?

ou ja haste recht! Ich habs dann auch gemerkt, als ich nochmal meine 
Unterlagen durforstet habe hab ich die sach entdeckt.
 trotzdem mercy!
aber das problem mit der 00.000000 - anzeige hab ich immer noch!

von Stefan E. (sternst)


Lesenswert?

Na, dann poste mal den relevanten Code, also von der Berechnung bis zur 
Ausgabe. Und die Deklarationen der beteiligten Variablen nicht 
vergessen.

von Markus S. (e-moler)


Lesenswert?

jop aber gerne doch!

float temp;
char NULL_Temp = 34;
char ADC_Wert = 0x60;

temp = NULL_Temp + (float)ADC_Wert * 0.025;

in temp steht jetzt   36.4   drin!

dann hab ich noch ausprobiet das ergebniss in eine andere Variable zu 
scheiben und dann auszugeben:

float temper;
temper = temp;
printf ("Temperatur %.2f °C", temp);

doch leider geht auch das nicht!

von Johnny Maxwell (Gast)


Lesenswert?

Mike schrieb:
> Damit ersparst du dir die FP Bibliotheken und eventuelle
> Rundungsfehler.

Naja, die FP Bibliothek spart man sich dadurch wirklich aber 
Rundungsfehler werden dadurch keineswegs vermieden. Im Gegenteil, man 
rechnet ja nur noch mit z.B. 0.1 Grad Genauigkeit.

Trotzdem wäre für diesen Fall eine Ganzzahlrechnung sicher ausreichend.

Andererseits, wenn genügend Platz da ist und da die Temperaturmessung ja 
sicher auch nicht so zeitkritisch ist - warum nicht einfach floats 
benutzen und sich das Leben einfacher machen :)

von Ingo Oberbichler (Gast)


Lesenswert?

Hi,
habe auch einen LPC935 und ich weiß nicht wie ich die Temperatur 
anzeigen kann, könntest du mir dein c-File schicken?

Email: ingo.oberbichler@htlpinkafeld.at

Danke im Voraus

von Markus S. (e-moler)


Lesenswert?

so lieber Ingo
erst mal musste mir erraten wie du die Temperatur messen willst
über einen Analogeingang, oder einen Sensor über I2C beispielsweise.
Das Programm muss ich erst mal suchen, leider habe ich nur wenig zeit 
mich meiner Leidenschaft zu frönen, so kommt es das ich nicht alles grad 
parad habe.
so als erstes plauderst du mal aus wie genau du vorgehen willst und dann 
kann dir auch gezielter geholfen werden!
und nur keine Angst vor unprofessionellen Formulierungen, das passiert 
auch den besten hier!

von Falk B. (falk)


Lesenswert?

@  Ingo Oberbichler (Gast)

>habe auch einen LPC935 und ich weiß nicht wie ich die Temperatur
>anzeigen kann,

Mit Festkommaarithmetik

MFG
Falk

von Ingo Oberbichler (Gast)


Lesenswert?

Die Temp. wird über einen Sensor über I2C gemessen. (TMP100 von Texas 
Instruments)
Der besitzt 9- bis 12-Bits für die Ausgabe, wobei ich nicht genau weiß 
wie ich die einstelle.
Bei 12bit - Ich glaube das ist standardmäßig eingestellt - ist die 
Schrittweite 0.0625°C:
128°   0111 1111 1111     7FF
0.0°   0000 0000 0000     000
-128°   1000 0000 0000     800

Ich bin mir ziemlich sicher, dass ich mit I2DAT die hinteren 8bit 
erreiche (Die Messungen, die ich damit gemacht habe müssten stimmen), 
wie ich zu den anderen bits komme, weiß ich aber nicht.

Die Temp. will ich dann auf 8Leds Dual ausgeben.

Ich hoffe du kannst mir weiterhelfen.

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.