Elektronik-Projekt: Temperatur-Feuchtigkeits-Modul (Version 2)


zurück zu Elektronik, Homepage

Fertiges Temperatur-Feuchtigkeits-Modul (Version 2, in Betrieb)

1. Grundlegendes zum Feuchtesensor vom Typ SHT1x

1.1. Allgemeines

Sensor(SHT1x)

Der SHT1x[1] (Abbildung 1.1) ist ein so genannter single chip Feuchtigkeits- und Temperatur-Multi-Sensor mit einem werkseitig abgeglichenen Digitalausgang. Dieser Sensor beinhaltet ein kapazitives Polymer-Sensor-Element (für die Feuchtigkeitsmessung) und einen Bandgap-Temperatur-Sensor. Diese beiden Teilsensoren sind mit einem 14-Bit-ADC[2] verbunden. Anschließend erfolgt ein serielles Interface.

Jeder SHTxx wurde werksseitig in einer präzisen Feuchtigkeitskammer abgeglichen. Diese Kalibrierwerte sind im Sensor in Form eines speziellen Speichers abgelegt.

Das 2-Draht-Interface und die interne Spannungsregelung erlauben eine einfache und schnelle Ansteuerung mit z.B. einem PIC-Mikrocontroller. Weitere Eigenschaften sind die sehr kleinen Gehäuseabmessungen und der geringe Leistungsverbrauch.

Die Abbildung 1.2 zeigt das Blockschaltbild des Sensors. Anmerkung: Dieses Blockschaltbild ist leider im aktuellen Datenblatt des Sensors nicht mehr enthalten, so dass es von einer früheren Version des Datenblatts (aus dem Jahre 2003) entnommen wurde).

Blockschaltbild des Sensors (SHT1x)
nach oben

1.2. Genauigkeit

Für die Sensorgenauigkeit gibt der Hersteller folgende Angaben an:

Genauigkeit des Sensors (SHT1x)
nach oben

1.3. Sensorbeschaltung

Abbildung 1.4 zeigt die minimale Beschaltung des Sensors. Neben dem Sensor selbst ist nur mehr ein Pull-Up-Widerstand (R1) für die bidirektionale Datenleitung (DATA) und ein Stützkondensator C1 notwendig.

Beschaltung des Sensors (SHT1x)

Stromversorgung:
Der Sensor benötigt eine Versorgungsspannung zwischen 2.4 und 5.5 Volt. Nach dem Anlegen der Spannung benötigt der Sensor 11ms um von seinem "Sleep"-Zustand aufzuwachen. Während dieser Zeit sollten keine Anweisungen an den Sensor gesendet werden. Weiters sollte zwischen den Versorgungspins GND (Vss) und Vdd ein 100nF-Keramikkondensator vorgesehen werden (In Abbildung \ref{picSensorBeschaltung} ist dies der Kondensator C1).

Serielles Interface:
Das serielle Interface des Sensors ist für das Auslesen der Sensordaten und für einen geringen Leistungsverbrauch optimiert, und ist nicht kompatibel zum I²C-Interface!

Die Taktleitung (SCK) ist für die Synchronisierung der Kommunikation mit z.B. einem PIC-Mikrocontroller zuständig.

Die Daten-Tristate-Leitung (DATA) ist für den Datentransfer vom und zum Sensor zuständig. Die Datenleitung darf sich nur nach einer fallenden Flanke der Taktleitung (SCK) ändern und ist gültig bei einer steigenden Flanke der Taktleitung. Während die Taktleitung high ist muss die Datenleitung konstant bleiben.

nach oben

1.4. Protokoll

Achtung:
Wie schon vorher angemerkt ist das Protokoll zur Kommunikation mit dem Sensor nicht mit dem I²C-Protokoll (der Fa. Phillips) identisch.
nach oben

1.4.1. Start-Sequenz

Jede Kommunikation mit dem Sensor beginnt mit einer so genannten Start-Sequenz. Diese Start-Sequenz ist wie folgt definiert (Abbildung 1.5):

Start-Sequenz

Die Startsequenz besteht aus einer Absenkung der Datenleitung (DATA) während die Taktleitung (SCK) high ist. Anschließend muss die Taktleitung (SCK) von high nach low und kurz darauf wieder nach high gehen. Während dieser Zeit muss aber die Datenleitung auf Low-Pegel bleiben. Sie darf erst wieder high werden, wenn auch die Taktleitung (SCK) wieder high ist.

Ausnahme:
Soll der Sensor zurückgesetzt werden, so erfolgt die Start-Sequenz nach der so genannten "Connection-Reset-Sequenz" (siehe Abschnitt 1.4.5. Rücksetzen des Sensors).

