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'
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
int16_t
2
feuchte_messen(void)
3
{
4
sht11_start_humid(void);
5
while(!sht11_ready())
6
;
7
returnsht11_result_humid();
8
}
Es ist sicher nicht verkehrt, dies so zu erweitern, dass man ggf.
irgendwann mit Timeout rausfliegt, wenn sich ewig nichts rührt.
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
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
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ß
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.
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.
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.
> 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:
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
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
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
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
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
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