Forum: Projekte & Code Lib für Sensirion SHT1x Sensor an AVR


von Timo Dittmar (Gast)


Angehängte Dateien:

Lesenswert?

Tach,

in der letzten Zeit wollte ich ein in bischen mit den SHT1x Sensoren
von Sensirion spielen. Leider habe aber keinen sofort lauffähigen Code
ergoogeln können. Deshalb hab ich mal auf Basis der entsprechenden
Sensirion Application Notes einen eigenen Treiber geschrieben.

Vieleicht kann ja noch jemand etwas damit anfangen.
Kommentare sind erwünscht :-)

Wenn ich Zeit dafür finde oder sich die Notwendigkeit ergibt werde ich
den Treiber dahingehend erweitern das man die Daten mit dem CRC WErt
überprüfen kann.

Grüße Timo

von Timo Dittmar (Gast)


Angehängte Dateien:

Lesenswert?

Upps,

hier auch noch die die .h Datei

von Timo Dittmar (Gast)


Angehängte Dateien:

Lesenswert?

neue Version der Bib, jetzt mit CRC Test und Routinen für Interrupt
gesteuertes Auslesen.

Die Interrupt Steuerung ermöglicht es etwas sinnvolles währeend der
200ms die der Sensor für die Messung benötigt zu verwenden.

Da ich vermutlich bei der endgültigen Version meines Projektes eher ein
Problem mit der Rechenzeit als mit zu großen Programmen haben werde, ist
die Routine für den CRC Test recht Flash intensiv. (>500 Byte)

Wie gesagt, vielleicht kann es ja jemand brauchen.

von Dirk (Gast)


Lesenswert?

Moin Timo,

mir hat der Code sehr geholfen, auch wenn ich die Hälfte rauskommentiert 
habe um mein Programm in einem Tiny AVR unterzubringen...


Bis dann

Dirk

von hansl (Gast)


Lesenswert?

servus timo,

prima, nun muss ich nur noch herausfinden woher ich nen sht11 bekomme :)

den kapazitativen feuchtemesser von philips, vor dem ich mich
nun schon so lange fuerchte, kann ich nun in seinem plastikbeutel
belassen, auf das irgendjemand mit dem richtigem werkzeug sich dem
ding mal annimmt.

hast du vielleicht auch nen tip wie man an die netten module von 
sensirion herankommen kann?

danke
 hansl

von Michael S. (mst)


Lesenswert?

Farnell hat den im Programm... knapp 20EUR;

von Roland (Gast)


Lesenswert?

Den Sensor kann man auch direkt vom Distributor beziehen.
http://www.driesen-kern.de
Driesen und Kern liefert auch an privat.

Gruß
Roland

von Timo Dittmar (Gast)


Lesenswert?

@Dirk :
   schön wenn es was gebracht hat. Nachdem ich den Code hier 
reingestellt hatte, habe ich im Netzt natürlich noch einige Beispiele 
gefunden. Aber so ist das ja immer :-) Was hast du auskommentiert?

@hansl
   Ich hatte meine damals bei www.mikromaus.de bestellt, da waren sie 
aber >20Euro.

Leider hatte ich keine Zeit mehr am Code weiterzuarbeiten. Bei dem 
Projekt damals hatte ich für die Berechnung der physikalischen Werte 
einfach floating points und keine Festkommaarithmetik verwendet. Auf 
einem Mega16 der nur nach ein 2x20 LCD ansteuert kamm man sich diese 
Verschwendung von Rechenzeit leisten.


Grüße Timo

von dennis (Gast)


Lesenswert?


von TurboCity (Gast)


Lesenswert?

Also ich bekomme nicht einmal durch den Softreset (error=1).

Meine Sequenz:

  unsigned char error =0;
  unsigned char checksum;
  sht_value humidity;
  sht_value temperature;

  error=sht_softreset();
  if (error)
  { sprintf(buffer, "SHT11 Error (SoftReset) %i\n", error);
    uart_puts(buffer);
  }

        error=sht_measure(&humidity, &checksum, HUMI);
  if (error)
  { sprintf(buffer, "SHT11 Error (HUMI) %i\n", error);
    uart_puts(buffer);
  }
  error=sht_measure(&temperature, &checksum, TEMP);
  if (error)
  { sprintf(buffer, "SHT11 Error (TEMP) %i\n", error);
    uart_puts(buffer);
  }

  sht_raw_to_physical(&humidity, &temperature);

  sprintf(buffer, "Temp=%.2f Humi=%.1f\n",temperature.f, humidity.f);
  uart_puts(buffer);

Ist das die falsche Reihenfolge ?
Ich habe den Code mit einem 4Mhz und einem 7.318Mhz Quarz probiert.

Please help :-)

von Timo Dittmar (Gast)


Lesenswert?

Hallo TurboCity,

