erstellt 18.01.2011
Temperatur mit Sensor DS18S20 messen
Erst einmal wird eine Schaltung verwendet bei der ich die nötigen Grundfunktionen zur Temperaturmessung habe.
Dazu gehört eine Atmega 8 mit einem Display , einer Programmierschnittstelle und einigen Leuchtdioden um mögliche
Funktionen an zu zeigen.
Die ersten Funktion die implementiert wird , ist eine x.beliebige Anzeige auf dem Display und einige blinkende Leuchtdioden um zu
prüfen ober die Schaltung und die Programmierschnittstelle überhaupt funktioniert.

Dazu wird erste einmal ein Spannung von 5 Volt angelegt und dann eine Programmierung mit dem Programm " Bascom"
vorgenommen.


Das erste Programm besteht nur aus einige wenige Programmzeilen und überprüft ob alle nötigen Funktionen vorhanden sind.

Nachdem diese Programmzeilen compiliert und in de Atmega 8 hinein geschoben worden sind , sollte nach einem Neustart
Ein Text auf dem Display erscheinen und die Rote Leuchtdioden blinken.
Wenn das erreicht ist geht es über zum nächsten Schritt.
dazu gehört das ein Temperatur Sensor vom Typ DS18S20 angeschlossen wird.


Der Sensor DS 18S20
Der Sensor DS18S20 ist ein Digitaler Temperatur Sensor.
Digital heißt in diesen Fall, das der Sensor eine interne Logik besitzt welche die erfasste Temperatur als einen
Digitalen Wert direkt am Ausgang ausgibt.
Man bezeichnet die Schnittstelle auch als 1 Draht Schnittstelle weil der Sensor außer der Spannungsversorgung
nur einen Draht benötigt um Daten hin und her zu schicken.
Zum auswerten dieses Sensor genügt ein x-beliebiger digitaler Eingang des Mikroprozessors.
Der Sensor benötigt einmal die Betriebsspannung von 3,5 bis 5,5  Volt an Pin 3 , Masse an Pin 1 und den
Digitalen Ausgang an Pin 2.
Es gibt diesen Sensor auch in einer wasserfesten Version mit Kabel Anschluss,
dann haben die Aderfarben folgende Bedeutung Rot = Plus,  Schwarz = GND  und Gelb die Datenleitung.
Diese Sensoren mit einer sogenannten I2C Schnittstelle haben alle eine eindeutigen Ident Nummer.
Das ist nötig damit falls mehrere Sensoren an einen Bus angeschlossen sind, explizit jeder Sensor eindeutig
angesprochen werden kann.
Ist nur ein Sensor am Bus angeschlossen wie im folgenden Beispiel kann man die Zuordnung über die
Adressen überspringen.
Bei mehren Sensoren ist es aber notwendig die gelesenen Werte auch den richtigen Sensoren zu zu ordnen, daher ist es dann
unumgänglich jeden Sensor mit seiner eigenen einmaligen festen internen Adresse an zu sprechen.
 

Der Temperatur Sensor DS 18S20 besitzt intern einen Speicher in dem der aufgenommenen Wert für die zu messende
Temperatur gespeichert ist.
Gleichzeitig können noch Minimum und gespeicherte Maximum Werte ausgelesen und konfiguriert werden von denen
aber im Moment erst einmal Abstand genommen wird.
Um diesen von der Wert der erfassten Temperatur nun aus zu lesen ist es nötig mit von Bascom vorgegebene Befehlen
und gleichzeitig mit vom Sensorhersteller vorgegebene Adressbereiche zu arbeiten und sie mit einander im Einklang
zu bringen .
Dazu führe ich die einzelnen Bascom Befehle erste einmal in der grünen Tabelle auf,
und anschließend in der roten Tabelle die ansprechbaren Adressbereiche des Sensors.

Bascom Befehle
Hier sind nur die Bascom Befehle aufgeführt , die auch im Bezug der i2C Schnittstelle  oder auch als "One Wire" bezeichnet  in Betracht kommen.
1wreset
Dieser Bascom Befehl resettet den  i2C Bus um immer einheitliche Startbedingungen sicher zu stellen
1wwrite
Daten zum Sensor senden
1wread
Daten aus dem Sensor lesen