nach oben

1.4.2. Feuchtigkeitsmessung

Um eine Feuchtigkeitsmessung starten zu können, muss zunächst die Start-Sequenz (entsprechend Abschnitt 1.4.1. Start-Sequenz) erfolgen, und anschließend der Befehlscode für eine Feuchtigkeitsmessung (Binärcode: 00000101). Ist der Befehlscode gültig, so legt der Sensor die Datenleitung zunächst auf Low und anschließend wieder auf high (Ack). Nun muss der Mikrocontroller warten bis die Feuchtigkeitsmessung beendet ist. Diese Zeit hängt in erster Linie von der gewählten Auflösung ab. (ca. 55ms bei einer 12-Bit-Auflösung bzw. 11ms bei einer 8-Bit-Auflösung). Die Auflösung kann über das Statusregister eingestellt werden (siehe Abschnitt 1.4.4. Sensor-Statusregister lesen bzw. beschreiben).
Während der Sensor die Feuchtigkeit misst, bleibt die Datenleitung (DATA) auf High-Pegel und die Taktleitung (SCK) auf Low-Pegel. Ist der Sensor mit der Feuchtigkeits-messung fertig, so legt der Sensor die Datenleitung auf Low-Pegel, und signalisiert somit dem Mikrocontroller, dass die Daten für die Feuchtigkeit zur Abholung bereit sind. Dazu wird zunächst das höherwertige Byte vom Mikrocontroller Bit für Bit, beginnend mit dem MSB eingelesen. (Achtung: Bei einer 12-Bit-Auflösung, sind die ersten vier Bits low, bei einer 8-Bit-Auflösung sind alle Bits low). Nun muss der Mikrocontroller den Empfang des höherwertigen Bytes bestätigen, indem er die Datenleitung auf Low-Pegel legt. Anschließend kann der Mikrocontroller das niederwertige Byte Bit für Bit (wieder beginnend mit dem MSB) einlesen und dieses wiederum bestätigen. (Datenleitung auf Low-Pegel). Zum Schluss kann noch eine Checksumme empfangen werden. Das nach der Checksumme folgende Bestätigungsbit (Ack) beendet die Kommunikation mit dem Sensor. Wird die Checksumme nicht benötigt, so kann der Mikrocontroller bereits nach dem letzten Datenbit die Kommunikation mit dem Sensor beenden, indem der Mikrocontroller die Datenleitung (DATA) nach dem Bestätigungsbit (Ack) auf High legt.
Nachdem die Kommunikation beendet ist kehrt der Sensor automatisch in den "Sleep"-Modus zurück.

Die Abbildung 1.6 zeigt den gesamten Ablauf einer Feuchtigkeitsmessung beginnend mit der Start-Sequenz bis zur CRC-8-Checksumme.

Protokoll zur Feuchtigkeitsmessung
Achtung:
Damit sich der Sensor nicht um mehr als 0,1°C erwärmt, sollte der Sensor nicht länger als 15% der Zeit aktiv sein. Dies entspricht max. 3 Messungen pro Sekunde bei einer Auflösung von 12 Bit).
nach oben

1.4.3. Temperaturmessung

Der Zyklus für eine Temperaturmessung ist prinzipiell gleich wie jener für die Feuchtigkeitsmessung: Zuerst erfolgt die Start-Sequenz (entsprechend Abschnitt 1.4.1. Start-Sequenz). Anschließend der Befehlscode für eine Temperaturmessung (Binärcode: 00000011). Ist der Befehlscode gültig, so legt der Sensor die Datenleitung zunächst auf Low und anschließend wieder auf high (Ack). Nun muss der Mikrocontroller warten bis die Temperaturmessung beendet ist. Diese Zeit hängt in erster Linie von der gewählten Auflösung ab. (ca. 210ms bei einer 14-Bit-Auflösung bzw. 55ms bei einer 12-Bit-Auflösung). Auch hier kann die Auflösung über das Statusregister eingestellt werden (siehe Abschnitt 1.4.4. Sensor-Statusregister lesen bzw. beschreiben).
Während der Sensor die Temperatur misst, bleibt die Datenleitung (DATA) auf High-Pegel und die Taktleitung (SCK) auf Low-Pegel. Ist der Sensor mit der Temperatur-messung fertig, so legt der Sensor die Datenleitung auf Low-Pegel, und signalisiert somit dem Mikrocontroller, dass die Daten für die Temperatur zur Abholung bereit sind. Dazu wird zunächst das höherwertige Byte vom Mikrocontroller Bit für Bit, beginnend mit dem MSB eingelesen. (Achtung: Bei einer 12-Bit-Auflösung, sind die ersten vier Bits low). Nun muss der Mikrocontroller den Empfang des höherwertigen Bytes bestätigen, indem er die Datenleitung auf Low-Pegel legt. Anschließend kann der Mikrocontroller das niederwertige Byte Bit für Bit (wieder beginnend mit dem MSB) einlesen und dieses wiederum bestätigen. (Datenleitung auf Low-Pegel). Zum Schluss kann noch eine Checksumme empfangen werden. Das nach der Checksumme folgende Bestätigungsbit (Ack) beendet die Kommunikation mit dem Sensor. Wird die Checksumme nicht benötigt, so kann der Mikrocontroller bereits nach dem letzten Datenbit die Kommunikation mit dem Sensor beenden, indem der Mikrocontroller die Datenleitung (DATA) nach dem Bestätigungsbit (Ack) auf High legt.
Nachdem die Kommunikation beendet ist kehrt der Sensor automatisch in den Sleep-Modus zurück.

