Einfügen als Gemeinsames Modul
Funktionen:
init()
setDataPort()
start()
Write()
Readbyte()
Readint()
setRegister()
getRegister()
Reset()
setHeater()
getTemp()
getHyg()
Beschreibung Nach oben
Das Modul sht.c2 erlaubt die einfache Auswertung der kombinierten
Feuchte-und Temperatursensoren der SHT-Reihe des Herstellers Sensirion.
Der Sensor wird im High-Resolution-Mode betrieben. (14Bit Temperatur / 12Bit
Feuchtigkeit)
Die Rückgabe der relativen Luftfeuchtigkeit erfolgt Temperaturkompensiert.
Es werden zum Anschluß zwei beliebige I/O-Ports benötigt.
Wichtig: An der Datenleitung des Sensors muß ein Pull-Up-Widerstand
(z.B. 10k)
angebracht werden !
Sollen mehrere Sensoren betrieben werden, so wird für jeden weiteren
Sensor ein weiterer I/O-Port für die Datenleitung des Sensors benötigt.
Dabei werden die Clock-Leitungen aller Sensoren zusammengefasst.
Einfügen als Gemeinsames Modul Nach oben
Die Datei sht.c2 in das Verzeichnis .\CControl2\UserLib
kopieren und in der Datei modules.txt
die Zeile sht.c2 einfügen.
Ein zusätzliches Ausrufezeichen unmittelbar nach einem Modulnamen in modules.txt
bestimmt,
daß das Modul in jedem neuen Projekt von Anfang an aktiviert wird.
Funktionen:
Initialisierung Nach oben
function init(byte clock, byte data)
Die Funtkion init initialisiert die für die Datenübertragung benutzten
Ports.
Beim Betrieb mehrere Sensoren muß Init für jeden Sensor einmal
aufgerufen werden. Das wechseln der Sensoren geschieht mit setDataPort().
clock | I/O-Port 0 …15 |
data | I/O-Port 0 …15 |
Daten-Port / Sensor auswählen Nach oben
function setDataPort(byte data)
Mit der Funktion setDataPort wird bei einem Mehrsensorbetrieb der
jeweilige
Datenport des Sensors ausgewählt, der gerade angesprochen werden soll.
data | I/O-Port 0 …15 |
Startbedingung senden Nach oben
function start()
Mit dieser Funktion wird die Startbedingung gesendet. Diese wird von den
Schreib- und
Lesefunktionen benötigt.
Byte senden Nach oben
function Write (byte data) returns int
Die Funktion Write sendet ein Byte zum Sensor. Es wird das Acknowledge zurückgegeben.
data | Datenbyte |
Byte
lesen Nach oben
function Readbyte(int ack) returns byte
Diese Funktion liest ein einzelnes Byte vom Sensor. Sie wird z.B. beim
auslesendes Konfigurationsregisters benötigt.
Sollen Sensordaten mit dieser Funktion ausgelesen werden, so muß nach
dem Kommando-Byte, z.B. mittels wait not(Data);,
auf Sendebereitschaft des Sensors
gewartet werden.
ack | 0=kein Acknowledge senden ungleich 0 = Acknowledge senden |
Integer lesen
Nach oben
function Readint (int ack) returns int
Mit der Funktion Readint werden zwei Byte als Integer vom Sensor gelesen
und zurückgegeben. Es wird dabei auf Sendebereitschadt des Sensors geprüft.
Reagiert dieser nicht innerhalb einer Sekunde, wird die Funktion mit
dem Rückgabewert 0xF000
abgebrochen.
ack | 0=kein Acknowledge nach letzem Byte senden ungleich 0 = Acknowledge senden |
Status-Register schreiben Nach oben
function setRegister(byte reg) returns int
Mit dieser Funtkion kann das Status-Register des Sensors beschrieben werden.
Es wird das Acknowledge des Sensors zurückgegeben.
reg | Statusregister: Bit0: Auflösung 0=12/14Bit(Standard), 1=8/12Bit Bit1: kein Reload vom OTP(=1), Standard=0 Bit2: Heizung 0=aus(standard), 1=ein Bit3: Testbit, nicht benutzen ! (Standard=0) Bit4: reserved (Standard=0) Bit5: reserved (Standard=0) Bit6: End of Life (low voltage detection) Nur lesen ! Bit7: reserved (Standard=0) |
Status-Register lesen Nach oben
function getRegister() returns byte
Die Funktion getRegister liest das Statusregister aus und gibt dieses
als Byte-Wert zurück.
Reset Nach oben
function Reset() returns int
Die Funktion Reset löst einen Softwarereset am Sensor aus.
Es wird das Acknowledge zurückgegeben
Heizung schalten Nach oben
function setHeater(int state) returns int
Mit dieser Funktion kann man die Heizung des Sensors schalten.
Die Heizung benötigt ca. 8mA und erwärmt den Sensor um ca. 5K.
Sie kann benutzt werden, um den Sensor z.B. zu testen oder
Kondensation zu vermweiden.
Wichtig: Der Sensor gibt bei eingeschaltetter Heitung keine korrekten
Werte wieder.
state | 0= Heizung aus, ungleich 0= Heizung ein |
Temperatur messen Nach oben
function getTemp() returns int
Mit getTemp wird die Temperatur ausgelesen. Diese wird als Festkomma-Integer
mit zwei Nachkommastellen zurückgegeben. (z.B. -2715 entspricht -27,15°C)
Reagiert der Sensor nicht, so wird im Fehlerfall der Wert: -8096
zurückgegeben.(-80,96°C)
state | 0= Heizung aus, ungleich 0= Heizung ein |
rel. Luftfeuchte messen Nach oben
function getTemp(int temp) returns int
Mit getHyg wird die relative Luftfeuchte ausgelesen, anschließend
liniearisiert und
temperaturkompensiert. Dazu muß die Temperatur als Festkomma-Integer mit zwei
Nachkommastellen übergeben werden. Wird keine Temperaturkompensation benötigt,
so muß eine Temperatur von 25°C angegeben werden (Wert: 2500).
Die rel.Luftfeuchte wird als Festkomma-Integer mit zwei Nachkommastellen
zurückgegeben. (z.B. 48,79 entspricht 48,79 % rel.)
Reagiert der Sensor nicht, so wird im Fehlerfall der Wert: -1
zurückgegeben.(-0,01 %rel.)
temp | Temperatur als Festkommainteger mit 2
Nachkommastellen. z.B. 2854 für 28,54°C |
Beispiele Nach oben
Diese Beispiele können sowohl mit der Unit und der Station ausgeführt
werden.
Bei der Station sollten hierfür die neuesten alternativen Stationtreiber
(lcdext.c2, stport.c2, stkey.c2) verwendet werden.
Einzelner Sensor: (Port P1H.0 = Clock, Port P1H.1=Data)
thread main
{int x;
lcdext.init();
sht.init(8,9);
sht.Reset();sleep
11;
loop
{
x=sht.getTemp();
lcdext.line(1);
lcdext.zahl5n2(x);
lcdext.put(0x20);lcdext.put(0xDF);lcdext.put('C');
x=sht.getHyg(x);
lcdext.line(2);
lcdext.zahl5n2(x);
lcdext.print("
%relH");
}
}
Zwei Sensoren: (Port P1H.0 = Clock, Port P1H.1=Data1, Port P1H.2=Data2)
thread main
{int x;
lcdext.init();
sht.init(8,9);
sht.Reset();sleep
11;
sht.init(8,10);
sht.Reset();sleep
11;
loop
{
sht.setDataPort(9);
// Sensor 1
x=sht.getTemp();
lcdext.line(1);
lcdext.zahl5n2(x);
lcdext.put(0xDF);lcdext.put('C');
x=sht.getHyg(x);
lcdext.zahl5n2(x);
lcdext.print("%relH");
sht.setDataPort(10);
// Sensor 2
x=sht.getTemp();
lcdext.line(2);
lcdext.zahl5n2(x);
lcdext.put(0xDF);lcdext.put('C');
x=sht.getHyg(x);
lcdext.zahl5n2(x);
lcdext.print("%relH");
}
}
Autor: André Helbig Mail: andre.h@cc2net.de
Erstellt: 20.07.2003