Forum: Mikrocontroller und Digitale Elektronik Wie kann man eine Temperatur vergleichen und berechnen?


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Christop (Gast)


Bewertung
-1 lesenswert
nicht lesenswert
Hallo,

wenn man eine Temperatur von einem DS18S20 in einem char temp[10] hat..

und diese nun vergleichen möchte wie stellt man das an?

ich suche eine funktion mit der ich die Temperaturen vergleichen kann..

Also sowas:

Wenn TEMPERATUR größer oder kleiner als Y dann

demnach also sowas wie

char temp[10] = "23.4857";
char tempold[10] = "23.4557";

char Y[10] = "0.05";

if ( (temp - tempold) > || (tempold - temp) > Y ) {

}


Vielen Dank

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Bewertung
4 lesenswert
nicht lesenswert
Christop schrieb:
> wenn man eine Temperatur von einem DS18S20 in einem char temp[10] hat..

Ein DS18S20 gibt seinen Temperaturwert doch nicht als char[10] aus, 
sondern als Binärzahl. Diese lassen sich deutlich sinnvoller vergleichen 
als irgendwelche textuellen Darstellungen, die daraus bereits berechnet 
worden sind.

Setz also lieber an dieser Stelle auf.

Wenn das nicht geht, musst du irgendwie (bspw. per sscanf()) aus deiner 
Textdarstellung wieder eine Zahl basteln, die das Programm dann 
vergleichen kann.

von Jim M. (turboj)


Bewertung
2 lesenswert
nicht lesenswert
Christop schrieb:
> wenn man eine Temperatur von einem DS18S20 in einem char temp[10] hat..
> und diese nun vergleichen möchte wie stellt man das an?

Ist wie Hose mit Kneifzange anziehen. Geht irgendwie, aber es gibt eine 
bessere Lösung.

Aus dem DS18S20 fällt normalerweise eine vorzeichenbehaftete 16-bittige 
Zahl raus, die man direkt vergleichen könnte.

Hat man das aber als String vorliegen, muss man zuerst den String wieder 
in eine Zahl verwandeln (float oder int) um diese dann vergleichen zu 
können.

von c-hater (Gast)


Bewertung
-2 lesenswert
nicht lesenswert
Jim M. schrieb:

> Hat man das aber als String vorliegen, muss man zuerst den String wieder
> in eine Zahl verwandeln (float oder int) um diese dann vergleichen zu
> können.

Nicht unbedingt. Wenn das Format "fix" ist, also der Dezimaltrenner 
immer an derselben Stelle steht, kann man direkt einen Stringvergleich 
verwenden. Aber klar, sehr sinnvoll ist das nicht, insbesondere dann 
nicht, wenn der Ausgangswert eine wunderhübsch kompakte Binärzahl ist. 
Dann nimmt man natürlich für alle Rechen- und Vergleichsoperationen 
diese Zahl.
In Strings wandelt man nur, wenn irgendwas menschenlesbar auszugeben 
ist. Oder eventuell auch zur Serialisierung.

