Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - FAQ - Zum CC1-Forum - Zum CC-Pro-Forum

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
Ich nutze:
C-Control II Unit, eigenes Board, OSOPT V3.1
> > > > 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: