Hallo geschätztes Forum, nachdem ich leider nichtmehr weiter komme, wende ich mich an Euch. Ich habe eine Testschaltung mit einem DHT22, Atmega8 und einem LCD aufgebaut. Codeschnipsel sind aus dem Netz. Das Ganze soll in naher Zukunft ein Hyro-/Thermometer für den Außenbereich werden. Mein Problem ist, dass keine Minustemperaturen angezeigt werden/wurden. Alles, was unter 0 Grad war, wurde mit 6553,9 angezeigt. Ich habe das mit: ... *humidity = (sensor_data[0]<<8) + sensor_data[1] + 42.0; // + 42.0 //*temp = (sensor_data[2]<<8) + sensor_data[3] - 7.0; // - 7.0 if((sensor_data[2]<<8) + sensor_data[3] - 7.0 < 0) { *temp &= 0x7FFF; // Remove signal bit *temp = ((sensor_data[2]<<8) + sensor_data[3] - 7.0) * (-1); *x = *x + 1; } else { *temp = (sensor_data[2]<<8) + sensor_data[3] - 7.0; // - 7.0 } ... "behoben".....siehe "am2302.c" Allerdings wird/wurde erst normal bis 0 Grad angezeigt und ab 0 Grad abwärts (-0.1 Grad und weniger) wird normal wieder hochgezählt ohne Minuszeichen davor. Deswegen auch "*x = *x + 1;", welches dann via einer Variablen im main.c das Minuszeichen vor die Temperatur setzt. ... if (x > 0) { lcd_string_format("Temp:- %i.%i C %i \nHumi: %i.%i %% %i " , temp/10, temp%10, x, humidity/10, humidity%10, i); } else if (temp/10 >= 10) { lcd_string_format("Temp: %i.%i C %i \nHumi: %i.%i %% %i " , temp/10, temp%10, x, humidity/10, humidity%10, i); } else { lcd_string_format("Temp: %i.%i C %i \nHumi: %i.%i %% %i " , temp/10, temp%10, x, humidity/10, humidity%10, i); } ... Wie könnte man das geschickter lösen? Ich würde mich über ein paar Tipps freuen.
humidity als int16_t statt uint16_t deklarieren und gut?
Und rück mal dein Code richtig ein, so ist das grauenhaft.
Und wie wärs mit \t statt diesem blöden Leerzeichen-Eingerücke? Dann brauchst du da auch keine 10 IFs für. Sorry für die vielen Posts, les mir das grad Schritt für Schritt durch.
kA was du bei der umrechnung in am2302 für Zeug machst. Scheinbar nutzt der am2302 das MSB als signed-bit. Du kannst also einfach temp als int16_t deklarieren (das meinte ich übrigens auch oben, habs mit humidity verwechselt). Dann kannst du sagen:
1 | *temp = 0; |
2 | if( *MSB gesetzt* ){ |
3 | *temp -= daten; |
4 | }else{ |
5 | *temp += daten; |
6 | } |
Und all deine Probleme werden gelöst sein.
1 | *humidity = (sensor_data[0]<<8) + sensor_data[1] + 42.0; // + 42.0 |
Welchen tieferen Sinn siehst Du darin, eine float -Konstante zu einem uint16_t -Wert zu addieren? Und was soll der geniale Kommentar?
Ich kenne das blöde Kommentieren noch aus Unterrichtszeiten: manche Lehrer bestanden echt darauf, dass JEDE Codezeile kommentiert wird. Wenn ich es nicht verweigern konnte (weil davon sonst die Note abhing), habe ich ähnlich sinnvoll kommentiert - Anforderung war erfüllt. Vllt hat der TO ein ähnliches Problem? Neben den Anderen genannten natürlich ;)
Michael schrieb: > Ich kenne das blöde Kommentieren noch aus Unterrichtszeiten: manche > Lehrer bestanden echt darauf, dass JEDE Codezeile kommentiert wird. Wenn > ich es nicht verweigern konnte (weil davon sonst die Note abhing), habe > ich ähnlich sinnvoll kommentiert - Anforderung war erfüllt. > Vllt hat der TO ein ähnliches Problem? Neben den Anderen genannten > natürlich ;) Aber diese Zeilen schreien doch geradezu nach einen echten Kommentar.
Das Problem ist doch so wie ich das verstehe daß der To gar nicht selbst programmiert hat: Stefan B. schrieb: > Codeschnipsel sind aus dem Netz. und jetzt jemanden sucht der die Schnipsel zu einem lauffähigen Programm zusammenpuzzled.
Guten Morgen ;) Danke für die Tipps..... Ich habe die *temp mal zu int16_t abgeändert. Allerdings wird jetzt an erster sowie an zweiter Stelle ein negatives Vorzeichen angesetzt (siehe Bild). Hätte da eventuell noch jemand eine Idee, wie man das negative Vorzeichen nach der Kommastelle weg bekommt? Udo Schmitt schrieb: > und jetzt jemanden sucht der die Schnipsel zu einem lauffähigen Programm > zusammenpuzzled. Hi Udo, mein "Thermometer" funktioniert mit den am Thread angehängten Files, aber ich hätte das gerne noch ein bißchen unkomplizierter "gestaltet", also mit weniger if-else-Abfragen zum Beispiel in der main.c Stefan B. schrieb: > Wie könnte man das geschickter lösen?
Stefan B. schrieb: > Hätte da eventuell noch jemand eine Idee, wie man das negative > Vorzeichen nach der Kommastelle weg bekommt? abs
abs? Ich kann damit leider nichts anfangen, da ich nicht unbedingt der große C-Programmierer bin. Würdest Du das bitte bißchen genauer erklären?
Stefan B. schrieb: > abs? > > Ich kann damit leider nichts anfangen, da ich nicht unbedingt der große > C-Programmierer bin. > Würdest Du das bitte bißchen genauer erklären? abs() - "Absolut"-Funktion
Danke.... Ich werd mal sehen, ob ich damit was hin bekomme.... Gruss Stefan
Stefan B. schrieb: > Ich bekomme es nicht hin :( was hast Du denn probiert?
1 | if (x > 0) |
2 | { |
3 | lcd_string_format("Temp:- %i.%i C %i \nHumi: %i.%i %% %i " , temp/10, temp%10, x, humidity/10, humidity%10, i); |
4 | } |
Wenn temp einen negativen Wert enthält, müsstest Du eigentlich für temp/10 auch ein Minuszeichen haben... Ändere temp%10 in abs(temp)%10 ab.
DirkZ schrieb: > Stefan B. schrieb: >> Ich bekomme es nicht hin :( > > was hast Du denn probiert? > if (x > 0) > { > lcd_string_format("Temp:- %i.%i C %i \nHumi: %i.%i %% > %i " , temp/10, temp%10, x, humidity/10, humidity%10, i); > } > > Wenn temp einen negativen Wert enthält, müsstest Du eigentlich für > temp/10 auch ein Minuszeichen haben... > > Ändere temp%10 in abs(temp)%10 ab. Danke, so gehts.... :) Manchmal ärgere ich mich schon. Das sind minimale Änderungen, aber da wäre ich nie drauf gekommen. Grüße vom Bodensee
Diese /10 und Modulo Rechnerei ist natürlich totaler Unsinn. Eigentlich gehört das alles schön in ein Float gepackt, dann ist gut. Da es eh auf einem LCD angezeigt wird ist das Rechenzeittechnisch völlig egal, und bei der Komplexität des Programms ist der zusätzliche Speicherverbrauch der float lib auch irrelevant.
Er hat es zusammen kopiert. Daher können/waren die Anforderungen bei den eigentlichen Quellen auch ganz andere als hier.
Stefan B. schrieb: > Manchmal ärgere ich mich schon. Wenn du einfach die Programmiersprache lernen würdest müsstest du dich nicht mehr ärgern. Sowas kann sogar Spass machen. Auf jeden Fall macht es Spass wenn es erst mal kann und nicht wegen jeder Kleinigkeit andere fragen und bitten muss, sondern sich selbst sagen kann, das habe ich selbst hingekriegt.
Guest schrieb: > Diese /10 und Modulo Rechnerei ist natürlich totaler Unsinn. Eigentlich > gehört das alles schön in ein Float gepackt, dann ist gut. Da es eh auf > einem LCD angezeigt wird ist das Rechenzeittechnisch völlig egal, und > bei der Komplexität des Programms ist der zusätzliche Speicherverbrauch > der float lib auch irrelevant. Mir wäre es auch lieber, wenn ich das Ganze so programmieren könnte, dass es sauber und auch logisch aufgebaut wäre. Das Problem ist nur, dass ich sozusagen ein Newbie bin und ich mich freue, wenn die Schaltung einigermaßen funktioniert. Ich hätte da noch einige andere Ideen zu diesem Thermometer. Zum Beispiel einen Timer einfügen und mit 2 Tasten einen Schaltpunkt für die Temperatur und für die Luftfeuchte, dass dann bei irgendeiner Temperatur oder Luftfeuchte irgendwas schaltet. Einen Ansatz für die Luftfeuchte ist ja schon "eingebaut". Aber da darf ich noch viel probieren und lesen..... Gruss
Stefan B. schrieb: > Das Problem ist nur, dass ich sozusagen ein Newbie bin und ich mich > freue, wenn die Schaltung einigermaßen funktioniert. Tut mir leid Herr Wachtmeister, das Problem ist das ich noch ein Newbie bin und ich mich freue wenn ich einigermaßen gerade aus fahre kann und nur selten eine Straßenlaterne streife... ;-)
mit Gleitkommavariablen von
1 | lcd_string_format("Temp:- %i.%i C %i \nHumi: %i.%i %% %i " , temp/10, temp%10, x, humidity/10, humidity%10, i); |
zu
1 | float ftemp, fhumidity; |
2 | |
3 | . |
4 | . |
5 | /*Messwertabfrage*/ |
6 | . |
7 | |
8 | ftemp = temp/10.0; |
9 | fhumidity = humidity/10.0; |
10 | |
11 | lcd_string_format("Temp: %.1f C %i \nHumi: %.1f %% %i " , ftemp, x, fhumidity, i); |
x könnte jetzt auch weg.
Guest schrieb: > Eigentlich gehört das alles schön in ein Float gepackt, dann ist gut. Das ist doch wohl der größte Unsinn, nur weil in der Ausgabe ein Punkt auftauchen soll, sich die ganze Floatingpoint-Library aufzuhalsen und ggf. auf einen größeren Prozessor umschwenken zu müssen.
Mr. Tom schrieb: > Guest schrieb: >> Eigentlich gehört das alles schön in ein Float gepackt, dann ist gut. > > Das ist doch wohl der größte Unsinn, nur weil in der Ausgabe ein Punkt > auftauchen soll, sich die ganze Floatingpoint-Library aufzuhalsen und > ggf. auf einen größeren Prozessor umschwenken zu müssen. Viele User, viele Meinungen..... Ich glaube C bietet viele Möglichkeiten um ans Ziel zu kommen. Vielleicht bekomme ich es auch irgendwann mal hin, mir eine Möglichkeit aussuchen zu können ohne Straßenlaternen streifen zu müssen ;)
Mr. Tom schrieb: > Guest schrieb: >> Eigentlich gehört das alles schön in ein Float gepackt, dann ist gut. > > Das ist doch wohl der größte Unsinn, nur weil in der Ausgabe ein Punkt > auftauchen soll, sich die ganze Floatingpoint-Library aufzuhalsen und > ggf. auf einen größeren Prozessor umschwenken zu müssen. Ja sicher, größter Unsinn. Ist ja nicht so als ob er auf den Wert regeln will. Oh, moment, will er doch! Wäre das nicht schön, wenn er alles in einer Variablen stehen hätte mit der er rechnen könnte? Was bietet sich denn an...mhm...float vielleicht!
Guest schrieb: > Wäre das nicht schön, wenn er alles in einer Variablen stehen hätte mit > der er rechnen könnte? Was bietet sich denn an...mhm...float vielleicht! Man kann mit Ganzzahlen nicht rechnen? Erstaunlich.
Da das Thema nicht allzu alt ist und sich mit dem gleichen Sensor beschäftigt, hier meine Frage: Der Sensor bildet ja eine recht simple Checksumme. Ist bekannt (bzw hat jemand berechnet) wieviel Prozent der Fehler durch die Checksumme gefunden werden? Warum wurde kein Generatorpolynom wie bei CRC16 und Co verwendet? LG Peter
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.