ich habe leider schon seit einen dreiviertel Jahr nicht mehr mit den SHT 
Sensoren gearbeitet (liegt aber alles noch auf dem Schreibtisch :-).

Hast du ein Digitaloszi um dir clock und daten anzusehen? Ist etwas 
schwierig da die Frequenz der Daten im Vergleich zu der Wartezeit 
zwischen dem Start der Messung und dem Auslesen der Daten hoch ist. Also 
Oszi mit ausreichender Speichertiefe oder verzögert triggern.

Ich erinnere mich dass ich damals große Probleme mit dem 
pullup-Widerstand hatte. Der interne des AVRs hatte nicht funktioniert.

Falls du noch keinen 100nF Kerko am Sensor hast, solltest du dem Sensor 
einen gönnen. (selbst wenn es nichts bringt ist es schon psychologisch 
wichtig ;-)

Mit welcher Spannung versorgst du den SHT? Wenn es unter 4,5V sind, ist 
Datenrate mit der sht_write_byte die Daten ausgibt zu hoch. (siehe 
Datenblatt des SHT, das ist noch so ein undokumentierte Feature meiner 
Bibliothek :-) Einfach ein delay_us(1) anstelle der nops einfügen.

Ansonsten modifiziere die Bibliothek so das du dir schon während des 
resets  Statusmeldungen ausgibt.

Was pasiert wenn die den Fehler des Softreset einfach ignorierst und 
mindestens 20ms wartest bevor du den nächsten Befehl an den SHT sendest?

Mehr Ideen habe ich jetzt auch nicht :-)


Grüße Timo

von TurboCity (Gast)


Lesenswert?

Hallo Dittmar,

besten Dank für Deine Kommentare.

Leider habe ich kein Oszi zur Verfügung (stelle aber immer mehr fest, 
dass man so etwas unbedingt benötigt.)

Die 100nF sind vorhanden, plus einem 1k Pullup (alternativ habe ich auch 
4k7 probiert) auf der Datenleitung.

Spannung sind gemessene 5.0V.

Wenn ich die Fehlermeldung ignoriere und 20ms warte, so bekomme ich 
error=2 von der read-Funktion zurück.

Da Du keine Anmerkungen zur Reihenfolge hattest, gehe ich mal davon aus, 
dass diese funktionieren sollte :-)


Viele Grüße,
TurboCity


von Timo Dittmar (Gast)


Lesenswert?

Hallo TurboCity,

ja, die Reihenfolge der aufgerufenen Funktionen ist in Ordnung. 
Allerdings sollte man laut Datenblatt nach dem Reset 11ms warten bevor 
man das nächste Kommando losschickt.

Leider habe ich auch keine Idee mehr warum es nicht funktioniert. Die 
Fehlermeldung 2 bedeutet, dass der Sensor kein ack nach dem senden des 
Befehls, als auch nach der Wartezeit immer noch nicht reagiert hat.

Ich denke ab jetzt kommt man nur noch mit einem Oszi weiter.


Viel Glück noch

Timo

von A. D. (Firma: privat) (toranaga)


Lesenswert?

Hi Timo,

die Lib sieht recht praktisch aus, nur wie fummel ich die jetzt um, das 
ich zwei SHT nacheinander ansteuern kann. Es müsste nur der Datenpin 
irgendwie übergeben werden, nur schiesst das #define da etwas quer.

cu
Andreas

von TurboCity (Gast)


Lesenswert?

Kann man irgendwie feststellen (ohne Oszi), ob der SHT11 überhaupt ein 
Lebenszeichen von sich gibt ?

Vielleicht ist mein Chip ja kaputt ?

von Timo DIttmar (Gast)


Lesenswert?

Hallo

@ A. Dubhorn

also um mehrere SHT Sensoren an verschiedenen Datenpin anzusteuern würde 
ich das statische Makro umändern.
So etwas in der Art:
#define SET_SHT_DATA(SHT_DATA_PIN) SHT_DATA_PORT |= ( 1 << 
((SHT_DATA_PIN)))

die #define SHT_DATA_PIN PD6 Anweisung rausschmeißen und die Funktionen 
so anpassen das man den Pin übergeben kann  z.B. so:
unsigned char sht_write_statusreg(unsigned char *p_sht_value, unsigned 
char pin)

natürlich müssen die anderen Makros die auf den Datenpin zugreifen und 
jeder Aufruf der Makros in den Funktionen angepasst werden. sollte aber 
möglich sein.
Poste den Code doch mal wenn du fertig bist.

@ Turbocity

Nicht das ich wüste.  Man könnte überprüfen ob der Stromverbrauch 
innerhalb der Specs liegt, allerdings ist das nur ein sehr indirekter 
Hinweis.

Grüße Timo

von rockclimber (Gast)


Lesenswert?

Hallo Timo, hallo TurboCity,

erstmal vielen Dank an Timo für die feine lib!

