einen einzigen DS18s20 auslesen + LCD

Gast #1794384
Lesenswert?

Hey liebe User,

ich habe vor mir einen einzigen DS18s20 auszulesen und nur auf einem LCD 
anzuzeigen. Das ganze wollte ich in C machen.
Am besten so knapp wie möglich.
Es ist ja möglich das irgendwie genauer als 0,5 Grad auflösung zu 
berechnen. Das würde ich auch noch gerne machen.
Nun habe ich aber mit dem Sensor noch keine Erfahrung.
Ich habe schon einige Codes im Internet angeschaut aber nie etwas wie 
ich meine gefunden.
Könnt ihr mir bei meinem Vorhaben helfen?
Datenblatt habe ich auch schon gelesen, aber nichts für mich hilfreiches 
gefunden.
Ich würde mich sehr freuen wenn ich hier hilfe bekomme.

Ganz liebe Grüße
Newby
Gast #1794948
Lesenswert?

Hallo Newby,
schau einmal hier hin:

Beitrag "1-Wire-Bus-Projekt: DS1820  DS18S20  DS2450  DS2408  unter C und 8051"

Hier haben wir den kompletten 1-Wire-Bus ausführlichst beschrieben mit 
DS18S20, DS2450 und DS2408er.
Hier kannst Du alles wichtige zum DS18S20er nachlesen und Dir auch die 
Software-Treiber incl.Demo-Programme runter laden.
Die Software ist in C geschrieben (zwar für 8051er), kann aber sehr 
einfach auf Atmegas umgesetzt werden.
Ab Mitte August gibt es auch die Applikationen und Demos zum Anschluss 
eines LC-Displays (4 Zeilen á 20 Zeichen) an den 1-Wire-Bus, incl. 
Ansteuerung von Relais, LEDs, Abfrage von Tastern, alles über den einen 
einzigen µC-Port -Pin.

Viel Spaß mit dem 1-Wire-Bus.

Bernd
Gast #1794949
Lesenswert?

Ja ich habe zwar ne Formel gesehen wusste auch das die dafür ist aber 
ich kann sie nicht in Verbindung mit der Abfrage bringen. Habe hier im 
Forum einen Code gefunden weiß aber nicht ob der so funktioniert. Ich 
poste ihn mal hier unter den Dateianhängen. Soweit ich das dort sehe 
funktioniert es dort ohne die Rechnung. Wie könnte man die da einbauen?

Ist das insgesamt ein sinnvoller Ansatz?
Angehängte Dateien:
#1794974
Lesenswert?

Newby schrieb:

> funktioniert es dort ohne die Rechnung. Wie könnte man die da einbauen?

Na, dort wo sie jetzt auch ist. In main() nach dem Auslesen.
Allerdings müsste man das etwas geschickter angehen als dort. Dort 
werden ja alle Kommastellen generell weggeworfen.

Wie du das genau machen willst, hängt natürlich auch davon ab, wie du 
eigentlich in deinem Programm eine Temperatur auf, sagen wir mal, 1 
Nachkommastelle speichern willst.
Gast #1794998
Lesenswert?

Wie gesagt mit dem Sensor kenn ich mich noch nicht aus habe den Code nur 
hier aus dem Forum gezogen.

Ja eine Nachkommastelle wäre ok.
Was meinst du mit speichern?
Dafür würde sich doch ein Double-Wert eignen oder?
Oder ich nehme einen Integer-Wert und tuhe ihn durch 10 teilen.

Oder was meinst du mit speichern?
#1795005
Lesenswert?

Newby schrieb:

> Ja eine Nachkommastelle wäre ok.

Ist doch schon mal eine Aussage

> Was meinst du mit speichern?

Welchen Datentyp soll denn die Variable haben, in der du die Temperatur 
speicherst?

> Dafür würde sich doch ein Double-Wert eignen oder?

Kann sein. Kann auch nicht sein.
Nachkommastelle heisst nicht zwangsläufig double oder float.
Manchmal reicht es ja auch, wenn man bei der Ausgabe einfach nur an der 
richtigen Stelle ein Komma einschmuggelt, damit an der Anzeige 20,45 
Euro steht. Programmintern speichert (und rechnet´) man aber alles in 
EuroCent, so dass dann nach der Berechnung 2045 Cent rauskommen, die 
eben nur für die Anzeige zu 20,45 Euro (durch Einschmuggeln eines Kommas 
an der richtigen Stelle) umgeformt werden.

> Oder ich nehme einen Integer-Wert und tuhe ihn durch 10 teilen.

Yep. zb

