mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Problem mit Zahlenwerten und weiterverarbeitung


Autor: Nina Zoff (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Uhu Uhuhu (uhu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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();


Autor: Uhu Uhuhu (uhu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Korrektur:

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


Admin: Warum kann ich meinen Beitrag nicht mehr bearbeiten?

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Uhu Uhuhu (uhu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Demnach lautet die Umrechnungsformel:

    y = 1/16 * x + 0

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.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

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