Ich glaube, ich hatte am Anfang das gleiche Problem wie TurboCity. Der 
Sensor gab einfach keinen Muks von sich. Die lib ist ja wunderbar 
strukturiet, also hab ich mir erst nicht alle Details angeschaut. Nach 
einigem Probieren hab ich dann aber doch genauer hingeschaut und 
festgestellt, dass das clock-pin nicht richtig initialisiert wurde.
Also folgende Zeile in libsht.h ergänzt:
#define MAKE_SHT_SCK_PIN_OUTPUT SHT_SCK_DDR |= ( 1 << SHT_SCK_PIN)

und in libsht.c in der Funktion sht_softreset(void) folgende Zeile vorn 
angefügt:
MAKE_SHT_SCK_PIN_OUTPUT;

Und siehe da, es funktionierte! Ganz ohne teuren Oszi ;-)

Viele Grüße
rockclimber

PS: stehe jetzt auch vor der Aufgabe, einen zweiten SHT abzufragen. Die 
clock-Leitung können sich beide chips ja teilen. Data ist aber etwas 
aufwändiger...

von Karleido (Gast)


Lesenswert?

Schau mal hier nach
http://www.wetterstationsforum.de/phpBB/viewtopic.php?t=7903
Hier wird das THERMO- HYGROMETER WS 9400 von Conrad beschrieben.
Im Inneren steckt ein SHT1x.

Gruß
Karl

von Timo Dittmar (Gast)


Lesenswert?

Hallo, rockclimber, TurboCity


Danke rockclimber: jetzt sehe ich es auch: der clk-Pin wird in der 
Bibliothek nicht initialisiert.
Mir ist das leider nie aufgefallen da ich damals in meinem Testprogramm 
am Anfang den ganzen Port als Ausgang gesetzt hatte. (das war auch noch 
das LCD dran)
Peinlich, peinlich.



Grüße Timo

von TurboCity (Gast)


Lesenswert?

Vielen Dank an Timo und rockclimber. Jetzt funktioniert es einwandfrei. 
(verneig)

Da muss man auch erst einmal drauf kommen, dass der Port nicht 
initialisiert wird. Ich bedanke mich für die gesparten debug-Sessions 
:-)

Und Timo: Super Lib !!

von Severin (Gast)


Lesenswert?

Hallo zusammen,

vielen Dank erstmal an den Ersteller der Lib, die ist sehr praktisch.

Allerdings komme ich nun nicht ganz mit dem Format der Variablen klar, 
in der z.B. der Wert für die Temperatur abgespeichert ist.

Ich wollte diesen Wert ganz gerne über einen UART ausgeben. Ich bekomme 
es es auch auf die Reihe einen 8 Bit in ASCII zu wandeln, nur mit dieser 
Variablen (sht_value p_temperature) klappt das nicht. Muss ich die erst 
noch auf unsigned char oder so casten, oder hat hier jemand einen 
besseren Tip für mich?

MfG Severin

von Timo D. (tdittmar)


Lesenswert?

Hallo Severin,

schau mal in die libsht.h, dort kannst du sehen dass sht_value ein union 
ist. Er (es?) enthält im gleichen Speicherbereich einen int ( 
ansprechbar als .i) und einen float Wert (als .f) Das ist ein (ziemlich 
unsauberer) Trick um Speicher zu sparen. Die Idee dahinter: die 
sht_measure Funktion liefert die Messwerte als Integer (16bit ,Auflösung 
12 bit RH, 14 bit Temp) zurück. Dort kann man sie dann als variable.i 
abgreifen. variable.f macht zu diesem Zeitpunkt natürlich noch keinen 
Sinn. Bei dem Aufruf von sht_raw_to_physical wird aus den Rohdaten der 
menschenkompatible Wert berechnet und sht_value variable wird 
überschrieben. Jetzt kann man mit variable.f auf den float Wert 
zugreifen. Durch die Verwendung des union wird nicht nur etwas Speicher 
gespart, es ist auch effizienter, da bei dem Aufruf von 
sht_raw_to_physical nicht so viel Speicher über den Stack bewegt wird. 
(ob das in Anbetracht der Verwendung von float-Werten Sinn macht sei 
dahingestellt)

Wenn du das alles richtig verstehen willst, schau ruhig mal in den 
Quellcode und such dir ein (altmodisches?) C-Buch deines Vertrauens in 
dem noch erklärt wird wie Computer auf Speicher zugreifen. Auch hier im 
AVR-GCC Tutorial sind viele Anregungen enthalten :-)


Wie du siehst ist es mit einem einfachen cast nach char nicht getan :-)
Ich denke am einfachsten ist es einfach die zweimal zwei Byte der 
Rohdaten über UART zu übertragen und die Umrechnung in Kalibrierte Werte 
am Computer vorzunehmen. (siehe Lib oder die Sensirion Datenblätter) Der 
Zugriff auf die einzelnen Bytes des Ints gehen z.B. auch wieder über ein 
union (int i, b1,b2 char)

