Es gibt hier zwar schon Code dafür, aber für meinen Geschmack ist der recht eigentümlich programmiert. Hier geht es ausserdem ohne Fliesskommarechnung ab.
Cool, danke! Ich versuche mich grad mit verschiedenen Codes an zu freunden, da kann etwas Inspiration nicht schaden. Aber weil ich fast schon den Überblick verloren habe bei 546 Pointern und dauernd irgendwelche "errors" war ich fast schon so weit einen eigenen Code zu schreiben... *seuz'
Gast
#1401421
Mist! Wieder nur in C. Hat denn keiner mal was in Assembler?
Kurzanleitung: Die Leitung SDA benötigt einen externen Pullup-Widerstand. In config.h müssen die Zeilen SHT11_xxx an die verwendeten Portpins angepasst werden. SHT11_LOWRES bestimmt den Messmodus, genau (0) oder schnell (1). In der allgemeinen Initialisierung, also ungefähr am Anfang von main() die Funktion sht11_init() aufrufen. Grundsätzlicher Ablauf einer Messung, gibt Feuchte in hundertstel Prozent, oder Fehlercode -32xxx, siehe dazu sht11.h:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
Es ist sicher nicht verkehrt, dies so zu erweitern, dass man ggf. irgendwann mit Timeout rausfliegt, wenn sich ewig nichts rührt.
Cut-and-paste Fehler.
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
Danke, werde es weier probieren. Grüsse Harald
Klappt einwandfrei, danke. /Hannes
Gast
#1538569
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 den Code von A.K. verwendet, sondern was eigenes entwickelt. Features: - Abfragefrequenz einstellbar (gut für lange Leitungen) - Nur Festkommaberechnungen - Berechnung der Temperaturkompensation Viel Spaß damit! Gerd
Gast
#1691607
Hi, ich nutze diese Lib, habe nur das Problem wenn ich im File config auf die höhere Auflösung umschalte stimmt das Ergebnis in der Temperatur, ansonsten habe ich statt 25Grad nur 17Grad auf dem Display (wir haben hier gerad rund 25Grad). Auf die Luftfeuchte hat es scheinbar keinen feststellbaren Einfluss. Bitte um Rücknmeldung. Gruß, Thorsten
Hallo, so, nun ist der Code um die Temperaturkompensierung erweitert und getestet. Um die Einzelmessungen aus obigem Code ist eine Statemashine gestrickt, die die gesamte Messung steuert. Zum ablauf 1)Es wird eine Messung angestoßen 2)Es wird Temperatur und Feuchte gemessen. 3)Es wird abgefragt ob messung feritg ist 4)Es können die Werte entnommen und weiterverwertet werden. //generell 1)es werden keine Interrupts benutzt und keine spezielle Prozessorhardware 2)Portpins können im config Header frei gewählt werden. 3)Momentan kann man den code nur für einen Sensor nutzen 4)Messung mit High und Low resolution möglich 5)Alles ohne floatrechung, sehr speichersparend //Berechnungen Es wurde alle Anaben aus dem Datenblatt verwertet 1)Tempberechnung (Berücksichtigung der Spannung möglich) 2)Feuchteberechnung (Berücksichtigung der Temp abhängigkeit gegeben) Die Berechnungen wurden in beiden Bereichen mit einem Exel Test verglichen, auch im Zip enthalten. Der Fehler beträgt +/-0.01 im schlechtesten Fall. Gruß, Thosrten
Gast
#1896528
Danke für den Code! Hier ein Test:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
http://de.wikipedia.org/wiki/Gradzeichen
Gast
#1965832
Hallo, ich verwende den Code von Thorsten S. Meine Kabellänge zwischen Atmel und einem SHT11 Sensor beträgt ungefähr 10 cm. In dieser Beschaltung lässt sich der Sensor wunderbar verwenden und auslesen. Da ich ihn gern als Außensensor verwenden möchte, habe ich versucht mittels hochwertigen CAT.6 Netzwerkkabel das ganze auf 5 Meter auszuweiten, aber leider bekomme ich keine Daten ausgelesen. Jetzt habe ich vermehrt gelesen, das man die Taktrate runtersetzen sollte, und genau da besteht auch schon meine Frage, welche Teile im Code müßte ich dafür ändern ?! Gruß
Die Initialisierungssequenz vom IIC-Bus.
Gast
#2210109
Hallo, leider komme ich gerade nicht weiter, habe die sht_11_whitejackV3 und die Testabfrage von Infoboter ausprobiert, doch leider kommt als Ergebniss nur <00> zurück. Wie sehe ich, ob der I²C Bus überhaupt funktioniert? Habe einen SHT15 und einen Atmega 328p.
Andy schrieb: > Wie sehe ich, ob der I²C Bus überhaupt funktioniert? Es ist kein I2C-Bus. Nur ähnlich.
Servus, in dieser Lib sind folgende Zeile zu sehen:
1 | |
2 | |
Damit wird die Leitung entweder als Input oder Output konfiguriert. Hat das aber mit dem Pegel zu tun? Gruss Owen
Owen Senmeis schrieb: > Damit wird die Leitung entweder als Input oder Output konfiguriert. Hat > das aber mit dem Pegel zu tun? Die bidirektionale SDA-Leitung arbeitet so als Open-Drain. Als Ausgang mit Wert 0 konfiguriert zieht der Controller aktiv runter. Als Eingang konfiguriert zieht der externe Widerstand hoch.
Meinst Du diese Zeile:
1 | |
Damit wird die SDA Leitung nach Low gezogen wenn diese als Output konfiguriert. Falscher Kommentar? Gruss Owen
Der Kommentar bezieht sich auf diese 3 Zeilen zusammen:
1 | |
2 | |
3 | |
Für das "high" in "input/high" sorgt der externe Pullup. Und nein, diesen Teil meinte ich oben nicht, der ist nur die Voraussetzung dafür. Der Zustand der Datenleitung wird im Kommunikationsprotokoll absichtlich über das Richtungsregister gesteuert, nicht über das unverändert auf 0 bleibende Bit im Datenregister.
hallo, ich habe den Code von A K erfolgreich an einem Atmega mit SHT11 zum laufen gebracht. in einem andren thread fragte dubhorn nach der möglichkeit mehrere SHT einzubinden. Timo DIttmar schrieb: > 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 hat das hier schon jemand gelöst und für mehrere SHT umgeschrieben? ich komm irgendwie nich drauf... gruß lufthackn
Na wenns denn sein muss... Anbei die Originalversion für 2 SHTs, SCL gemeinsam, SDA getrennt aber am gleichen Port. Ist etwas älter als die oben, ohne Lowres-Support. Und ohne Thorstens Kompensation. Macht aus der Konstanten SHT_SDA eine Variable, in der die Bitmaske der zu verwendeten Portleitung vom SDA Signal drinsteht. Das ist alles.
Gast
#2651008
> Hier geht es ausserdem ohne Fliesskommarechnung ab. Natürlich nicht, const int32_t C2 = (int32_t)(0.648 100 (1L<<24)); ist eine satte Fliesskommaberechnung. > hat das hier schon jemand gelöst und für mehrere SHT umgeschrieben? Schon, bloss für einen anderen Prozessor:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
28 | |
29 | |
30 | |
31 | |
32 | |
33 | |
34 | |
35 | |
36 | |
37 | |
38 | |
39 | |
40 | |
41 | |
42 | |
43 | |
44 | |
45 | |
46 | |
47 | |
48 | |
49 | |
50 | |
51 | |
52 | |
53 | |
54 | |
55 | |
56 | |
57 | |
58 | |
59 | |
60 | |
61 | |
62 | |
63 | |
64 | |
65 | |
66 | |
67 | |
68 | |
69 | |
70 | |
71 | |
72 | |
73 | |
74 | |
75 | |
76 | |
77 | |
78 | |
79 | |
80 | |
81 | |
82 | |
83 | |
84 | |
85 | |
86 | |
87 | |
88 | |
89 | |
90 | |
91 | |
92 | |
93 | |
94 | |
95 | |
96 | |
97 | |
98 | |
99 | |
100 | |
101 | |
102 | |
103 | |
104 | |
105 | |
106 | |
107 | |
108 | |
109 | |
110 | |
111 | |
112 | |
113 | |
114 | |
115 | |
116 | |
117 | |
118 | |
119 | |
120 | |
121 | |
122 | |
123 | |
124 | |
125 | |
126 | |
127 | |
128 | |
129 | |
130 | |
131 | |
132 | |
133 | |
134 | |
135 | |
136 | |
137 | |
138 | |
139 | |
140 | |
141 | |
142 | |
143 | |
144 | |
145 | |
146 | |
147 | |
148 | |
149 | |
150 | |
151 | |
152 | |
153 | |
154 | |
155 | |
156 | |
157 | |
158 | |
159 | |
160 | |
161 | |
162 | |
163 | |
164 | |
165 | |
166 | |
167 | |
168 | |
169 | |
170 | |
171 | |
172 | |
173 | |
174 | |
175 | |
MaWin schrieb: > const int32_t C2 = (int32_t)(0.648 100 (1L<<24)); > ist eine satte Fliesskommaberechnung. Ach herrje. Ja, das ist formal gesehen eine Fliesskommarechnung. Die aber bereits der Compiler durchführt und durch eine ganzzahlige Konstante ersetzt. Ich hätte das auch den Taschenrechner machen lassen und als magische Konstante reinschreiben können. Also für Haarspalter: "Hier geht es ausserdem zur Laufzeit ohne Fliesskommarechnung ab."
es läuft, abweichung zwischen 2 SHT11 Sensoren; 0,3°C und 0,5% rLf Da will ich jetzt auch keine Haare spalten wa? LOL trotz sehr schlechter lagerung über monate hinweg sind die dinger noch ziemlich genau. ich freu mich! gruß Lufthackn
Gast
#2899338
Gibt es irgendwo einen simplen Beispielcode für den Arduino mit zwei Sensoren und der entsprechenden Bibliothek? Ich bekomme das irgendwie nicht hin;( Freundliche Grüße Ralf
Ralf schrieb: > Gibt es irgendwo einen simplen Beispielcode für den Arduino mit zwei > Sensoren und der entsprechenden Bibliothek? > Ich bekomme das irgendwie nicht hin;( Du kannst am I2C-Bus zwar verschiedene Sensoren gleichzeitig betreiben, aber nur "verschiedene" Sensoren, die alle eine unterschiedliche 7-Bit Gerätenummer haben müssen. Ich kenne keine Möglichkeit, zwei gleiche I2C-Sensoren gleichzeitig an einem Arduino zu betreiben, es sei denn, Du schaltest immer den gerade nicht benötigten Sensor "mit der doppelten Gerätenummer" jeweils vom Bus ab. 1-Wire Sensoren können dagegen über eine pro Sensor eindeutige 64-Bit Nummer addressiert werden, davon kannst Du viele gleichzeitig an einen Arduino dranhängen und sie trotzdem einzeln adressieren und abfragen: http://www.arduino.cc/playground/Learning/OneWire
Gast
#2950940
Also bei mir ist die Temp viel zu hoch, die Feuchte viel zu niedrig -> irgendwelche Ideen (SHT11 funktioniert prinzipiell, wenn ich auf den Sensor hauche, springt die Feuchte nach oben, die Temperatur steigt ein wenig). Ob HIRES oder LOWRES ist egal.... Der SHT wird jede Sekunde abgefragt (also geschaut, ob fertig, Werte geholt und dann die Messung neu gestartet). Erwärmt der sich selbst beim Messen? Sollte ich nur alle 10 Min abfragen? Hat jemand eine Idee? Viele Grüße, egberto
egberto schrieb: > Erwärmt der sich selbst beim Messen? Im Prinzip ja, aber 1/s ist gemäss Datasheet kein Problem.
Gast
#2950962
nächste Idee - eventuell wird die eingebaute Heizung ja irgendwie (irrtümlich) eingeschaltet? Vom Verhalten her würde das ja passen ???
Tja, das musst du schon selber rausfinden.
Gast
#2950990
also ich schreibe das nicht in das Config-Register....gibt es da im Code eine Option für ? Ich habe so auf die Schnelle erst mal nix gefunden... Viele Grüße, egberto
Gast
#2959817
Es scheint an den Sensoren zu liegen....die lagen ein paar Jahre hier rum.... Wenn ich die ein paar Stunden mit Heizung betreibe, nähern sich die gemessenen Werte der Realität an - für ein Raumthermometer ok. Frohes Fest, Egberto
Im Datasheet steht was zu Rekonditionierung drin.
Gast
#2961269
Die Klimakammer dafür hatte ich grad nicht zur Hand ;-) Ich wollte eigentlich auch nur zum Ausdruck bringen, das der Code einwandfrei ist und das Problem eher bei den Sensoren zu suchen ist. Frohes Fest, Egberto
Ron schrieb: > Mist! Wieder nur in C. Hat denn keiner mal was in Assembler? Hab das Ganze jetzt mal in Assembler umgesetzt. Ausgabe der Temperatur und relativen Feuchte über UART und LCD. Port-Pins sind alle einzeln frei wählbar, auch für das LCD (4-bit). D4-D7 müssen also nicht auf einem Port zusammenhängen. Die Sensibus-CLK-Frequenz kann in Grenzen eingestellt werden. F_SBUS max ist F_CPU/32. Es wird bei überschreiten der Grenzen eine ERROR-Meldung erzeugt. Pinbelegung: SDA,SCL,F_SBUS,SHT_RESOLUTION sowie SHT_VOLTAGE in der senserion.inc RW,RS,E und D4..D7 in der lcd_routines_4bit.inc Die Daten stehen dann im SRAM zur freien Verfühgung als ASCII mit Einheit bereit. Das alles passt in einen ATtiny2313, der mit ca. 87% gefüllt wird. Gruß Steffen
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.