Re: SHT15 Leitungslängen Kategorie: Sensoren (von Ralf Schroeder - 31.03.2009 8:11) | ||
Als Antwort auf Re: SHT15 Leitungslängen von Markus - 30.03.2009 16:27 | ||
| ||
> > > > Hallo, > > > > ich möchte den Temp- Feuchtesensor SHT15 an mein RB anschlie�en (DTA mit 10k PullUp an VCC). > > > > Mit ca 30cm Leitungslänge funktioniert das auch (auch ohne 10K PullUp), bei 3m (mit CAT-Kabel) nicht. > > > > Was mu� ich machen, damit der Sensor auch mit langen Leitungen angeschlossen > > > > werden kann? Hat jemand Erfahrung damit? > > > > > > > > > > Hallo, > > > > > > mich würde die mögliche Leitungslänge bei SHT Sensoren auch sehr interessieren. > > > Bei mir müssten es ca. 20m sein. > > > Als Leitung steht ein grünes geschirmtes Kabel J-Y(St)Y (2x2x0,8) zur Verfügung > > > (bekannt als EIB-Bus Leitung). > > > Pull-Up Widerstand (10K) gegen Vdd und Kondensator gegen GND ist auch vorhanden. > > > > > > Danke für Hinweise ! > > > > > > Markus > > > > Hallo ihr beiden, > > > > wie wollt Ihr den SHT15 an das RB anschliessen? Die SHTx Serie spricht zwar ein serielles Protokoll, > > aber kein I2C. Wenn via I2C, mit PCF8574(P), kann ich einen Schaltplan liefern, dazu gibt es im Forum, > > unter Module & Funtionen eine sht.zip. > > Mit ca. 20m Kabellänge Cat5-Kabel habe 3 x SHT75 verkabelt, läuft seit einem Jahr problemlos. > > mfg Ralf > > Hallo Ralf, > > in meinem Fall wird ein SHT Sensor an die C-Control II Station an zwei digital Ports angeschlossen. > Sollten es mehr als ein oder zwei SHT's werden ist die Lösung über den I2C Bus port expander > schon besser. Dann werde ich auf Dich zurückkommen. > Aber die sht.zip im Forum unter Module beinhaltet nur die Lösung mit den digitalen Ports !? > Ein sht.c2 mit der Anpassung über den PCF8574 hab ich unter Module und Funktionen nicht gefunden. > > Danke, > Markus > Hallo Markus, sorry mein Fehler. Hier das Modul für SHTx am PCF8574. // Modul 1: shtpcf.c2 /******************************************************************/ /* Treiberbibliothek fuer Sensirion SHT Feuchtesensoren(12/14Bit) */ /* Autor : André Helbig (andre.h@cc2net.de) */ /* Vorlage : André Helbig (andre.h@cc2net.de) */ /* Version : 1.0 */ /* Datum : 20. Juli 2003 */ /* Getestet : ja */ /* Benötigt : ports.c2, system.c2, math.c2, mathx.c2 */ /* Bemerkung : Messung nur im hi-res.Mode(12Bit RH / 14Bit Temp.) */ /* modified : krassos -angepasst auf sht an pcf8574 -diverse Zeilenkommentare - Taupunktberechnung eingefügt /******************************************************************/ byte Clock,Data,err,Adr; /*************************************/ /* Schnittstelle initialisieren !!!geändert!!!*/ /*************************************/ function init(byte adr, byte clock, byte data) {byte i; Clock=clock%16; //modulo kann ggf wegfallen Data=data%16; Adr=adr%16; pcf.set(adr,Clock,0); //clockport auf 0 setzen pcf.on(adr, Data); // dataport als eingang schalten (high) for i = 0 ... 9 pcf.pulse(adr, Clock); //10 Pulse ausgeben } /*************************************/ /* Datenport festlegen !!!!geändert !!!!*/ /*************************************/ function setDataPort(byte adr, byte data) {byte i; pcf.on(adr, data); Data=data%16; } /*************************************/ /* Startbedingung senden !!!geändert!!!! */ /*************************************/ function start() { pcf.set(Adr,Clock,1); pcf.set(Adr,Data,0); pcf.set(Adr,Clock,0); pcf.set(Adr,Clock,1); pcf.on(Adr,Data); pcf.set(Adr,Clock,0); } /*************************************/ /* Byte senden !!!geändert!!!! */ /*************************************/ function Write(byte data) returns int {int i; for i=0 ... 7 { if (data shl i) and 0x80 pcf.on(Adr,Data);else pcf.set(Adr,Data,0); pcf.pulse(Adr,Clock); } pcf.on(Adr,Data); pcf.set(Adr,Clock,1); i=not(pcf.get(Adr,Data)); //ack vom sensor pcf.set(Adr,Clock,0); return i; } /*************************************/ /* Byte empfangen !!!geändert!!!! */ /*************************************/ function Readbyte(int ack) returns byte {byte data,i; data=0; for i=0 ... 7 { pcf.set(Adr,Clock,1); data=(data shl 1) or pcf.get(Adr,Data) and 1; pcf.set(Adr,Clock,0); } if ack pcf.set(Adr,Data,0); else pcf.on(Adr,Data); pcf.pulse(Adr,Clock); pcf.on(Adr,Data); return data; } //------------------------------------ function round(float wert) returns int //------------------------------------ // Kaufmännische Rundungsfunktion, float zu int { float ganz, rest, neu; int ergeb; ganz = math.floor(wert); rest = wert - ganz; if rest >= 0.5 neu = ganz + 1; else neu = ganz; ergeb = neu; return ergeb; } /*************************************/ /* Integer lesen */ /* wartet auf Bereitschaft (Data=Low)*/ /* (timeout 1sek.=Rückgabe 0xF000) */ /*************************************/ function Readint(int ack) returns int {long timer;int data; timer=system.timer(); loop { if pcf.get(Adr,Data)==0 break; if system.timer()-timer>=1000 return 0xF000; yield; } data=Readbyte(1); //High-Byte data=(data shl 8) or Readbyte(0);//Low-Byte return data; } /*************************************/ /* Statusregister schreiben */ /*************************************/ function setRegister(byte reg) returns int { start(); Write(0b00110); return Write(reg); } /*************************************/ /* Statusregister lesen */ /*************************************/ function getRegister() returns byte { start(); Write(0b00111); return Readbyte(0); } /*************************************/ /* Software Reset */ /*************************************/ function Reset() returns int { start(); err=Write(0b11110); //errorbitauswertung return err; } /*************************************/ /* Heizung schalten */ /*************************************/ function setHeater(int state) returns int {byte reg; reg=getRegister(); reg=(reg and 0xFB) or (state!=0 and 0x4); return setRegister(reg); } /*************************************/ /* Temperatur auslesen */ /* Format: 0,00 */ /*************************************/ function getTemp() returns int {int temp; start(); Write(0b00011); return Readint(0)-4000; } /*************************************/ /* Feuchtigkeit auslesen */ /* Format: 0,00 (temp & hyg) */ /*************************************/ function getHyg(int temp) returns int {int hyg; long SOrh,RHlin; start(); Write(0b00101); hyg=Readint(0); if hyg and 0x8000 return -1; SOrh=hyg; RHlin=((405*SOrh - 40000)*250 + ((-7)*SOrh*SOrh))/25; hyg=(((temp-2500)*(1000+8*SOrh)/100)+RHlin)/1000; return hyg; } /* Taupunktberechnung by krassos*/ /* t = Temperatur im Format wie von getHyg() übergeben */ /* h = wie von getHyg() übergeben */ /* Rückgabewert Format 0,0 */ function dew(int t, int h) returns int { float logEx,dew_point,t1,h1; t1=t/100; h1=h/100; if h1 == 0 h1=0.01; logEx=0.66077+7.5*t1/(237.3+t1)+(math.log(h1)-2) ; dew_point = (logEx - 0.66077)*237.3/(0.66077+7.5-logEx) ; //dew_point = logEx; return round(dew_point*10); } | ||
Antwort schreiben Antworten: |