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<<
oh hups habs ins falsche forum gehauen tschuldigung
Ö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.
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)<<
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?
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?
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.
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.
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.
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.
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
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!
Na, dann poste mal den relevanten Code, also von der Berechnung bis zur Ausgabe. Und die Deklarationen der beteiligten Variablen nicht vergessen.
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!
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 :)
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
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!
@ Ingo Oberbichler (Gast) >habe auch einen LPC935 und ich weiß nicht wie ich die Temperatur >anzeigen kann, Mit Festkommaarithmetik MFG Falk
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.