Senor Adressen/Befehle
Jeder Sensor hat seine eigenen Befehle die man dem dazugehörigen Datenblatt entnehmen kann.
Hier sind nur einmal die wichtigsten beschrieben :
Hex Adressen werden durch ein zusätzliche "H" vor der eigentlich Adresse gekennzeichnet um sie von den Normalen Dezimalzahlen zu unterscheiden.
HCC
Bei dieser Adresse wird die eigentlich Adressüberprüfung übersprungen.
Das funktioniert nur dann ,wenn nur eine einzelner Sensor an dem Bus System angeschlossen ist.
Sind mehrere Sensoren angeschlossen würden die Daten mit einander kollodieren.
H44
Hier wird die Temperatur Messung aktiviert.
HBE
An dieser Adresse kann der Sensor ausgelesen werden
Um nun die Temperaturwerte aus dem Sensor in dem Prozessor zu laden bedienen wir uns des folgenden kleinen Programm's.
In Zeile 70 wird eine Variable festgelegt in der der Sensorwert gespeichert werden
soll.
Zeile 76 ist der Schleifenanfang
Zeile 77 wird mit einen Bascom Anweisung der I2C Bus resettet.
Zeile 78 und 79 wird in einer vom Sensor bereitgestellten Variable "ERR" eine 0
oder 1 abgelegt dadurch kann bei erfolgtem Fehler eine Meldung heraus gegeben
werden.
Diese beiden Zeilen können aber bedenkenlos weg gelassen werden.
Zeile 80 hier wird der  Sensor angewiesen ohne das er Adressiert wird zu reagieren.
( nur möglich bei einen angeschlossenen Sensor)
Zeile 81 Der Sensor wird angewiesen eine Temp Messung vor zu nehmen.
Zeile 82 eine Pause wird eingefügt um die eigentliche Messung zu vollenden.
Zeile 83  wird mit einen Bascom Anweisung der I2C Bus resettet.
Zeile 84 hier wird der  Sensor angewiesen ohne das er adressiert wird zu
reagieren.( nur möglich bei einen angeschlossenen Sensor)
Zeile 85 Der Sensor wird  zum auslesen  angesprochen
Zeile 86 Der ausgelesene Wert wird in Variable gespeichert.
Zeile 88 Der Cursor wird im Display Zeile1 , Spalte 1 gesetzt
Zeile 89 Der in der Variable "Sensorwert" gespeicherte Wert wird auf
Display ausgegeben.
Zeile 96 Das Schleifenende

Nun wird auf dem Display der Wert 35 angezeigt , was aber nicht gleich ist mit der tatsächliche Temperatur die aktuell bei
ca. 16 °C liegt.
Um heraus zu finden wieso das der Fall ist lass ich mir diesen Wert einmal als Binärwert anzeigen
Dazu füge ich noch einige zusätzliche Zeilen in das ursprüngliche Programm ein.

Nun bekomme ich auf dem Display den gleichen Wert auch noch in der
Binären Version angezeigt.
Somit hab ich nun eine 16 Bit lange Zahl die aus dem Sensor ausgelesen wurde.


Berechnung der Tempereatur
Ich lese den Wert aus dem Sensor aus mit beispielsweise 35
Dann teile ich diesen Wert durch 2 und habe als Ergebnis den geraden Temp Wert.
Nun muss ich noch sehen wie ich an die halbe Gradanzeige komme.
Dazu muss das kleinste Bit heran gezogen werden.

Wie aber funktioniert nun die Berechnung
Ich hab 1 Byte indem die Temperatur versteckt ist, dabei hat das letzte Bit aber nur die Wertigkeit von 0,5.
Um die Sache besser zu verstehen sieht man sich Sache besser als Binärdaten an, weil sie so auch im Datenblatt des
Sensors hinterlegt sind und besser zum Verständnis beiträgt
Das wäre dann in Binärer schreibweise folgendermaßen:
Der Wert 36 wird also Binär wie folgt dargestellt:

High Byte
Low Byte

0
0
0
0
0
0
0
0
64
32
16
8
4
2
1
Wertigkeit
0
0
0
0
0
0
0
0
0
1
0
0
1
0
0
Ausgelesenen Daten
Es wird hier der Dezimalwert 36 als Binärwert  100100 angezeigt.
Nun ist es laut Datenblatt vom Sensor aber so das der letzte Wert der Digitalzahl aber nicht als eine eins gewertet wird sondern
nur als 0 oder 0,5.

