erstellt 18.01.2011
Temp Messung 2025
Ziel dieses Versuches ist es mit einem Digitalen Temperatur Sensor vom Typ DS18B20 die Temperatur zu erfassen und natürlich auch aus zu werten.
Anschließend dann soll die Temperatur per Funk an einen Rechner oder einen anderen Empfänger übermittelt werden.
Um ein Verständnis dafür zu bekommen wie der Sensor arbeitet hab ich versucht mich in der Literatur und auch im Internet Sachkundig darüber zu machen ,
leider mit sehr mäßigen Erfolg .
Es gibt zwar genügend Informationen und auch Videos darüber , aber alle die ich finden konnte waren nur bruchstückhaft und oder unvollständig.
Beim genaueren hinterfragen bei Personen die sich schon damit befasst hatten konnte man oft keine gescheiten Informationen bekommen.
Und hinterher kam bei den Meisten befragten dann zu Vorschein, das sie den zum auslesen und auswerten des Sensors benutzen Code in der Regel
aus dem Netzt einfach übernommen haben und selber angepasst hatten ohne Ihn wirklich zu verstehen.
Also sah ich mich gezwungen mich als Autodidakt zu betätigen und der Sache auf den Grund zu gehen.
Erst einmal zu den Sensoren selber, ich spreche hier von der Mehrzahl weil es derer unterschiedliche Typen gibt.
Zumindest die mit denen  ich Bekanntschaft gemacht habe nenne ich hier einmal obwohl ich mich nur mit einen Typen beschäftige,
weil der eine höhere Auflösung hat und auch in einer wasserdichten Variante mir Kabelanschluss zu bekommen ist.
Es gibt den Typ DS18S20, DS1820 , und den hier von mir benutzten Typ DS18B20
Die Auswertung und Berechnung geschieht mit einem Mikroprozessor vom Typ Atmega 8 denn ich als erstes vorstelle.
Den Atmega 8 verwende ich weil es den in einer Standardgröße gibt an dem man noch selber herumlöten kann außerdem gibt es Atmega 8 Typen
mit der Zusatzbezeichnung "L" die auch bei Spannungen herunter bis ca. 3,5 Volt arbeiten.
Das bietet den Vorteil die Schaltung mit einem Akku vom Typ 18680 zu betreiben.
Die weiter unten vorgestellt Schaltung hat ein angeschlossenes Display welches aber nur in der Entwicklung Phase dienen soll und nicht Bestandteil
der fertigen Schaltung sein soll.
Deshalb ist das Display nur aufgesteckt und kann bei fertiger Schaltung wieder entfernt werden.

Atmega 8L

Der Atmega 8 mit den von mir folgend benutzten Anschlüsse:
Die Pins 17-18-19 sind dabei doppelt belegt da beim Programmieren ja nichts auf dem Display angezeigt werden muss.



Pin
Funktion
Beschreibung
7
Spannungsversorgung
Plus 3,7 - 5,0 Volt
6
Ground Spannungsversorgung
Masse
17
Programmier-Schnittstelle / Display
MOSI
18
Programmier-Schnittstelle/Display MISO
19
Programmier-Schnittstelle/Display SCK
1
Programmier-Schnittstelle RESET
23
Display
24
Display
16
Display
4
EIN / Ausgang
Eingang für Temperartur Sensor
9
Quarz Anschluss

10
Quarz Anschluss

2
Funk Schnittstelle
Empfangsleitung
3
Funk Schnittstelle
Sendeleitung
5
Nur zu Testzwecke
entfällt
6
Nur zu Testzwecke entfällt
11
Nur zu Testzwecke Sende Überprüfung
12
Nur zu Testzwecke Empfangs Überprüfung
13
Ein/Ausgang
Rote Led als Betriebs-Led

Temp Sensor DS18B20

Temperaturbereich -55 bis + 125°C
Spannung 3 - 5,5 Volt
Stromaufnahme ca. 1 mA
Auflösung 12 Bit sind 0,0625 Grad Schritte
Genauigkeit +- 0,5°

Funk Modul
Als weiters Modul dient ein Funkmodul mit der Bezeichnung "HC11" oder etwas neuer "HC12".
Dabei ist zu beachten , das man ja 2 Stück Module benötigt ,einmal als Sender und einmal als Empfänger .
Welche Typ ist nicht wichtig aber es muss sicher gestellt werden das beide Typen also Sender sowie
Empfänger vom gleiche Typ sind weil sie offensichtlich verschiedene Protokolle haben