Grüße Timo

von Roland (Gast)


Lesenswert?

kann mir jemand sagen mit welcher frequenz der atmega betrieben werden 
muss? bekomme den code nicht zum laufen.

lg, roland

von Dieter Bohlen (Gast)


Lesenswert?

Moin, habe auch ein Problem mit der Lib: Wo bitte kann ich die fertigen 
Werte abgreifen? Finde keine Variablen wo das Ergebnis drinsteht? In der 
Union auch nicht?

von Dieter Bohlen (Gast)


Lesenswert?

So, hab jetzt mal den Code von oben + der sht11-lib genommen (erweitert 
um den besagten reset-fehlerfix). geht aber immer noch nicht, mein LCD 
zeigt zufällige 5stellige werte an, positiv und negativ.

messen() wird dabei jede sekunde in einer interrupt-routine aufgerufen.



1
void messen(void) {
2
3
unsigned char error =0;
4
unsigned char checksum;
5
  sht_value humidity;
6
  sht_value temperature;
7
8
  error=sht_softreset();
9
  if (error) {
10
  ks0108GotoXY(60,90);
11
  ks0108Puts("ERROR Softreset");
12
  }
13
        error=sht_measure(&humidity, &checksum, HUMI);
14
  if (error)
15
  { ks0108GotoXY(60,90);
16
  ks0108Puts("ERROR Hum");
17
  }
18
  error=sht_measure(&temperature, &checksum, TEMP);
19
  if (error)
20
  { ks0108GotoXY(60,90);
21
  ks0108Puts("ERROR Temp");
22
  }
23
24
  sht_raw_to_physical(&humidity, &temperature);
25
26
  unsigned char tstr[10];
27
  unsigned char hstr[10];
28
  
29
  itoa(temperature.i, tstr , 10);
30
  itoa(humidity.i, hstr , 10);
31
  ks0108ClearScreen();
32
  ks0108GotoXY(16,32-8);
33
  ks0108Puts(tstr);
34
  ks0108GotoXY(75,32-8);
35
  ks0108Puts(hstr);
36
  }

von Dieter Bohlen (Gast)


Lesenswert?

Aber irgendwas scheint zu funktionieren, wenn ich die Sensordatenkabel 
abziehe bekomme ich den Softreset und Feuchtigkeitsleseerror.

von Timo Dittmar (Gast)


Lesenswert?

Hallo Dieter,

also das Ergebnis der Wandlung sollte schon in dem Union drinstehen. Das 
ist leider alles ziemlich schlecht dokumentiert in der lib.

Direkt nach dem Messen kann man in temperature.i und humidity.i die 
Rohwerte als integer abgreifen. Die Temperatur Rohdaten sind linear mit 
der "menschenkompatiblen" Temperatur in °C verknüpft. Die 
(unkompensierte) relative Luftfeuchte wird über ein polynom 2 Ordnung 
aus den den Feuchtigkeitsrohwerten berechnet. Zusätzlich wird noch eine 
Temperaturkompensation des Feuchtigkeitsmesswerts vorgenommen.

Das geschieht alles in der Funktion sht_raw_to_physical(&humidity, 
&temperature).

Dabei werden die Rohdaten in humidity und temperature überschrieben. 
Nach dem Aufruf von sht_raw_to_physical kann man über temperature.f und 
humidity.f die  umgerechneten, kompensierten Messwerte als float 
abrufen.

Die wilden positiven und negativen Zahlen kommen daher das er versucht 
die float werte als int auszulesen.

Das Design dieser Funktion stammt nicht von mir sondern ist direkt aus 
den Application Notes von Sensirion entnommen. Ich hatte es damals 
verwendet da ich schnell einen funktionierenden Code haben wollte und 
ich die Idee des Ram sparens nett fand.  Vermutlich würde ich es heute 
anders machen, insbesondere die Verwendung von float ist richtig 
Ressourcen Verschwendung.
Eigentlich wollte ich an dem Umweltdatenlogger Projekt mal weiter 
machen, was vermutlich eine Version 3 der lib hervorgebracht hätte, 
allerdings habe ich jetzt erstmal einen ct-bot zum spielen :-)

Grüße Timo

von Lars (Gast)


Lesenswert?

Hallo,
Ich habe volrgendes problem ich möchte den SHT mit einem pic12F 8 bit 
ansteuern, das funktionirt auch.
Leider habe ich probleme mit dem umrechen der Messwerte in Assembler.
Kann mir da jemand weiterhelfen. Ich weis das ist das Falsche Forum 
dafür aber ich hoff es kennt sich vileicht doch jemand damit aus.
vielen dank
Lars

von Pete K. (pete77)


Lesenswert?

Hallo Timo,

könntest Du eine bug-bereinigte Version bereitstellen ?

