Problem mit Zahlenwerten und weiterverarbeitung

Gast #550227
Hallo,

bin noch neu auf dem gebiet bitte nicht hauen...

Ich benutze den Code von Peter Dannegger für das 1-Wire Protokoll in C 
für einen DS18B20. Dies Funktioniert soweit auch wunderbar übrigens 
bedanke ich mich für den Code. Nun habe ich das Programm etwas erweitert 
für die Ausgabe auf einem Lcd Display das funktioniert soweit auch. 
Leider bekomme ich es nicht hin mit den vom Sensor geholten daten weiter 
zuarbeiten. Ich möchte bei bestimmten Temperaturen verschiedene Dinge 
steuern in etwa so als beispiel
> 30° Led an < 30° Led aus. Dies zu programmieren in einer If Klausel wäre auch 
nicht das Problem ich weis nur einfach nicht wie ich ihm die werte entlocke und um 
zusagen if x >= 30 mach sonstwas.

anbei der Code auszug der den Wert ausgibt und ans Uart weiterschickt...

      w1_byte_wr( READ );      // read command
      temp = w1_byte_rd();      // low byte
      temp |= (uint)w1_byte_rd() << 8;    // high byte
      if( id[0] == 0x10 )      // 9 -> 12 bit
        temp <<= 3;
      sprintf( s, "  T: %04X = ", temp );  // hex value
      uputs( s );
      sprintf( s, "%4d.%01døC", temp >> 4, (temp << 12) / 6553 ); // 
0.1øC
      uputsnl( s );

Wäre nett wenn mir jemand helfen könnte...

Mfg Nina
#550265
Leider ist Dein Posting etwas kryptisch und ich habe offen gesagt keine 
Lust, aus dem sprintf zu rekonstruieren, was Dein Sensor für Daten 
liefert.

Im Prinzip geht man bei solchen Problemen folgendermaßen vor:

Man nimmt die Umrechnungsfunktion, mit der man aus dem Sensorwert den 
Zielwert berechnet. Wenn die Umrechnungsfunktion eine Gerade ist

     y = a*x + b

dann wäre in Deinem Fall y die Temperatur in °C und x der Sensorwert.

Wenn Du jetzt wissen willst, welchen Wert der Sensor schickt, wenn 30°C 
erreicht sind, setzt Du einfach den Wert in die Formel ein:

     30 = a*x + b

und löst die Gleichung nach x auf.

Den Wert, der dabei heraus kommt, setzt Du in dein Programm ein.

Angemommen, bei Deiner Rechnung kommt 237 heraus, dann schreibst Du im 
Programm:

     if (temp > 237)
         MachwasWennWenigerAls30Grad();
     else
         MachwasWennGleichOderMehrAls30Grad();

#550269
Nun, laut Datenblatt liefert der DS18B20 die Temperatur in 1/16° 
Schritten.

Also einfach "temp/16" und schon hast Du die vollen °C.

Bzw. man kann auch den Vergleichswert *16 nehmen.


Peter


P.S.:
Es könnte nichts schaden, wenn Du rauskriegst, was in der sprintf 
Anweisung "temp>>4" bewirkt.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 19 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.