von Christoph (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Ok... Ja dann muss ich mal schauen wo ich diese Zahl finde... Und wie 
man diese dann vergleicht...

Warum ist das denn in C so "kompliziert"?

Ich bin php verwöhnt....
$var = 23.4726;

$var2 = 22.3857;

$abzug = 0.4;

if ( $var > $var2) {
  if ( ( $var - $var2) > $abzug  OR ( $var2 - $var) > $abzug) {
    // Tue was
  } 


Und da kann ich auch schreiben var.... =... "12" oder '12' oder nur 12 
oder 12.8473 und und und.... Nur kein komma (,) aber ansonsten ist php 
das alles egal....

Arrays vergleicht man da auch "mal eben"....

Also gibt's in C nichts "einfaches"?!

von Wolfgang (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Christoph schrieb:
> Warum ist das denn in C so "kompliziert"?

Du fragst nach dem DS18B20 und der liefert dir 12 Bit, verpackt in 2 
Registern mit 8 Bit. Normalerweise wird das in eine vorzeichenbehaftete 
16 Bit Variable eingelesen. Alles andere passiert in deiner Software.
Zwei 16 Bit Integerzahlen zu vergleichen ist eine der elementarsten 
Funktionen auf einem µC.

von Peter D. (peda)


Bewertung
2 lesenswert
nicht lesenswert
Christop schrieb:
> char temp[10] = "23.4857";
> char tempold[10] = "23.4557";
>
> char Y[10] = "0.05";

Warum denn von hinten durch die Brust ins Auge, die Strings müssen doch 
vorher mal als float vorgelegen haben.
Der DS18S20 liefert keine Strings, sondern Ganzzahl in 0,5°C Schritten.

Nimm float, dann kannst Du auch vergleichen.
float temp = 23.5;
float tempold = 23.5;
float Y = 0.5;

: Bearbeitet durch User
von Wegstaben V. (wegstabenverbuchsler)


Bewertung
0 lesenswert
nicht lesenswert
Christop schrieb:
> char temp[10] = "23.4857";
> char tempold[10] = "23.4557";
>
> char Y[10] = "0.05";

Du solltest (neben der Zahlendarstellung) auch mal deinen Datenbereich 
überdenken.

Das Datenblatt zum DS18S20 meint dazu:
•   Measures Temperatures from -55°C to +125°C
(-67°F to +257°F)
•  ±0.5°C Accuracy from -10°C to +85°C

Deine vermeintliche Genauigkeit von 4 Nachkomma-Stellen ist also ... 
Quatsch. Die genaue Temperatur kann ja bis 0,5 Grad Celsius vom 
tatsächlichen Wert abweichen, und das noch nicht mal linear (siehe 
"typical error curve" im Datenblatt), und auch nicht (von Bauteil zu 
Baulteil) inzugesicherter identischer Abweichung.

Oder möchtest du in einem Messlabor den Termperaturfühler gegen exakte 
Temperaturwerte kalibrieren? Da wirst du auch mit gutem Messwerkzeug und 
Referenztemperaturen vermutlich kaum die 2. Nachkommastelle exakt 
ermitteln können. Ob deine Messaufbau aufgrund der gegebenen 
Einbausituation etc. wirklich den tatsächlichen Temperaturwert anzeigt, 
ist ja noch mal eine andere Thematik.

Neben der vermeintlich exakten Ermittlung (und Verrechnung!) der 
Temperaturwerte wirst du die ermittelten Temperaturen vielleicht auch 
darstellen wollen. Zumindest mich würde es wuschig machen, wenn ich da 4 
Nachkommastellen rumflirren und rumzappeln sähe.

Das mit deinen 4 Nachkommastellen wäre ähnlich, als ob du einen 
Geschwindigkeits-Messwert aufnehmen wolltest, und dann ermittelst, das 
z.B. dein Auto momentan "genau" 23.4857 Km/Std fährt.


--> Typischerweise reicht da 1 oder 2 Nachkommastellen aus, und dann 
kannst du auch gleich deinen Datentypen dazu geeignet wählen.

: Bearbeitet durch User
von MaWin (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Christop schrieb:
> ich suche eine funktion mit der ich die Temperaturen vergleichen kann..

Du suchst ein Anfänger-Einführungsbuch in Grundlagen des Programmierens 
in C.

Ob eine Zahl eine Temperatur, in °C oder Millikelvin, oder eine 
Geschwindigkeit oder Zeitraum repräsentiert, ist einer 
Programmiersprache übrigens egal.

Entscheidend ist, dass man Zahlen vergleichen will.

Ein char-Array ist aber keine Zahl, sondern ein String.

Beitrag #6397104 wurde von einem Moderator gelöscht.
von Stefan ⛄ F. (stefanus)


Bewertung
0 lesenswert
nicht lesenswert
Christoph schrieb:
> Warum ist das denn in C so "kompliziert"?

Dein Problem hat nichts mit C zu tun. Es kommt dir nur so vor, weil du 
wohl noch nicht genug Ahnung von der Programmiersprache hast.

Möglicherweise bist du von Scriptsprachen gewohnt, dass sie automagisch 
zwischen Datentypen umwandeln. Das hat neben schlechter Performance noch 
weitere Nachteile, zum Beispiel:

Ein Programm soll an die Namen elektronischer Bauteile eine fortlaufende 
Nummer anhägen. Also schreibt du z.B "name=name+nummer". Was passiert 
wohl, wenn das Bauteil 7404 heißt? Dann kommt dabei so etwas wie 7405 
heraus, anstatt 74041.

Klar, das ist kein unlösbares Problem. Ich wollte nur drauf hinweisen, 
dass automatische Typ-Umwandlung nicht nur gute Seiten hat. Das Konzept 
fester Datentypen ist nicht ein veraltetes Relikt sondern gehört auch in 
vielen modernen Sprachen zum Grundkonzept.

Die Sprache C wurde damals für Computer entwickelt, welche für 
Scriptsprachen noch gar nicht genug Speicher und Leistung hatten. Darum 
darfst du da nicht allzu viel Automagie erwarten.

: Bearbeitet durch User
von Joachim B. (jar)


Bewertung
0 lesenswert
nicht lesenswert
Christop schrieb:
> Wenn TEMPERATUR größer oder kleiner als Y dann

Jim M. schrieb:
> Hat man das aber als String vorliegen, muss man zuerst den String wieder
> in eine Zahl verwandeln (float oder int) um diese dann vergleichen zu
> können.

wieso das denn?
strcmp kann das doch = ist 0 sonst > oder <
https://www.tutorialspoint.com/c_standard_library/c_function_strcmp.htm

von Wolfgang (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Joachim B. schrieb:
> wieso das denn?
> strcmp kann das doch = ist 0 sonst > oder <
> https://www.tutorialspoint.com/c_standard_library/c_function_strcmp.htm

Dann bring mal einem Stringvergleich bei, dass "-20.5" kleiner ist als 
"-15.0" ;-)

von Wolfgang (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Christop schrieb:
> wenn man eine Temperatur von einem DS18S20 in einem char temp[10] hat..

Dann hat da deine Software schon kräftig dran rumgemurkst.

von Christop (Gast)


Bewertung
-3 lesenswert
nicht lesenswert
Wolfgang schrieb:
> Joachim B. schrieb:
>> wieso das denn?
>> strcmp kann das doch = ist 0 sonst > oder <
>> https://www.tutorialspoint.com/c_standard_library/c_function_strcmp.htm
>
> Dann bring mal einem Stringvergleich bei, dass "-20.5" kleiner ist als
> "-15.0" ;-)

Ähm... gerne

[code]

<?php

$string = "-15.0";

$string2 = "-20.3";

if ($string > $string2 OR $string2 > $string) {
  echo "String \$string ist kleiner als \$string2";
}

?>

Und wo genau war jetzt das Problem? achja.. C kann das nicht.

von Christop (Gast)


Bewertung
-3 lesenswert
nicht lesenswert
Wolfgang schrieb:
> Dann bring mal einem Stringvergleich bei, dass "-20.5" kleiner ist als
> "-15.0" ;-)

Ähm... gerne

<?php

$string = "-15.0";

$string2 = "-20.3";

if ($string > $string2 OR $string2 > $string) {
  echo "String \$string ist kleiner als \$string2";
}

?>


Und wo genau war jetzt das Problem? achja.. C kann das nicht.

von Stefan ⛄ F. (stefanus)


Bewertung
4 lesenswert
nicht lesenswert
Christop schrieb:
> Und wo genau war jetzt das Problem? achja.. C kann das nicht.

Dein C Bashing ist hier vollkommen unangebracht, solange du nicht 
imstande bist, PHP auf dem Mikrocontroller ans Laufen zu bringen und 
funktionierende Scripte zu schrieben.

Ich habe dein "geniales" Programm mal mit ein paar weiteren Testfällen 
erweitert:
<?php

$string = "-15.0";
$string2 = "-20.3";

if ($string > $string2 OR $string2 > $string) {
  echo "String ".$string." ist kleiner als ".$string2."\n";
}

$string = "-20.3";
$string2 = "-15.0";

if ($string > $string2 OR $string2 > $string) {
  echo "String ".$string." ist kleiner als ".$string2."\n";
}


$string = "9.3";
$string2 = "11.0";

if ($string > $string2 OR $string2 > $string) {
  echo "String ".$string." ist kleiner als ".$string2."\n";
}


$string = "11.0";
$string2 = "9.3";

if ($string > $string2 OR $string2 > $string) {
  echo "String ".$string." ist kleiner als ".$string2."\n";
}

?>

Ausgabe:
String -15.0 ist kleiner als -20.3
String -20.3 ist kleiner als -15.0
String 9.3 ist kleiner als 11.0
String 11.0 ist kleiner als 9.3

Dumm gelaufen, würde ich mal sagen.

: Bearbeitet durch User
von Wolfgang (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Christop schrieb:
> if ($string > $string2 OR $string2 > $string) {
>   echo "String \$string ist kleiner als \$string2";

Den Schwachsinn solltest du noch mal überarbeiten ;-(

von Joachim B. (jar)


Bewertung
0 lesenswert
nicht lesenswert
Wolfgang schrieb:
> Dann bring mal einem Stringvergleich bei, dass "-20.5" kleiner ist als
> "-15.0" ;-)

kein Problem, die '-' werden gemerkt & gelöscht

20.5 ist größer als 15.0 und wegen gemerkten - wird größer invertiert zu 
kleiner, geht also!

von Wolfgang (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Joachim B. schrieb:
> kein Problem, die '-' werden gemerkt & gelöscht
>
> 20.5 ist größer als 15.0 und wegen gemerkten - wird größer invertiert zu
> kleiner, geht also!

Bevor ich so eine Mühle anschmeiße, vergleiche ich doch lieber zwei 16 
Bit Integer Zahlen.

Das ganze Konstrukt erinnert mich an jemanden, der eine bitweise 
UND-Funktion zwischen zwei Bytes meinte realisieren zu müssen, indem er 
die Bytes erstmal entsprechen der Bitwerte als Strings mit "0"en und 
"1"en umwandelte, dann jeweils zeichenweise den neuen Bit-Wert 
generierte und hinterher den Ergebnisstring zurück in ein Byte wandelte.
Kann man machen - muss man aber nicht, jedenfalls nicht, wenn man auch 
nur ansatzweise verstanden hat, dass soetwas wie UND oder eben auch 
Vergleiche Grundoperation jeden Prozessors sind.

von PittyJ (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Eigentlich sollte doch ein atof() reichen.

also
.. (atof(temp) - atof(tempold)) ..

Keine Frage, das ist äußerst ineffizient und ungenau.
Würde aber für die Anspüche des TE vollkommen ausreichen.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Bewertung
2 lesenswert
nicht lesenswert
PittyJ schrieb:
> Eigentlich sollte doch ein atof() reichen.

Ja, es ist halt nur albern, zuerst aus einer computergerechten Zahl eine 
menschenlesbare Zeichenfolge zu machen, um diese dann wieder in eine 
computergerechte Zahl zu verwandeln, damit man sie vergleichen kann.

von Joachim B. (jar)


Bewertung
0 lesenswert
nicht lesenswert
Jörg W. schrieb:
> Ja, es ist halt nur albern, zuerst aus einer computergerechten Zahl eine
> menschenlesbare Zeichenfolge zu machen

braucht man eh um sie lesbar zu haben

float meide ich bei kleinen µC wo es möglich ist, ich arbeite dann 
lieber mit int in dezi° oder cV. Dezimalpunkte setze ich per char 
einfügen ein, nach dem Vergleichen.

von Peter D. (peda)


Bewertung
4 lesenswert
nicht lesenswert
Ein Vergleich von Zahlen als Text ist völliger Unfug und geht schief.
Z.B. sind "+.3" und "3e-1" exakt gleich.

Menschen können einfach erkennen, wann ein Text eine Zahl darstellt, 
Maschinen können sich dagegen irren. Daher muß man z.B. in Excel vorher 
das Format festlegen, bevor man eine Reihe importiert.

von Pandur S. (jetztnicht)


Bewertung
3 lesenswert
nicht lesenswert
Wenn ein Sensor eine 16bit Binaerzahl ausgibt, vergleicht und rechnet 
man mit genau der, und nicht mit irgendwelche seltsamen ideen wie einer 
float zahl.

von Joachim B. (jar)


Bewertung
0 lesenswert
nicht lesenswert
Peter D. schrieb:
> Ein Vergleich von Zahlen als Text ist völliger Unfug und geht schief.

nicht doch immer pauschal alles bewerten!

logisch kann ich auch als Text:

2014_07_15__23_00_38.JPG
2007_04_01__10_15_36.jpg

vergleichen <> feststellen

genau wie bei:

2020/09/09_16:43:21 (aktuell)
2020/08/20_02:40:08 (compile)

vergleichen <> feststellen

: Bearbeitet durch User
von Cyblord -. (cyblord)


Bewertung
0 lesenswert
nicht lesenswert
Joachim B. schrieb:
> 2014_07_15__23_00_38.JPG
> 2007_04_01__10_15_36.jpg
>
> vergleichen <> feststellen

Nö kannst du nicht. Zumindest nicht sinnvoll.
Denn dann bekommst du bei:

> 2014_07_15__23_00_38.JPG
> 2014_7_15__23_00_38.JPG

einen Unterschied gemeldet der aber nicht existiert.

Also vergleichen kann man alles, nur es bleibt sinnfrei.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Bewertung
4 lesenswert
nicht lesenswert
Joachim B. schrieb:
> vergleichen <> feststellen

Darum ging's aber im Thread gar nicht. Bitte bleib beim Thema.

Letztlich wurde eigentlich schon alles gesagt zum Thema, vielleicht noch 
nicht von jedem …

von Schlaumaier (Gast)


Bewertung
-2 lesenswert
nicht lesenswert
https://www.arduinoclub.de/2015/01/23/arduino-ds18b20-temperatur-sensor-mit-filter/

Lesen - Lernen - Verstehen - Merken.

Ohne die Umrechnung stimmt die Temperatur nicht.

Ich könnte dir mein B4x Code zeigen aber den raffst du vermutlich noch 
weniger, da in Basic geschrieben.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Bewertung
1 lesenswert
nicht lesenswert
Schlaumaier schrieb:
> Lesen - Lernen - Verstehen - Merken.

Da ist doch auch bloß wieder eine Temperatur-Blackbox drin als 
Bibliothek. Wie soll der TE davon was lernen oder verstehen?

Das Filter wiederum ist ad hoc parametriert, da ist es keineswegs 
sicher, dass die Parameter allgemein gültig sind. Normalerweise sind 
Temperatursensoren durch ihre thermische Trägheit von Haus aus schon 
ruhig genug, als dass man da nichts weiter filtern muss.

von Schlaumaier (Gast)


Bewertung
-1 lesenswert
nicht lesenswert
Jörg W. schrieb:
> Da ist doch auch bloß wieder eine Temperatur-Blackbox drin als
> Bibliothek. Wie soll der TE davon was lernen oder verstehen?

Christop schrieb:
> wenn man eine Temperatur von einem DS18S20 in einem char temp[10] hat..
>
> und diese nun vergleichen möchte wie stellt man das an?

Man nehme den Code, bzw. die Formel daraus. Dann hat man die Temperatur 
als Zahl. Nun setzt man diese Zahl in die Variable OLD (was er richtig 
macht).

Liest den Wert neu ein, und vergleicht den Wert mit den Wert der 
Variable OLD.

Wenn man auch irgend ein Grund den Wert als STRING abgespeichert hat, 
gibt es 2 Lösungen.

Lösung 1. Man wandelt den Wert wieder in eine Zahl um
Lösung 2. Man wandelt die ZAHL des Sensors in ein String um.

Sobald man beide gleich hat. kann man vergleichen.

Und genau DAS habe ich aus der Frage (Zitierter Text) heraus gelesen.

Wobei mir nur nicht klar ist, was da überhaupt Strings (CHARS) drin zu 
suchen haben.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Bewertung
2 lesenswert
nicht lesenswert
Ich sag doch, alles schon geschrieben, nur noch nicht von jedem. ;-)

Der TE scheint ohnehin verschwunden, weil ihm schwindelig wurde, da es 
auf dem Controller sein geliebtes PHP einfach mal nicht gibt.

von eProfi (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Ich habe vor 9 Jahren folgenden Code gepostet, mit dem man die 
Temperatur in 1/16° bekommt (in der Variablen t12) und auch ausgeben 
kann.
Beitrag "Re: DS18S20 - extended resolution bei Temperaturen um 0°C"
(nur die untere Hälfte des Beitrages lesen, da die erst eine Kopie der 
vorhergehenden ist).
a[] ist das Scratchpad.
Die entscheidenden Zeilen sind:
  t12=3+8*a[0]-((a[6]-1)&7);//alternate way of calculation
  if(a[1]){t12-=128*16;}  //correct by -128°

von Wolfgang (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Schlaumaier schrieb:
> Ohne die Umrechnung stimmt die Temperatur nicht.

Weche Umrechnung?
Der DS18S20 gibt kalibrierte Temperaturwerte mit einer Auflösung von 
0.5K aus, d.h. man muss nur das (Dual)-Komma an die richtige Stelle 
setzen (Fig 4 im Datenblatt)

von Schlaumaier (Gast)


Bewertung
-1 lesenswert
nicht lesenswert
Wolfgang schrieb:
> Weche Umrechnung?

Seite 6 im Datenblatt :)  Wir sind Europäer. ;)

von Joachim B. (jar)


Bewertung
0 lesenswert
nicht lesenswert
Cyblord -. schrieb:
> Denn dann bekommst du bei:
>
>> 2014_07_15__23_00_38.JPG
>> 2014_7_15__23_00_38.JPG
>
> einen Unterschied gemeldet der aber nicht existiert.

aber auch NIEMALS existieren wird weil ich meine Bilder immer selbst 
passend umbenenne!

Also keine erfundenen Beispiele bringen, hilft niemanden!
Ich schrieb auch nur welche Strings ICH auf <=> prüfe und deren 
Nichtfunktion kannst du auch nie beweisen!

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Bewertung
2 lesenswert
nicht lesenswert
Joachim B. schrieb:
> Ich schrieb auch nur welche Strings ICH auf <=> prüfe

Was genau hat das aber bitte mit dem Kontext des Threads zu tun?

Nichts?

Warum schreibst du es dann hier?

Erinnerung: es sollten Temperaturintervalle verglichen werden …

: Bearbeitet durch Moderator
von Joachim B. (jar)


Bewertung
0 lesenswert
nicht lesenswert
Jörg W. schrieb:
> Warum schreibst du es dann hier?
>
> Erinnerung: es sollten Temperaturintervalle verglichen werden …

schrieb ich auch, nicht gelesen?
Beitrag "Re: Wie kann man eine Temperatur vergleichen und berechnen?"

und da ich nur + messe tritt eine Sonderbehandlung vom - nie ein.

also ehrlich float auf kleinem µC?
Kann man ja machen, aber mir nam die float LIB zuviel Speicher weg und 
wenn sie nicht gebraucht wird, also wozu verwenden?
nicht für "Temperaturintervalle"
Aber §1 der Mod hat immer Recht

Joachim B. schrieb:
> float meide ich bei kleinen µC wo es möglich ist, ich arbeite dann
> lieber mit int in dezi° oder cV. Dezimalpunkte setze ich per char
> einfügen ein, nach dem Vergleichen.

: Bearbeitet durch User
von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Bewertung
3 lesenswert
nicht lesenswert
Joachim B. schrieb:

> und da ich nur + messe tritt eine Sonderbehandlung vom - nie ein.

Was genau hilft das dem Fragesteller?

> also ehrlich float auf kleinem µC?

Erstens weiß keiner hier, wie klein denn sein Controller überhaupt ist.

Zweitens: solange der Speicher da ist und für nichts anderes gebraucht 
wird, ist auch das schlicht kein Thema. Auf einen ATtiny10 wird man das 
eher nicht benutzen, aber selbst die in der Arduino-Welt gern benutzten 
32-KiB-Controller haben schlicht gar kein Problem damit.

Mon dieu, es gab Zeiten, da hatte der komplette CP/M-Rechner ganze 64 
KiB, im verbleibenden (nicht vom OS belegten) RAM lief noch problemlos 
ein Turbo-Pascal-Programm, und das konnte sogar 48-bit-Gleitkomma 
abhandeln (womit es von der Genauigkeit sogar C-Standard-konform wäre, 
anders als AVR-GCC mit 32 Bit). Man sollte sich die Welt nicht kleiner 
reden als sie ist.

Drittens: die Entscheidung hatte der TO ja offenbar bereits getroffen 
(oder jemand anders hat sie für ihn getroffen), ansonsten hätte er nicht 
genau die Strings, die er hat. Damit muss man das also nicht in Frage 
stellen (wohl aber kann man in Frage stellen, die Vergleiche vor der 
Umwandlung in die lesbare Form zu machen).

von Joachim B. (jar)


Bewertung
-1 lesenswert
nicht lesenswert
Jörg W. schrieb:
> Was genau hilft das dem Fragesteller?

das man float nicht immer braucht, das man auch Strings auf <> testen 
kann, erst Recht wenn Temperaturen nicht negativ werden.

Jörg W. schrieb:
> Erstens weiß keiner hier, wie klein denn sein Controller überhaupt ist.

stimmt und deswegen gibt JEDER nur eine Meinung ab, wirklich JEDER.

Sind negative Temperaturen vorhanden?
Ist der µC zu klein oder hat er alles genug Flash Ram?
Muss der Temperaturwert auch menschenlesbar sein?

Fragen über Fragen.

aber sorry wenn man versucht was beizutragen auch wenn viele nur EINE 
Sichtweise haben!

Jörg W. schrieb:
> sondern als Binärzahl. Diese lassen sich deutlich sinnvoller vergleichen
> als irgendwelche textuellen Darstellungen

OK und diese muss nie menschenlesbar gewandelt werden, Vermutung oder 
Gewissheit?

Peter D. schrieb:
> die Strings müssen doch
> vorher mal als float vorgelegen haben.

müssen sie das? (ich sage klares NEIN ich kann auch binär oder int zu 
String wandeln)

MaWin schrieb:
> Entscheidend ist, dass man Zahlen vergleichen will.
>
> Ein char-Array ist aber keine Zahl, sondern ein String.

ach

Ehrlich ist mir zu doof für eine andere Idee getadelt zu werden!

: Bearbeitet durch User
von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Bewertung
2 lesenswert
nicht lesenswert
Joachim B. schrieb:
> das man auch Strings auf <> testen kann

Er will aber einen Bereich testen. Das stand im ersten Posting bereits 
klar und deutlich drin.

Da hilft ein Vergleich auf Gleichheit hinten und vor nicht.

Ob die Werte auch ein Vorzeichen haben können oder nicht, ist dabei eher 
uninteressant.

von Peter D. (peda)


Bewertung
3 lesenswert
nicht lesenswert
Joachim B. schrieb:
> also ehrlich float auf kleinem µC?
> Kann man ja machen, aber mir nam die float LIB zuviel Speicher weg

Definiere "klein".

Auf dem kleinen 8-Pinner ATtiny85 belegt float des AVR-GCC ~1kB, also 
noch 7kB Platz für andere Tasks.

von Joachim B. (jar)


Bewertung
-1 lesenswert
nicht lesenswert
Peter D. schrieb:
> belegt float des AVR-GCC ~1kB

und das kann schon zuviel sein, was wenn die 1k dringend für anderes 
gebraucht werden?

wozu also float wenn der Sensor nicht mal float ausgibt?
Das wurde noch nicht erklärt, warum float verwenden?

darf ich erinnern?

Jörg W. schrieb:
> Ein DS18S20 gibt seinen Temperaturwert doch nicht als char[10] aus,
> sondern als Binärzahl

und auch gibt er es nicht als float aus und umrechnen kann man auch nach 
INT und brauche die float LIB nicht

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.