Danke,
Pete

von Christian H. (cni) Benutzerseite


Lesenswert?

Hallo Timo,

viel Zeit ist vergangen, wann hast Du mal Zeit für die neue Version?

Danke

Gruß
Christian

von Daniel B. (dbuergin)


Lesenswert?

Hallo Christian

Verwende doch die Library, welche auch ich benutze:

Beitrag "Tempertur/Feuchte Display/Logger mit ATMega128  SHT75  SD-Karte"

SHT7x und SHT1x sind meines Wissens kompatibel, einzig in der
Genauigkeit unterscheiden sie sich.

Funktioniert bis zu einem ATMega128 mit 16Mhz ohne Probleme. Mit einem
10Kohm Pullup Widerstand auf der DATA Leitung des SHT erreiche ich bis 
zu
10m Kabellänge (CAT5).

Ablauf im Hauptprogram
1
#include "sht75.h"
2
3
int main(void)
4
{
5
  sht75_array sht75;
6
7
  uint8_t sht75_status;
8
  uint8_t sht75_error;
9
10
  // Start the Temp/Hum Sensor
11
  ShtInit();
12
13
  // Die Interrupts einschalten
14
  sei();
15
16
  my_delay_10ms(10); // 100ms warten, damit der SHT75 einschwingen kann
17
18
  // Hauptschleife
19
20
  while(1)
21
  {
22
    // Messung sollte nicht mehr als 1 x pro Sekunde geschehen,
23
    // sonst erhitzt sich der Sensor.
24
25
    // Den SHT75 reseten. Braucht ev. nicht jedes Mal gemacht werden. 
26
    
27
    ShtReset();
28
  
29
    // Die eigentliche Messung machen
30
31
    ShtReadEverything(&sht75);
32
    sht75_error = ShtReadStatus(&sht75_status);
33
34
    // Wenn kein Fehler beim messen aufgetaucht ist
35
36
    if (sht75_error == 0)
37
    {
38
       // Alles auf UART0 ausgeben
39
       sprintf(disp_buffer,"Temp: %+02.2f Feuchte: %2.2f Taupunkt: %+02.2f Status: %02x Error: %02x\n\r",
40
           sht75.Temperature,
41
           sht75.Humidity,
42
           sht75.Dewpoint,
43
           sht75_status,
44
           sht75_error);
45
46
       uart_puts(disp_buffer);
47
48
    }
49
}

Gruss

Daniel

von Roman Pollak (Gast)


Lesenswert?

Daniel,

Bist du sicher mit den 10m Kabellänge?! Nicht das ich es Dir nicht 
glaube,
ich selber hatte so meine Probleme mit dem Sensor schon mit 50cm !
Nach dem ich die Kabel gekürzt habe auf ca. 10cm funzte der Sensor 
Einwand frei.

Lg
Roman

von Daniel B. (dbuergin)


Lesenswert?

Mit den 10m bin ich sicher ;-)

Aber erst nachdem ich ein CAT5 Netzwerkkabel genommen habe, mit der 
Abschirmung auf GND und dem Pullup Wiederstand.

Mit zwei anderen "normalen" Kabelntypen ging es nicht.

Ich habe mal versuchshalber 3 Sensoren am gleichen ATMega32 Board 
betrieben.
2 x 5m und 1 x 10m. Ging gut. Habe es aber dann auf ein BasicStamp Board 
verlagert, da das noch herumlag.

Hm, vielleicht hatte ich ja nur Glück.

Daniel

von Hauke R. (lafkaschar) Benutzerseite


Lesenswert?

@ Roman Pollak (Gast):

Vielleicht den Stützkondensator am Sensor vergessen?

von Daniel B. (dbuergin)


Lesenswert?

Das könnte sein, die SHT1x Reihe braucht einen 100nF Kondensator von VDD 
auf GND so nahe wie möglich am Sensor.
Die SHT7x Reihe hat den schon drin, oder braucht ihn auf jeden Fall 
nicht.

von Roman (Gast)


Lesenswert?

Nop, der C ist praktisch an dem teil angeloetet. Ich nehme allerdings 
an, dass du den 10k widerstand auch neben dem Sensor hast ?
Sonst probiere ich es nochmals mit edm Cat5 kabel und abschirmung. Was 
sein koennte, das irgend etwas rein funzt, den gleich neben dran ist 
hochspannung fuer eine osciloskop roehre. Den warum nur zeit anzeigen 
mit der roehre, die temperatur und und und koennte man doch auch 
anzeigen :)

lg roman

von Timo D. (tdittmar)


Lesenswert?

Huch, viel Betrieb auf einmal :-)

@Christian Häussler:

