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 |
|||||||||||||||||||||||||||||||||||||||||||||||||||
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. |
|||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||
Um nun die Temperaturwerte aus dem Sensor in dem Prozessor zu laden bedienen wir uns des folgenden kleinen Programm's. |
|||||||||||||||||||||||||||||||||||||||||||||||||||
![]() 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. |
|||||||||||||||||||||||||||||||||||||||||||||||||||
![]() 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: |
|||||||||||||||||||||||||||||||||||||||||||||||||||
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, |
|||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||
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. |
|||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||
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.
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. |
|||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||
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 |