Die Abbildung 1.7 zeigt den gesamten Ablauf einer Temperaturmessung beginnend mit der Start-Sequenz bis zur CRC-8-Checksumme

Protokoll zur Temperaturmessung
Achtung:
Auch bei der Temperaturmessung gilt: Damit sich der Sensor nicht um mehr als 0,1°C erwärmt, sollte der Sensor nicht länger als 15% der Zeit aktiv sein. Dies entspricht max. 3 Messungen pro Sekunde bei einer Auflösung von 12 Bit.
nach oben

1.4.4. Sensor-Statusregister lesen bzw. beschreiben

Das 8-Bit-Statusregister dient zur Einstellung der zusätzlichen Funktionen und ist laut Tabelle in Abbildung 1.8 aufgebaut.

Sensor-Statusregister

ür den Anwender sind nur die Bits 0,1,2 und 6 interessant, wobei die Bits 0,1 und 2 sowohl von der Auswerteelektronik (z.B. von einem Mikrocontroller) gelesen als auch beschrieben werden können. Bit 6 gibt an, ob die Versorgungsspannung des Sensors im erlaubten Bereich ist. Dieses Bit wird vom Sensor automatisch gesetzt oder gelöscht, und kann daher von der Auswerteelektronik nur gelesen werden.

Erläuterung zu Bit 0:
Die voreingestellten Mess-Auflösungen sind 14 Bit für die Temperatur und 12 Bit für die Feuchtigkeit. Diese Einstellung kann auf 12 Bit (Temperatur) und 8 Bit (Feuchtigkeit) herabgesetzt werden. Dies ist besonders bei Anwendung nützlich, die schnelle Messungen oder eine niedrige Leistungsaufnahme erfordern.

Erläuterung zu Bit 2:
Auf dem Sensor befindet sich ein Heizelement, welches eingeschaltet (Bit 2 = 1) oder ausgeschaltet (Bit 2 = 0) werden kann. Das eingeschaltet Heizelement kann die Temperatur des Sensorchips um ca. 5°C erhöhen. Die Stromzunahme beträgt dabei ca. 8mA (bei 5-V-Betriebsspannung).

Anwendung des Heizelements:

Achtung:
Während der Sensor geheizt wird zeigt der Sensor höhere Temperaturen und niedrigere Feuchtigkeitswerte an.

Erläuterung zu Bit 6:
Die "End of Battery"-Funktion prüft auf geringe Versorgungsspannung (< 2.47V) bei einer Genauigkeit von +/- 0.05V.

Sensor-Statusregister lesen

Zuerst erfolgt die Start-Sequenz (entsprechend Abschnitt 1.4.1. Start-Sequenz). Anschließend der Befehlscode für das Lesen des Statusregisters (Binärcode: 00000111). Ist der Befehlscode gültig, so legt der Sensor die Datenleitung auf Low (Ack). Nun kann der Mikrocontroller das 8-Bit-Statusregister Bit für Bit, beginnend mit dem MSB einlesen, und muss es anschließend bestätigen, indem er die Datenleitung auf Low-Pegel legt. Zum Schluss kann noch eine Checksumme empfangen werden. Das nach der Checksumme folgende Bestätigungsbit (Ack) beendet die Kommunikation mit dem Sensor. Wird die Checksumme nicht benötigt, so kann der Mikrocontroller bereits nach dem letzten Bit des Statusregisters die Kommunikation mit dem Sensor beenden, indem der Mikrocontroller die Datenleitung (DATA) nach dem Bestätigungsbit (Ack) auf High legt.
Nachdem die Kommunikation beendet ist kehrt der Sensor automatisch in den "Sleep"-Modus zurück.