Dazu stellen wir rechts vom Bit 1 noch einen Bit von 0,5,
High Byte
Low Byte

0
0
0
0
0
0
0
0
64
32
16
8
4
2
1
0,5
Wertigkeit
0
0
0
0
0
0
0
0
0
1
0
0
1
0
0

Ausgelesenen Daten
damit dieses Bit aber nicht leer bleibt,
weil Bits immer von rechts nach links ihre Wertigkeit erhöhen, verschieben wir die ganze Zahlenwerte um eine Stelle nach
rechts
Das geschieht in Bascom mit dem Befehl  "Shift Variable,Right"
Dann sieht die Tabelle wie folgt aus.

High Byte
Low Byte

0
0
0
0
0
0
0
0
64
32
16
8
4
2
1
0,5
Wertigkeit
0
0
0
0
0
0
0
0
0
0
1
0
0
1
0
0
Ausgelesenen Daten
Rechnen wir die Bits nun um damit wir einen Dezimalwert erhalten kommen wir auf den Wert von 18.
Damit haben wir den glatten Wert von 18 °C
Mann hätte auch einfach den angezeigten Wert von 36 durch 2 teilen können um auf diesen Wert zu kommen.
aber das hätte nichts zum Verständnis beigetragen.
Außerdem ist dies nur die halbe Miete denn es fehlt noch etwas.
Nun muss noch der Halbe Temperaturwert  also ganz rechts der 0,0 oder 0,5 °C beträgt hinzu addiert werden.



Dabei wird der ganz rechte Wert nur als halber Grad gewertet steht dort eine 1  bedeutet dies 0,5°
steht dort eine 0 sind es 0° .
Dieser Wert muss dann zum ursprünglichen Wert von 18 hinzu gezählt werden.
Um an diesen Wert zu gelangen werden wir alle anderen Werte resetten also auf Null stellen,
nur den letzten Wert nicht.
Das geschieht mit dem "Reset" Befehl


Reset Ds1820.1
Reset Ds1820.2
Reset Ds1820.3
Reset Ds1820.4
Reset Ds1820.5
Reset Ds1820.6
Reset Ds1820.7

Nun geht es also nur noch um den ganz rechten Wert , der 0 seon kann oder 1
Im vorliegenden Fall ist er Null
also ist er nicht relevant, würde er eien eins beinhalten müssten wir zur ursprüngliche Temperatur  den Wert von 0,5 hinzu addieren.


High Byte
Low Byte

0
0
0
0
0
0
0
0
64
32
16
8
4
2
1
0,5
Wertigkeit
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
Ausgelesenen Daten
Es werden hiermit die Bits 1 bis 7 der Variable " Ds1820" auf Null gesetzt, so das nur noch das ganz rechte Bit seinen Inhalt behält
Die Variable kann dann nur noch den Wert 0,0 oder 0,5 beinhalten.
Dieser Wert wird dann dem ursprünglichen Wert hinzuaddiert.
Damit wäre die kommplette Temperatur vorhanden.


Jetzt muss noch unterschieden werden ob es sich bei der Temperatur um einen Positiven oder Negativen Wert handelt.
Diese Information ist in den höherwertigen Bits enthalten.
Sollten die acht Bits im High Byte alle eine 1 führen so ist der Temperaturwert Negativ, sonst Posistiv.

High Byte
Low Byte

0
0
0
0
0
0
0
0
64
32
16
8
4
2
1
0,5
Wertigkeit
1
1
1
1
1
1
1
1
0
0
0
0
0
0
0
0
Ausgelesenen Daten
Also werden mit dem Bascom Befehl
 "HIGH"
Die höherwertigen Bits ausgelesen und abgefragt ob der Werte dieser Bits sich größer als Null befinden
Dann zeigen wir ein Minus Siganl an , sonst einfach ein Plus Signal oder gar kein Vorzeichen.

Vorzeichen = High(ds1820)

If Vorzeichen > 0 Then
 Locate 1 , 3
 Lcd "-"
 Else
 Locate 1 , 3
 Lcd "+"
 End If

Damit wären erst einmal die wichtigsten Funktionen vorhanden.

Aktualisiert 07.01.2025

Copyright by Ms 2009