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.
1 | float temp = 23.5; |
2 | float tempold = 23.5; |
3 | float Y = 0.5; |
:
Bearbeitet durch User
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
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.
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.
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
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" ;-)
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.
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.
Wolfgang schrieb: > Dann bring mal einem Stringvergleich bei, dass "-20.5" kleiner ist als > "-15.0" ;-) Ähm... gerne
1 | <?php
|
2 | |
3 | $string = "-15.0"; |
4 | |
5 | $string2 = "-20.3"; |
6 | |
7 | if ($string > $string2 OR $string2 > $string) { |
8 | echo "String \$string ist kleiner als \$string2"; |
9 | }
|
10 | |
11 | ?>
|
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 > $string2 OR $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 > $string2 OR $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 > $string2 OR $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 > $string2 OR $string2 > $string) { |
30 | echo "String ".$string." ist kleiner als ".$string2."\n"; |
31 | }
|
32 | |
33 | ?>
|
Ausgabe:
1 | String -15.0 ist kleiner als -20.3 |
2 | String -20.3 ist kleiner als -15.0 |
3 | String 9.3 ist kleiner als 11.0 |
4 | String 11.0 ist kleiner als 9.3 |
Dumm gelaufen, würde ich mal sagen.
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
:
Bearbeitet durch User
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 …
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.
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 |
2 | if(a[1]){t12-=128*16;} //correct by -128° |
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 …
:
Bearbeitet durch Moderator
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
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!
:
Bearbeitet durch User
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
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.