Forum: Mikrocontroller und Digitale Elektronik Problem mit Zahlenwerten und weiterverarbeitung


von Nina Zoff (Gast)


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

von Uhu U. (uhu)


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();


von Uhu U. (uhu)


Lesenswert?

Korrektur:

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


Admin: Warum kann ich meinen Beitrag nicht mehr bearbeiten?

von Peter D. (peda)


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.

von Uhu U. (uhu)


Lesenswert?

Demnach lautet die Umrechnungsformel:

    y = 1/16 * x + 0

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
Noch kein Account? Hier anmelden.