Ansteuerung eines Feuchtesensors vom Typ SHTxx (mit PIC-Mikrocontroller, Elektronik)
6. Software
Die Aufgabe der Software ist das im Abschnitt 3 (Protokoll) beschriebene Protokoll umzusetzen. Weiters
die Linearisierung und Temperaturkompensation gemäß Abschnitt 4. Je nach Bedarf kann auch noch die Checksumme
gemäß Abschnitt 5 berücksichtigt werden. Dies ist aber hier (noch) nicht ausgeführt!
Als Programmiersprache wurde C, und als Compiler CC5X gewählt.
6.1. Portdefinition, externe Register und Konstanten
Portdefinition:
Im Allgemeinen werden bei jeder Anwendung die Eingangspins für den Feuchtigkeitssensor an einen
anderen Portpin verwendet. Damit dies in der Software nur an einer Stelle berücksichtigt werden muss
befindet sich in der Software eine Portdefinition. Diese besteht aus den folgenden 3 Parametern:
- DATA: Dieser Parameter gibt den Portpin für die Datenleitung (DATA) an
- TRIS_DATA: Während der Erzeugung des Protokolls muss der DATA-Pin mehrmals zwischen Ein- und
Ausgang umgeschaltet werden. Dazu wird der Parameter TRIS_DATA benötigt.
- SCK: Dieser Parameter gibt den Portpin für die Taktleitung (SCK) an
Achtung: Wird für DATA der Port B verwendet, so muss für TRIS_DATA das zum Port B zugehörige
TRIS-Register definiert werden. Eine mögliche Portdefinition für einen PIC-Mikrocontroller der
PIC16Fxx-Familie ist:
bit DATA @ PORTB.0;
bit TRIS_DATA @ TRISB.0;
bit SCK @ PORTB.3;
Externe Register:
Die externen Register sind in einer Struktur (struct Sensor) zusammengefasst und beinhalten
die Rohdaten vom Sensor und die daraus berechnete Temperatur und Luftfeuchtigkeit
struct Sensor
{
unsigned char feuchte_lo; // Rohwert vom Sensor (Low-Byte der Feuchte)
unsigned char feuchte_hi; // Rohwert vom Sensor (High-Byte der Feuchte)
unsigned char temperatur_lo; // Rohwert vom Sensor (Low-Byte der Temperatur)
unsigned char temperatur_hi; // Rohwert vom Sensor (High-Byte der Temperatur)
long temperatur_lin; // linearisierter Temperaturwert
long feuchte_lin; // linearisierter Feuchtewert
unsigned long feuchte_komp; // kompensierten Feuchtewert
};
Konstanten für den Feuchtigkeitssensor:
- STATUS_SCHREIBEN: Diese Konstante beinhaltet den Befehlscode für das Beschreiben des
Statusregisters des Sensors (siehe Abschnitt 3.4.3.)
- STATUS_LESEN: Diese Konstante beinhaltet den Befehlscode für das Lesen des Statusregisters
des Sensors (siehe Abschnitt 3.4.2.)
- MESSUNG_TEMPERATUR: Diese Konstante beinhaltet den Befehlscode für eine Temperaturmessung
(siehe Abschnitt 3.3.)
- MESSUNG_FEUCHTE: Diese Konstante beinhaltet den Befehlscode für eine Feuchtigkeitsmessung
(siehe Abschnitt 3.2.)
- ACK, noACK: Diese beiden Konstanten geben an, ob beim Telegramm zum Sensor, eine Bestätigung
(ACK) oder keine Bestätigung (noACK) erfolgen sollen
- TEMPERATUR, FEUCHTE: Mit diesen beiden Konstanten wird zwischen einer Temperaturmessung
(TEMPERATUR) und einer Feuchtigkeitsmessung (FEUCHTE) unterschieden
6.2. Initialisierung (Unterprogramm "INIT")
Dieses Unterprogramm dient zur Initialisierung des Mikrocontrollers. Bei diesem Beispiel ist hier, für
die Implementierung des Protokolls, nur die Definition der der verwendeten Portpins als Ausgang notwendig.
6.3. Unterprogramme zur Kommunikation mit dem Feuchtigkeitssensor
Zur Kommunikation mit dem Feuchtigkeitssensor sind folgende Unterprogramme notwendig:
Nun aber zu den einzelnen Unterprogrammen im Detail:
6.3.1. Unterprogramm FEUCHTE_START
Aufgabe:
Dieses Unterprogramm erzeugt die Startbedingung für die Kommunikation mit dem Feuchtigkeitssensor.
Zur Erinnerung, die Startbedingung ist wie folgt definiert (vgl. Abschnitt
3.1.).
6.3.2. Unterprogramm FEUCHTE_CONNECTIONRESET
Aufgabe:
9 SCK-Zyklen, während DATA = 1, anschließend eine Startbedingung (vgl. Abschnitt
3.6.).
6.3.3. Unterprogramm FEUCHTE_SCHREIBEN
Aufgabe:
Ein Byte (also eine Anweisung) an den Sensor übergeben und die Bestätigung vom Sensor empfangen.
Vorgehensweise:
- Register fehler löschen
- Mit einer Schleife jedes einzelne Bit des zu übergebenden Bytes maskieren und das Ergebnis auf die
DATA-Leitung geben. Anschließend einen Taktimpuls erzeugen
-
Nun die Bestätigung (Acknowledge) empfangen:
- DATA = 1
- SCK = 1 (steigende Flanke der Takt-Leitung)
- Das TRIS_DATA-Flag muss nun gesetzt werden, da der DATA-Pin auf Eingang umgeschaltet werden muss.
- Nun die DATA-Leitung einlesen und in fehler sichern
- SCK = 0 (fallende Flanke der Takt-Leitung)
- Das TRIS_DATA-Flag muss wieder gelöscht werden, da der DATA-Pin nun wieder als Ausgang dienen soll.
6.3.4. Unterprogramm FEUCHTE_LESEN
Aufgabe:
Ein Byte vom Sensor lesen und eine Bestätigung zurückgeben, wenn ack=1
Vorgehensweise:
- DATA = 1
- Das TRIS_DATA-Flag muss nun gesetzt werden, da der DATA-Pin auf Eingang umgeschaltet werden muss.
- Mit einer Schleife das 8-Bit Datenwort bitweise einlesen
- SCK = 1 (steigende Flanke der Takt-Leitung)
- Das TRIS_DATA-Flag muss wieder gelöscht werden, da der DATA-Pin nun wieder als Ausgang dienen soll.
- Nun die Bestätigung (Acknowledge) senden
- DATA = 1
6.3.5. Unterprogramm FEUCHTE_STATUSSCHREIBEN
Aufgabe:
Statusregister des Sensors beschreiben
Vorgehensweise:
- Startbedingung mit dem Unterprogramm FEUCHTE_START erzeugen
- Anweisung zum Beschreiben des Sensor-Statusregister (mit dem Unterprogramm FEUCHTE_SCHREIBEN mit
dem Parameter STATUS_SCHREIBEN (=0x06))
- Den Wert p_value mit dem Unterprogramm FEUCHTE_SCHREIBEN in das Statusregister des Sensors schreiben
6.3.6. Unterprogramm FEUCHTE_STATUSLESEN
Aufgabe:
Statusregister des Sensors und Checksumme auslesen
Vorgehensweise:
- Startbedingung mit dem Unterprogramm FEUCHTE_START erzeugen
- Anweisung zum Auslesen des Sensor-Statusregister (mit dem Unterprogramm FEUCHTE_SCHREIBEN mit dem
Parameter STATUS_LESEN (=0x07))
- Status-Register mit dem Unterprogramm FEUCHTE_LESEN einlesen und im Übergabeparameter *p_value sichern
- Checksumme mit dem Unterprogramm FEUCHTE_LESEN einlesen und im Übergabeparameter *p_checksum sichern.
6.3.7. Unterprogramm FEUCHTE_MESSUNG
Aufgabe:
Einen Feuchtigkeits- oder Temperatur-Messzyklus starten
Vorgehensweise:
- Startbedingung mit dem Unterprogramm FEUCHTE_START erzeugen
- Je nach Mode (Temperaturmessung oder Feuchtigkeitsmessung) den Wert 03h (für eine Temperaturmessung)
oder 05h (für eine Feuchtigkeitsmessung) mit dem Unterprogramm FEUCHTE_SCHREIBEN dem Sensor übergeben, und
so diese Messung starten.
- Die DATA-Leitung auf Eingang umschalten und warten bis der Sensor diese DATA-Leitung auf Low legt, als
Zeichen, dass er mit der Messung fertig ist und die Messwerte abholbereit sind.
- Nun das High-Byte und das Low-Byte mit Hilfe des Unterprogramms FEUCHTE_LESEN einlesen.
6.3.8. Unterprogramm FEUCHTE_LINEARISIERUNG
Aufgabe:
Aus den vom Sensor empfangenen Roh-Daten die Temperatur und die Feuchtigkeit berechnen. Anschließend
muss der Feuchtigkeitswert linearisiert und mit der Temperatur kompensiert werden.
Formeln: (8/12-Bit-Mode):
- Temperatur = 0.04 * (256*temperatur_hi + temperatur_lo) - 40
-
Feuchte:
0 <= feuchte_lo <= 107: Feuchte = (143 * feuchte_lo - 512) / 256
108 <= feuchte_lo <= 255: Feuchte = (111 * feuchte_lo + 2893) / 256
Feuchte(komp) = (Temperatur-25)*(0.01 + 0.00128*rH) + Feuchte
Formeln: (12/14-Bit-Mode)
- Temperatur = 0.01 * (256*temperatur_hi + temperatur_lo) – 40
-
Feuchte:
rF = 256*feuchte_hi + feuchte_lo
Feuchte = -4 + 0.0405 * rH - 0.0000028 * rH * rH
Feuchte(komp) = (Temperatur-25)*(0.01 + 0.00008*rH) + Feuchte

Autor: Buchgeher Stefan
Erstellt: 14. Dezember 2004
Letzte Änderung: 23. Februar 2011