Leider hatte ich im letzten Jahr nicht viel Zeit für Hobby Elektronik. 
(Experimente beenden, Arbeit schreiben, Stelle suchen, Umziehen, sich in 
Projekt einarbeiten & neue Sprache lernen) Der größte Teil meines Hobbys 
ist noch verpackt in Umzugskartons. Selbst der ct-bot führt gerade eher 
ein trauriges Dasein als Briefbeschwerer. Da ich zurzeit auch eher 
Auswertung von Daten betreibe, habe ich auch keinen Zugriff auf ein 
Labor oder wenigstens einen kleinen Elektronikarbeitsplatz :-(
Ich hoffe das mit dem nächsten Umzug alles besser wird und ich mir 
zuhause einen permanenten Schreibtisch fürs Basteln einrichten kann.

@ alle anderen

Neben fehlendem 100nF und "EMV" könnten auch Signalreflexionen eine 
Rolle spielen wenn es bei den längeren Leitungen nicht klappt. 
Vielleicht einen zusätzlichen Serienwiderstand nahe am AVR?


Grüße Timo

von Daniel B. (dbuergin)


Lesenswert?

@Roman

Nein, der 10K sitzt auf dem Postenstecker auf dem Board.

Rgds,
Daniel

von Hermann G. (df2ds)


Lesenswert?

Kabellänge bei SHT71...das Problem kenne ich. Auf der Platine ging es 
ohne Probleme. Mit ca. 3m Kabel (PS2-Verlängerung) ging gar nichts mehr, 
bis ich den Auslesetakt auf ca. 300kHz reduziert hatte. Seitdem geht es!

Es ist also wirklich wichtig, bei Kabellängen über 0,5m auch das 
"richtige" Kabel zu verwenden!

Grüße
  Hermann

von Englender (Gast)


Lesenswert?

Hallo Forum,

ich experimentiere zur Zeit auch mit einem SHT1x.

Zu aller erst vielen Dank an Timo für die tolle Lib.

Ich möchte mehrere Sensoren in Abständen von 5-10m vom Board verwenden - 
wenn ich es richtig verstehe kann ich entweder vernünftiges Kabel (z.B. 
Cat5) mit Schirmauflage verwenden oder den Bustakt reduzieren.

@Herman:
Wie hast Du mit der Lib den Auslesetakt auf ca. 300kHz eingestellt. Ich 
habe mit dem Vermehren der "asm volatile ("nop"::);"-Anweisungen 
experimentiert bis fast nichts mehr ging. Ein Oszi wäre hier wohl 
hilfreich gewesen.

Grüße Stefan

von Manfred (Gast)


Lesenswert?

Hallo,

ich habe die Diskussion erst jetzt gefunden, daher mein später Beitrag.

Wir betreiben einen ATmega128 zum Auslesen von 4 Sensoren SHTxx. Dabei 
wird eine Taktfrequenz von etwa 4kHz verwendet. Bei einem Test über 150 
Meter TP-Kabel gab es keine Probleme. Da typischerweise nicht mehr als 
90/100 Meter TP-Kabel bei einer Strukturierten Verkabelung verlegt 
werden, ist eine solche dafür gut verwendbar.

Der ATmega128 bietet die Messwerte dann noch auf dem I2C an. Ein Master 
holt sich diese dann asynchron zum Messvorgang ab.

Wenn die Kabellänge steigt, dann muss eben die Taktfrequenz runter.

Grüße
Manfred

von Erich F. (fler)


Lesenswert?

Hallo Manfred

Ich möchte auch drei SHT75 auch einen Bus betreiben.
Ich glaube ich kann eine SCL nehmen und für jeden Sensor eine eigene SDA
Welche Lib verwendest du?
Kannst du mir die zukommen lassen bitte?
mfg Erich

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Habe die Lib auch gerade mal probiert, scheint ganz gut zu laufen nach 
dem BugFix. Das einzige was stört ist die "fette" Float Lib weshalb ich 
das ganze auf Fixed Point umgestellt habe.

von Harald (Gast)


Lesenswert?

Hallo,

bedanke mich auch für die  libsht.c, hat mir zum Einstieg sehr geholfen.
Ich habe jetzt nach einigen Stunden des Probierens hinbekommen das ich 
Integer-Werte von der temperature.i und humidity.i über die Urat an den 
PC bekomme. Ich bekomme es aber nicht hin, dass ich Fload-Daten 
angezeigt bekomme. Bin kompletter Neuling im Bereich AVR-GCC, kann mir 
jemand helfen wie ich die Integer-Werte zu Fload-Werte bekomme.

Soweit ich das verstanden habe sollten die doch durch die Union 
Deklaration schon vorhanden sein. Bei mir werden da immer nur ? 
ausgegeben.

Danke
Gruß

Harald

von Harald (Gast)


Lesenswert?

Habe es hin bekommen.

Umwandlung mit "dtostrf"

Jetzt läuft's, hat jemand schon mit 3 Sensoren gearbeitet?

Grüsse
Harald

von Erich F. (fler)


Lesenswert?

Hallo

Ich arbeite mit zwei sht75 auf einer Datenleitung, funktioniert 
ausgezeichnet.
hast du die float wandlung schon hin bekommen?

von Harald (Gast)


Lesenswert?

Ja, das läuft jetzt alles soweit. Versuche mich gerade einen 2. SHT an 
einem anderen Pin einzulesen. Aber C ist nicht so meine Stärke.

Grüsse
Harald

von Harald (Gast)


Lesenswert?

@ Erich Floh,

könntest du mir einen Source zur verfügung stellen?

Ich komme so nicht weiter!

Danke
Grüsse
Harald

von (prx) A. K. (prx)


Lesenswert?

Vielleicht nützt das was: Beitrag "Sensirion SHT11 Code"

Mehrere Sensoren geht dort, indem man aus der Konstanten SHT11_SCL eine 
Variable macht, in der die für den jeweiligen Sensor nötige Bitmaske für 
die Taktleitung steht.

von Harald (Gast)


Lesenswert?

Danke für den Hinweis,

wie muss die Main dazu aussehen?

Ich weis nicht was ich ansprechen soll? Wie weiter oben geschrieben 
kenne ich mich in C nicht gut aus.

Grüsse
Harald

von Stefan W. (swesch)


Lesenswert?

Hallo Timo!

In deiner LIB steht:
1
/*
2
(c) Timo Dittmar
3
(For now. If I get enough feedback and a positive answer from
4
Sensirion I plan to release the code under GPL)
5
*/

Wie ist denn da der aktuelle Stand?

Hintergrund: Der Code könnte wenn er unter GPLv3 lizenziert ist in das 
ethersex-Projekt integriert werden.

THX

von gast (Gast)


Lesenswert?

Genau das würde mich auch mal interessieren...
Darf man deine Lib einfach in einer Diplomarbeit verwenden, wenn man 
diese als bestehende Lib von Timo Dittmar kennzeichnet?

von Timo D. (tdittmar)


Lesenswert?

Tach gast,


von mir aus gerne.

Ich habe ja nicht viel gemacht außer einen die Beispiele von Sensirin an 
den AVR anzupassen.

Ich hatte ursprünglich vor den Code unter die GPL zu stellen und hatte 
diesbezüglich bei auch bei Sensirion angefragt. Da von dort aber niemals 
eine Reaktion kam, und ich keine Zeit mehr hatte mich um den Code zu 
kümmern ist das alles ein bisschen eingeschlafen. Vermutlich wäre die 
sauberste Lösung den Code nur mithilfe des Datenblatts neu anzufangen. 
Dann kann man auch die float Sachen rausnehmen, und die etwas 
unglückliche Datenübergabe in union bereinigen. Wenn ich all die Emails 
zusammennehmen würde die ich schon wegen dieser union Geschichte 
beantwortet habe ... :-)