Die Abbildung 1.9 zeigt den gesamten Ablauf beginnend mit der Start-Sequenz bis zur Checksumme.

Protokoll zum Lesen des Sensor-Statusregisters

Sensor-Statusregister beschreiben

Zuerst erfolgt die Start-Sequenz (entsprechend Abschnitt 1.4.1. Start-Sequenz). Anschließend der Befehlscode für das Beschreiben des Statusregisters (Binärcode: 00000110). Ist der Befehlscode gültig, so legt der Sensor die Datenleitung auf Low (Ack). Nun kann der Mikrocontroller das 8-Bit-Statusregister Bit für Bit beginnend mit dem MSB an den Sensor übertragen. Ist das übertragene Statusregister gültig, so legt der Sensor die Datenleitung auf Low (Ack). Abschließend kehrt der Sensor automatisch in den "Sleep"-Modus zurück.

Die Abbildung 1.10 zeigt den gesamten Ablauf beginnend mit der Start-Sequenz bis zur Checksumme.

Protokoll zum Beschreiben des Sensor-Statusregisters
nach oben

1.4.5. Rücksetzen des Sensors

Wird die Kommunikation mit dem Sensor unterbrochen, so muss mit der folgenden Befehlsfolge (Connection-Reset-Sequenz) die Kommunikation mit dem Sensor neu gestartet werden.
Neun oder mehr Taktimpulse während die Datenleitung (DATA) high ist. Gefolgt von einer Startsequenz entsprechend Abschnitt 1.4.1. Start-Sequenz. Die Abbildung 1.11 zeigt diese Sequenz.

Connection-Reset-Sequenz
nach oben

1.5. Zeitdiagramm

Zeitdiagramm
Zeitdiagramm
nach oben

1.6. Linearisierung und Temperaturkompensation

Ein Nachteil des Sensors ist, dass sowohl die Temperatur als auch die Feuchtigkeit eine nichtlineare Kennlinie besitzen. Dazu kommt, dass die Feuchtigkeit von der Temperatur abhängt und daher kompensiert werden muss. Doch glücklicherweise lassen sich sowohl die Nichtlinearität als auch die Kompensation mit den folgenden Formeln korrigieren:

Bei 14- bzw. 12-Bit-Auflösung:
Linearisierung der Temperatur bei 14-Bit-Auflöung:
Temp(lin) = 0.01 + 0.018 * Sensorwert (Temp)

Linearisierung der Feuchtigkeit bei 12-Bit-Auflöung:
Feuchte(lin) = -4 + 0.0405*Sensorwert(Feuchte) - 0.0000028 * Sensorwert(Feuchte)²

Temperatur-Kompensation der Feuchtigkeit bei 12-Bit-Auflöung:
Feuchte(komp)=(Temp(lin)-25)*(0.01+0.00008*Sensorwert(Feuchte))+Feuchte(lin)

Bei 12- bzw. 8-Bit-Auflösung:
Linearisierung der Temperatur bei 12-Bit-Auflöung:
Temp(lin) = 0.04 + 0.072 * Sensorwert (Temp)

Linearisierung der Feuchtigkeit bei 8-Bit-Auflöung:
Feuchte(lin) = -4 + 0.648*Sensorwert(Feuchte) - 0.00072 * Sensorwert(Feuchte)²

Temperatur-Kompensation der Feuchtigkeit bei 8-Bit-Auflöung:
Feuchte(komp)=(Temp(lin)-25)*(0.01+0.00128*Sensorwert(Feuchte))+Feuchte(lin)

Anmerkung:
Die Feuchtigkeit kann im 8-Bit-Mode auch mit guter Näherung "einfacher" ermittelt werden. Der Fehler beträgt dabei max. +/- 0.8%:

Sensorwert(Feuchte) zwischen 0 und 127:
Feuchte(lin) = (143 * Sensorwert(Feuchte) – 512) / 256

Sensorwert(Feuchte) zwischen 128 und 255:
Feuchte(lin) = (111 * Sensorwert(Feuchte) + 2893) / 256

nach oben

1.7. CRC-8 Checksumme-Berechnung

Die CRC-8-Checksumme wird bei meinen Anwendungen nicht benötigt!

nach oben

1 Die Sensorfamilie SHT1x besteht aus den Typen SHT10, SHT11 und SHT15

2 ADC steht für Analog-Digital-Conversation

nach oben


zurück zu Elektronik, Homepage

Autor: Stefan Buchgeher
Erstellt: 21. Februar 2011
Letzte Änderung: