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
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();
Korrektur: if (temp < 237) MachwasWennWenigerAls30Grad(); else MachwasWennGleichOderMehrAls30Grad(); Admin: Warum kann ich meinen Beitrag nicht mehr bearbeiten?
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.