Diese Funk Modul arbeitet bei ca 433 MHz
Spannung 3,2 - 5,5 Volt
Stromverbrauch max. 200 mA



Display



Bei dem Display handelt es sich um ein 4* 20 Zeichen Display mit der Bezeichnung "2004A"
Das Display ist steckbar und kann bei Bedarf entfernt werden.

Schaltplan

Die Schaltung enthält Bauteile die nur nötig sind wenn die Temperatur per Funk weitergeleitet werden soll.
Wenn das aber nicht gewollt ist, und die Anzeige nur auf dem aktuellen Display statt finden soll , können einige Bauteile in der Schaltung weg gelassen werden.
Dazu gehören das Funk-Modul , Quarz, 2 mal 20p Kondensatoren, und im extrem Fall auch die Leuchtdioden mit ihren Widerständen sowie die beiden Taster.

Programm Code in Bascom
Mit diesem Code wir der Sensor DS18B20 ausgelesen

Programm Code
Beschreibung
Config 1wire = Portd.2 Schnittstelle für Temp Sensor festlegen
Dim Sensorwert As Integer Variable für Temperatur Messung
Dim A As Byte
Cls

Do

1wreset Resettet die Bus Leitung

1wwrite &HCC Adressiert den Sensor
Die Anweisungen
 HCC , H44 , HBE sind  dem Datenblatt des Sensors zu entnehmen.
Waitms 100 Pause
1wwrite &H44 Konvertierung des erfassten Sensor Wert
Waitms 500 Pause
1wreset Resettet die Bus Leitung
Waitms 100 Pause
1wwrite &HCC Adressiert den Sensor
Waitms 100 Pause
1wwrite &HBE Temperatur Daten werden ausgelesen
Sensorwert = 1wread(2)

Locate 3 , 1

Lcd "Sensorw=" ; Sensorwert

Wait 1

Toggle Portd.6

Loop


Als Ergebnis wird bei einer ungefähren Umgebungstemeratur von ca. 18 ° der Wert 283 ausgegeben.


Das ist also der erfasste Wert als Dezimal und als Binärwert

Berechnung des Temperatur Werts
Der aktueller Temperaturwert also die Raumtemperatur wird als Binärwert mit 16 Bit angezeigt oder als Dezimalwert mit 283.
Nun hat jedes Bit seine eigene Wertigkeit die wir dem Datenblatt des Sensor entnehmen müssen.
Dazu werden die ausgelesenen 16 Bits unterteilt in  Low Byte und High Byte , die im  Datenblatt allerdings als LS und MS angegeben werden.
Das Kleinste Bit, also BIT 0  befindet sich ganz rechts und wird zur linken Seite hin immer größer.

2048
1024
512
256
128
64
32
16
8
4
2
1
0,5
0,25
0,125
0,0625
Wertigkeit
Bit 15
Bit
14
Bit 13
Bit 12
Bit 11
Bit 10
Bit
9
Bit
8
Bit
7
Bit
6

Bit
5
Bit
4
Bit
3
Bit
2
Bit
1

Bit
0

0
0
0
0
0
0
0
1
0
0
0
1
1
0
1
1


High Byte ( MS)

Low Byte ( LS)


Nun kann ich jedes Bit einzeln auslesen und mit der jeweiligen Wertigkeit multiplizieren.
Und anschließen alle Ergebnisse addieren um an die Temperatur zu kommen.
Das brauche ich aber nur bei den Bits der Nach Komma Stellen machen, weil es für die Bits vor dem Komma
eine einfacherer Möglichkeit gibt.

0,5
0,25
0,125
0,0625
Wertigkeit
Bit
3
Bit
2
Bit
1

Bit
0

1
0
1
1


Als erstes berechne ich also die Nach-Komma Stellen, das sind die Bits's 0 bis 3.
Der direkt aus dem Sensor erfasste Wert ist in der Variable "Sensorwert" gespeichert .
Also erstelle ich vier Variable denen  jeweils ein Bit zugeordnet werden.
Die Anwesung "Halbe = Sensorwert.3 " liest aus dem Binären "Sensorwert" das dritte Bit von rechts aus gezählt aus und speichert es in der Variable "Halbe"

Halbe = Sensorwert.3
Viertel = Sensorwert.2
Achtel = Sensorwert.1
Sechstel = Sensorwert.0
In der Variable "Sechstel" wird also das Bit "Null" kopiert, in der Variablen Achtel das Bit  "Eins", in der Variablen Viertel das  Bit "Zwei" , usw.

Anschließend werden die Variablen abgefragt, und falls die jeweilige Variable einen Eins auf weist dann wird diese Eins mit der passenden Wertigkeit in der Tabelle multipliziert
befindet sich etwas anderes als eine Eins in der Variable, dann wird der Wert mit Null angenommen und soweit ignoriert.

fi Halbe = 1 Then Wert1 = 0.500 Else Wert1 = 0.000
If Viertel = 1 Then Wert2 = 0.250 Else Wert2 = 0.000
If Achtel = 1 Then Wert3 = 0.125 Else Wert3 = 0.00
If Sechsehtel = 1 Then Wert4 = 0.0625 Else Wert4 = 0.00


Nun werden die vier Werte addiert und in der Variable "Nachkomma" hinterlegt.
Nachkomma = Wert1
Nachkomma = Nachkomma + Wert2
Nachkomma = Nachkomma + Wert3
Nachkomma = Nachkomma + Wert4


Betrachten wir das Ergebnis für die Nach Komma Stelle.
1 mal 0,00625 +
1 mal 0,125+
1 mal 0,5
 wären  0,63125 °C


2046
1024
512
256
128
64
32
16
8
4
2
1
0,5
0,25
0,125
0,0625
Wertigkeit
Bit 15
Bit
14
Bit 13
Bit 12
Bit 11
Bit 10
Bit
9
Bit
8
Bit
7
Bit
6

Bit
5
Bit
4
Bit
3
Bit
2
Bit
1

Bit
0

0
0
0
0
0
0
0
1
0
0
0
1
1
0
1
1




Das gleiche machen wir nun mit den Vor Komma Stellen.
Im Datenblatt des Sensor ist angegeben das der eigentliche Temperatur-Wert in den Bits 0 bis 12 abgespeichert ist.
Bit 0- 3 ist vergeben für die Nachkomma-Stelle und Bit 4 bis 12 für die Vor-Komma Stellen.
Um nun die Vorkomma-Stellen zu berechen kann man es genau so machen , wie bei den Nach Komma stellen.
Es gibt aber auch eine bessere Lösung mit weniger Aufwand.

Nehme ich nun die 16 Bits und verschiebe sie um 4 Stellen nach rechts ,

Shift Sensorwert , Right , 4

dann fallen die 4 Stück Nachkomma Stellen zur rechten Seite heraus und die restlichen Bits haben ihre Normale Wertigkeit
weil ja diese Bits normalerweise keine Kommstellen kennen.
Das ganze sieht dann so aus:





 
1024
512
256
128
64
32
16
8
4
2
1
Wertigkeit
Bit 15
Bit
14
Bit 13
Bit 12
Bit 11
Bit 10
Bit
9
Bit
8
Bit
7
Bit
6

Bit
5
Bit
4
Bit
3
Bit
2
Bit
1

Bit
0

0
0
0
0
0
0
0
0
0
0
0
1
0
0
0
1



Das Ergebnis wäre dann
1 mal 1 +
1 mal 16

wären 17 °C

Addiere ich nun die Ganzen Werte mit der Nachkomma Stelle komme ich auf 17,63125°C



Nun kann man noch angeben ob es sich um einen positive oder negative Temperatur handelt.
Diese Information ist gespeichert in den Bits  10 bis Bit 15.
Bei 0 °C und darunter enthalten alle diese  Bits den Wert  "1"

 




 
1024
512
256
128
64
32
16
8
4
2
1
Wertigkeit
Bit 15
Bit
14
Bit 13
Bit 12
Bit 11
Bit 10
Bit
9
Bit
8
Bit
7
Bit
6

Bit
5
Bit
4
Bit
3
Bit
2
Bit
1

Bit
0

0
0
0
0
0
0
0
0
0
0
0
1
0
0
0
1

Vorzeichen Bits


Also werden alle diese Bits abgefragt ob sie alle eine "1" enthalten um den Temperaturwert dann eine Minus oder Pus Zeichen voran zu stellen.
Bit10 = Sensorwert.10
Bit11 = Sensorwert.11
Bit12 = Sensorwert.12
Bit13 = Sensorwert.13
Bit14 = Sensorwert.14
Bit15 = Sensorwert.15


If Bit10 = 1 And Bit11 = 1 And Bit12 = 1 And Bit13 = 1 And Bit14 = 1 And Bit15 = 1 Then Minus = "-" Else Minus = "+"