(PS: mag dich interessieren. In deinem Testprogramm wird die fertige 
Temperatur mit 0.0625 multipliziert. 0.0625 ist aber genau 1/16. D.h. 
vom Sensor wird die Temperatur als 16-faches Vielfaches ausgelesen. 
Misst du im Winter und hat es +1°C dann liefert der Sensor den Wert 16. 
Hat es 2°C dann eben 32 usw.

PS2: und bitte. Du tust nicht teilen und du tust nicht sprechen und du 
tust nicht lesen. Sondern du teilst, du sprichst und du liest. Achte ein 
wenig auf deine Muttersprache.
Gast #1795016
Lesenswert?

Ah Ok.
Stimmt das dann mit der Multiplikations um 0.0625 oder ist das falsch?

Ich habe jetzt folgendes in ds18s20.c geändert:
1
unsigned char read_scratchpad (void) {
2
  //for (i=0; i<9; i++)
3
  scratchpad [0] = read_byte ();
4
  scratchpad [1] = read_byte ();
5
  
6
  scratchpad [6] = read_byte ();
7
  scratchpad [7] = read_byte ();
8
  reset (); //terminate transfer (read 2bytes)
9
      return 1;
10

11
  return 0;
12
}
Und in ds18s20test.c das:
1
int main(void)
2
{
3
  DDRB = 0x00;
4
  PORTB= 0xFF;
5
  
6

7
  int temperature = 0;
8

9
  for (;;) 
10
    {
11
        read_scratchpad ();
12
          temperature = (scratchpad [1] << 8) + scratchpad [0];
13
          temperature = temperature - 0.25;
14
          temperature = temperature + ((scratchpad[7] - scratchpad[6]) / scratchpad[7];
15
          temperature *= 0.0625; //für 12bit
16
  }
17
}
Würde die Berechnung so stimmen?
Was würde der temperature dann zum Schluss für einen Wert angeben also 
beispielsweiße?
#1795031
Lesenswert?

Newby schrieb:
> Ah Ok.
> Stimmt das dann mit der Multiplikations um 0.0625 oder ist das falsch?

Lies anstelle von *0.0625 einfach /16.

Grundsätzlich stimmt das schon. Nur verlierst du alle Kommastellen.

>           temperature = (scratchpad [1] << 8) + scratchpad [0];
>           temperature = temperature - 0.25;
>           temperature = temperature + ((scratchpad[7] - scratchpad[6]) /
> scratchpad[7];
>           temperature *= 0.0625; //für 12bit

Was um alles in der Welt rechnest du da?

Warum so kompliziert?

Den Teil brauchst du auf jeden Fall um die beiden 8 Bit Register zu 
einer 16-Bit Temperatur zusammenzusetzen

          temperature = (scratchpad [1] << 8) + scratchpad [0];

So. jetzt hast du in temperatur einen Wert, der dem 16 fachen der 
richtigen Temperatur entspricht (für +1°C würde da jetzt 16 rauskommen, 
für +2°C w+rden 32 rauskommen, etc).

Du willst 1 Nachkommastelle, also für +1°C hättest du gerne 10 (weil du 
das Komma bei der Ausgabe einschmuggelst)

      temperatur = temperatur * 10 / 16;

Bsp für 2°C:
Der Sensor liefert 32.   32 * 10 -> 320; 320 / 16 -> 20. Oder nach 
Einfügen eines Kommas zwischen 'Zehner und Einer':  2,0
#1795046
Lesenswert?

Newby schrieb:
> Ah ok danke.
>
> Aber wie genau ist jetzt die Ausgabe?

So wie sie dir der Sensor liefert

> Wenn ich den Wert jetzt ausgeben würde, würde er doch nur in 0,5er
> Schritten ausgegeben werden oder?

Wenn dir der Sensor tatsächlich 1/10 Grad liefert, dann stehen die auch 
auf der Ausgabe. Wenn der Sensor nur in 0.5 Grad Schritten auflöst, dann 
stehen auf der Ausgabe auch nur 0.5°

NOchmal: wo hast du das hier
1
         temperature = temperature - 0.25;
2
          temperature = temperature + ((scratchpad[7] - scratchpad[6]) / scratchpad[7];
her? Ich hab jetzt das Datenblatt für diesen Sensor nicht im Kopf.
#1795062
Lesenswert?

Newby schrieb:
> Ich Datenblatt steht folgende Formel:

OK. Dann wird das schon stimmen.

Nur, du kannst das nicht so in C umsetzen.

    ((scratchpad[7] - scratchpad[6]) /  scratchpad[7]

das ist eine Integer Division und keine Gleitkommadivision.
Und ausserdem muss temperatur dann eine double Variable sein, so wie du 
das hast.

Ich kenn jetzt deine Anwendung nicht, für meine Anwendungen würde dieser 
Genauigkeitsboost keine Rolle spielen. Wenn ich eine Raumtemperatur 
messe, dann ist die sowieso nicht über den kompletten Raum hinweg 
überall auf 1/10 Grad gleich. Eine Anzeige auf 1/10 sugeriert daher eine 
Genauigkeit, die schon physikalisch gesehen gar nicht möglich ist. Aber 
das ist meine Anwendung. Bei dir mag das anders aussehen.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren