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
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.
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.
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.
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....
1
$var = 23.4726;
2
3
$var2 = 22.3857;
4
5
$abzug = 0.4;
6
7
if ( $var > $var2) {
8
if ( ( $var - $var2) > $abzug OR ( $var2 - $var) > $abzug) {
9
// Tue was
10
}
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"?!
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.
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.
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.
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.
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.
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.
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:
1
<?php
2
3
$string="-15.0";
4
$string2="-20.3";
5
6
if($string>$string2OR$string2>$string){
7
echo"String ".$string." ist kleiner als ".$string2."\n";
8
}
9
10
$string="-20.3";
11
$string2="-15.0";
12
13
if($string>$string2OR$string2>$string){
14
echo"String ".$string." ist kleiner als ".$string2."\n";
15
}
16
17
18
$string="9.3";
19
$string2="11.0";
20
21
if($string>$string2OR$string2>$string){
22
echo"String ".$string." ist kleiner als ".$string2."\n";
23
}
24
25
26
$string="11.0";
27
$string2="9.3";
28
29
if($string>$string2OR$string2>$string){
30
echo"String ".$string." ist kleiner als ".$string2."\n";
Christop schrieb:> if ($string > $string2 OR $string2 > $string) {> echo "String \$string ist kleiner als \$string2";
Den Schwachsinn solltest du noch mal überarbeiten ;-(
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!
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.
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.
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.
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.
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.
Wenn ein Sensor eine 16bit Binaerzahl ausgibt, vergleicht und rechnet
man mit genau der, und nicht mit irgendwelche seltsamen ideen wie einer
float zahl.
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
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.
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 …
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.
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.
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.
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:
1
t12=3+8*a[0]-((a[6]-1)&7);//alternate way of calculation
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)
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!
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 …
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.
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).
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!
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.
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.
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