Als Zwischenlösungen habe ich habe das ganze jetzt mal als Version 0.3 
angehängt, in der ich das meine Änderungen als Public Domain ausweise 
und den kleinen Bug mit der fehlenden Initialisierung des DDR Registers 
für den SCK Pin ausgemerzt habe.

Ich habe hier im Forum aber auch andere schöne Treiber für die SHTs 
gesehen :-)

Grüße Timo

von Timo D. (tdittmar)


Angehängte Dateien:

Lesenswert?

jetzt auch mit Anhang :-)

von Florian (Gast)


Lesenswert?

Hallo Stefan,

ich bin grade dabei mir ein kleines Netzwerk von Sensoren und SHT 
Luftfeuchtigkeitssensoren aufzustellen.

Hast du es schon geschafft,
den Quellcode im das Ethersex-Projekt zu integrieren?

von Gerd (Gast)


Lesenswert?

Hallo,

ich hab eine Ansteuerung für die SHT-Sensoren in Ethersex integriert. 
Details sind hier zu finden:

http://www.ethersex.de/index.php/SHT

Den Code selbst (unter GPL3+) gibt es hier:

http://github.com/ethersex/ethersex/tree/master/hardware/sht/

Ich habe nicht die Lib von Timo verwendet, sondern was eigenes 
entwickelt. Features:
- Abfragefrequenz einstellbar (gut für lange Leitungen)
- Nur Festkommaberechnungen
- Berechnung der Temperaturkompensation

Viel Spaß damit!

Gerd

von frto (Gast)


Lesenswert?

Hallo, ich habe einen Problem mit der Lib fur SHTxx.
das ist in main geschrieben:
1
unsigned char sht_checksum, sht_error =0;
2
sht_value humidity;
3
sht_value temperature;
4
unsigned char *temp = "";
5
unsigned char do_cycle=0;
6
do
7
{
8
  do_cycle++;
9
  if (do_cycle>1) 
10
    delay_ms(50);
11
  sht_error = sht_softreset();
12
  
13
  if (sht_error) 
14
    lcd_puts("SHT11 Error (SoftReset)\n");
15
  
16
  sht_error = sht_measure(&humidity, &sht_checksum, HUMI);
17
  if (sht_error) 
18
    lcd_puts("SHT11 Error (HUMI)\n");
19
20
  sht_error = sht_measure(&temperature, &sht_checksum, TEMP);
21
  if (sht_error) 
22
    lcd_puts("SHT11 Error (TEMP)\n");
23
  
24
  sht_raw_to_physical(&humidity, &temperature);
25
  if (do_cycle>=5) 
26
    break;
27
}
28
while ( (humidity.f<100/*1*/) || (humidity.f>9900/*99*/) || (temperature.f < -3900/*-39*/) || (temperature.f>10000/*100*/) );
aber auf dem display ist die temperatur und humidity immer -40 und -400 
weil alles was ich von dem chip bekomme ist 0. Das program lauft auf 
ATmega16 @ 16MHz, Data PC3(mit pullup 10k), SCK PC2 und so hab ich die 
lib geendart:
1
#define F_CPU 16000000
2
...
3
/* SHT SCK and DATA Port and Pin definitions */
4
#define SHT_DATA_PORT PORTC 
5
#define SHT_SCK_PORT PORTC
6
#define SHT_DATA_DDR DDRC
7
#define SHT_SCK_DDR DDRC
8
#define SHT_DATA_PORT_PIN PINC //  ! the PINx register of the DATA Port ! 
9
#define SHT_DATA_PIN PC3
10
#define SHT_SCK_PIN PC2
die CRC kontrolle passt nie

von Erich F. (fler)


Lesenswert?

Hallo
Ich weis nicht welche Lib du verwendest, Code hast du auch nicht den 
gesamten geschrieben. Sollte dies dein gesamter Code sein ist die null 
klar.
Beispiel:


main:

sht_connectionreset(SHT_SENS_SONNE); Define des Dataports
while(1)
{
//sekundenschleife beginnt hier
if(time_merk+2<=time)
{

  //____________Sensor in der Sonne___________
sht_error = 0;
sht_error=sht_softreset(SHT_SENS_SONNE);
if(sht_error !=0)
{
sht_softreset(SHT_SENS_SONNE);
tempstr_sonne[0] =' ';tempstr_sonne[1] = 'E';tempstr_sonne[2]= 
'R';tempstr_sonne[3]= 'R';tempstr_sonne[4] =' ';tempstr_sonne[5] ='\0';
}
else
{
sht_error=sht_measure(&humidity, &sht_checksum, HUMI, SHT_SENS_SONNE);
sht_error=sht_measure(&temperature, &sht_checksum, TEMP, 
SHT_SENS_SONNE);
}
if(sht_error !=0)
{
sht_softreset(SHT_SENS_SONNE);
tempstr_sonne[0] =' ';tempstr_sonne[1] = 'E';tempstr_sonne[2]= 
'R';tempstr_sonne[3]= 'R';tempstr_sonne[4] =' ';tempstr_sonne[5] ='\0';
}
else
{
sht_raw_to_physical(&humidity, &temperature);
temperature_sonne = temperature.p;
dtostrf(temperature_sonne,5,2,tempstr_sonne);

}

}

mfg

von Christoph (Gast)


Lesenswert?

Hallo,
ich habe mich heute auch mal mit dem Sensor beschäftigt hat jemand den 
jetzt nen Funktionierenden einfachen C-Code?
Und wie ist die Hardware aufgebaut? die Chips laufen bei 3,3V aber mein 
µC auf 5V macht das ein Problem?
Für hilfe wäre ich sehr dankbar!!

MFG Christoph

von (prx) A. K. (prx)


Lesenswert?

Warum betreibst du den SHT11 mit 3,3V wenn der µC mit 5V läuft? Der 
SHT11 kann auch 5V.

von Christoph (Gast)


Lesenswert?

Hallo,
weil als Typ im Datenblatt 3.3 steht und als max 5.5 deswegen dachte ich 
das 3,3V am besten wären oder macht das kein unterschied?

von (prx) A. K. (prx)


Lesenswert?

Macht keinen Unterschied. Ausser einem etwas anderen Korrekturwert in 
der Auswertung.

von Christoph (Gast)


Lesenswert?

Das ist doch schon mal super wie funktioniert der 2 Drahtbus?
mit dem man ihn ansteuert?
Hast du zufällig eine Software oder sowas als Beispiel?

von (prx) A. K. (prx)


Lesenswert?


von Christoph (Gast)


Lesenswert?

Das sieht gut aus, muss ich mal schauen wie das dann alles zusammen im 
Projekt mit auslesen und auswerten geht, kann ich die Ports frei wählen 
oder muss ich feste Ports nehmen?
Oder wie wird das angeschlossen?
Sorry für die vielen Fragen...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.