I2C Temperatur- und Feuchtigkeitssensor HDC1008

Begonnen von schlawiano, 20 Mai 2016, 12:15:16

Vorheriges Thema - Nächstes Thema

schlawiano

Hallo Maus36,

hast Du die neuste Version ?  https://sourceforge.net/p/fhem/code/HEAD/tree/trunk/fhem/FHEM/

Bei mir kann ich hexadezimal z.B. 0x42 oder eben auch 66 definieren.
Im Internal "I2C_Address" sollte dann auch die 66 ob so oder so zu sehen sein.

Ich habe gerade ins Datenblatt des HDC1000 geschaut (http://www.ti.com/lit/ds/symlink/hdc1000.pdf)
die Berechnung ist identisch. Die gleiche Formel nutze ich im Modul.

Allerdings gibt der Hersteller nur eine Genauigkeit von 4% bei der Luftfeuchtigkeit an. Das ist nicht so doll.
Ich habe noch BME280 von Bosch gekauft, komme aber sicher erst nach dem Urlaub dazu, den zu als Referenz zu
testen. Heute Abend werde ich mal so einen Homematic-Funk-Sensor dazu stellen und gegenprüfen.

Im Sensor gibt es übrigens auch einen Heater der mögliches Kondenswasser entfernen soll. Vll. den mal für ein paar Minuten
einschalten.. achja. die Temperaturanzeige ist in der Zeit natürlich nicht mehr verlässlich  ::)

Viele Grüße
Karsten

schlawiano

Hallo nochmal...


Der Sensor zeigt tatsächlich viel höhere Werte bei der Luftfeuchtiigkeit .

Homematic Thermostat   
T: 22.1 H: 67

HDC 1008
T: 21.77 H: 91.06

https://github.com/adafruit/Adafruit_HDC1000_Library/blob/master/Adafruit_HDC1000.cpp#L69
https://e2e.ti.com/support/sensor/humidity/f/985/t/478340
https://forums.adafruit.com/viewtopic.php?f=22&t=80261

Wie es aussieht gibt es eine ältere Charge an Sensoren, wo das nicht so passt. Ein Entwickler sprach
von einer Anpassung des Offsets (welches auch immer) um 15%. Die Differenz beträgt beim Endergebnis hier aber
schon 25%.

Ausdrücklich wird noch mal darauf hingewiesen, dass man den Sensor langfristig dehydrieren muss.
Sprich 24 Stunden an einen Ort mit 85% rel. Luftfeuchtigkeit und dann 10Tage an einem Ort mit 60% rel. Luftfeuchtigkeit .
Andere Nutzer berichten, dass es auch nichts gebracht hat. Ein anderer hat sich gar mit dem Fön versucht.

Ich habe gerade geschaut, es gibt wohl für Arduino eine Lib
https://github.com/Seeed-Studio/HDC1000/blob/master/HDC1000.cpp

Ich habe die Lib mal ein ein perl-Skript portiert, damit komme ich auf eine Luftfeuchtigkeit von 99%...
Es wird immer verrückter...

Ich bleibe dran






schlawiano

Noch mal hier ein Vergleich.

Ich habe ein Python - Skript gefunden.

http://www.netzmafia.de/skripten/hardware/RasPi/Projekt-HCD1008/HDC1008_2.py

Mein Modul scheint wohl richtig zu rechnen. Ich habe noch weitere Sensoren HDC1008 von anderen
Anbietern bestellt. Vll. ist eine Charge kaputt.


Nach der Grafik scheint die Abweichung linear zu sein.
https://forums.adafruit.com/viewtopic.php?f=22&t=80261


GGf. würde es helfen, wenn ich Kalibrationsfaktor bzw. Offset einbaue.

Man müsste natürlich dann selbst die Werte anpassen.
Zumindest könnte man so den Sensor trotzdem verwenden.



Maus36

Danke für die Links
Scheinbar haben die Sensoren ein Problem.
Ich kann mit meinen beiden Sensoren aber leben, da ich für mein Lüftung nur Relativvergleiche der Taupunkte innen und aussen benötige.
Eine Kalibrierfunktion in dem Modul wäre aber schön.

schlawiano

Hallo Maus36,

ich bin gerade noch mal das Datenblatt durchgegangen.
Eigentlich kann man nicht so viel falsch machen.

Ohne Bit 12

1) Konfiguration auf das Register 0x02 schreiben.
2) kurz warten
3) Pointer via Schreibzugriff auf 0x00 setzen
4) ja nach Auflösung bis 6.35 ms warten
5) 2 Byte als Temperatur lesen
6) Pointer via Schreibzugriff auf 0x01 setzen
7) ja nach Auflösung bis 6.50 ms warten
8) 2 Byte als Feuchtigkeit lesen

Mit Bit 12

Mir ist bis jetzt auch noch kein Fehler aufgefallen.
1) Konfiguration auf das Register 0x02 schreiben.
2) kurz warten
3) Pointer via Schreibzugriff auf 0x00 setzen
4) ja nach Auflösung bis 6.35 ms warten
5) erst Temp, dann Hum in einer Transaktion auslesen

Im Testscript klappt das auch soweit. Ich hänge es mal an.
Ich werde noch Kalibrationsparameter einbauen.
Ich weiß nicht, wie ich es schaffe. Ab Montag bin
ich erst mal 10 Tage im Ausland

Viele Grüße
Karsten



Maus36

Hallo schlawiano

ich habe verschieden Python-skripte, C-Programme und dein Modul getestet. Alle mit den gleichen abweichenden Werten für die Feuchtigkeit. Das Probleme liegt wohl in den Sensoren. Ich lasse jetzt ein paar Tage einen Referenzsensor mitlaufen, um zu sehen, wie man kalibrieren könnte.

Maus36

Hallo,

mein Fazit zu den Sensoren:
Die Auflösung und die Dynamik ist sehr gut. Ebenso ist die Genauigkeit der Temperaturmessung gut.

Die Genauigkeit der Feuchtemessung ist aber schlecht. Ich messe bei meinen beiden HDC1000-Sensoren (auf einem Breakout-Board) einen ca. 15-20 Prozentpunkte zu großen Feuchtewert gegenüber 3 Referenzsensoren (Die Abweichung der 3 Referenzsensoren untereinander beträgt bis zu 4 Prozentpunkte). Der Offsetfehler ist also erheblich. Zudem scheint auch die Verstärkung der Sensoren nicht gleich zu sein.  Im Bild, unteres Diagramm: Bei hoher Feuchte ist der Wert von HDC1 am größten, bei niedriger Feuchte der Wert von HDC2. Die Linien HKL... sind meine Refrenzsensoren.
Im oberen Diagramm sind die Temperaturwerte und die berechneten Taupunkttemperaturen dargestellt (Die beiden HDC1000 Sensoren in rot und blau).

Zum Kalibrieren der Sensoren müsste man also über einen weiten Bereich die Feuchte variieren und eine Kurve herausfahren. Ich vermute auch einen Temperatureinfluss, der die Kalibrierung nochmal aufwendiger macht.

Vorschlag für eine grobe Kaibrierung: rel. Feuchte Ist [%]  = Messwert [%] - x;  x = 15%
Da die Sensoren nur maximal 100% ausgeben, können hohe Feuchtigkeitswerte nicht mehr unterschieden werden.

Für genauere Feuchtemessungen erscheinen die Sensoren nicht geeignet. Ob es jetzt der Sensor selbst oder der ungeeingete Prozess der Breakout-Bord-Fertigung ist, kann ich nicht sagen.


schlawiano

Ich habe mir die Kurven, insbesondere die Untere,
angeschaut. Das macht mich alles andere als glücklich.
Die Signalwerte und Referenzwerte weichen nicht linear
voneinander ab. Eine geeignete (oder mehrere)
Kalibrierungfunktionen zu ermitteln dürfte nicht einfach
werden.
Das schreit regelrecht nach einem eigenständigen Modul, dass man an beliebige Eingangswerte hängen kann.
Das Problem werden auch andere haben, wenn auch nicht in der Abweichung. Vll. hat ein Mathe-Guru Interesse hier mitzuwirken. Ziel (sofern es noch keins gibt)
Modul zur Kalibrierung anhand Paare (Signal->Referenzwert).

Maus36

#23
Einen Ansatz zum Kalibrieren ist hier http://www.s-elabor.de/k00002.html zu finden.
Meiner Meinung ist das aber zu Aufwendig. Zudem wird nicht gelöst, dass bei hohen Feuchtewerten keine Messung mehr möglich ist.
Das Betauuen der Sensoren liefert max. 100%.
Ich werde die Sensoren wohl als Fehlkauf abschreiben und mir neue kaufen:
Meine beiden DHT22 funktionieren wesentlich besser (kein I2C!)
Interessant finde ich auch den BME280, den ich aber noch nicht kenne.

schlawiano

Ich habe die Sensoren nun fast 3 Wochen laufen. Bis jetzt haben sich die Werte kaum gebessert.

Leider brauche ich mindestens 3 Sensoren für meine Kellerentlüftung via Taupunkt.
Der BME280 unterstützt nur 2 I2C-Adressen. Einen habe ich bereits da liegen - der wartet schon aufs Testen ;-)

Von den HDC 1008 habe ich leider 6 Stk für 2 I2C-Busse gekauft. Ist ein bisschen schade ums Geld.

Vll. halte ich doch noch mal den Fön dran, bevor sie in den Müll landen :-)

Maus36

#25
Für meine Kellerlüftung benötige ich nur den Unterschied zwischen innen und außen, die absolute Genauigkeit ist nicht so entscheidend.

Ich würde an deiner Stelle mal schauen, welche Sensoren sich habwegs gleich verhalten und mit diesen die Taupunktdifferenz zwischen innen und außen ermitteln. Wenn die Differenz eine Schwelle überschreitet --> Lüftung ein. Wenn eine 2te Schwelle unterschritten wird --> Lüftung aus.
Zur Zeit benutze ich neben den beiden DHT Sensoren noch zwei Funksensoren zur Steuerung. Deren Genauigkeit ist auch nicht so doll, meine Schwellwerte sind mit 3° und 2,5° relativ grob.

Viel entscheidender für die Funktion ist die Anordnung der Sensoren und die Logik.
Wenn die Lüftung läuft, sind Sensoren im Zuluft- bzw. Abluftstrom günstig. In diesem Fall sollte der Taupunkt im Keller ja langsam sinken, dh. der Taupunkt des Abluftstroms müsste kleiner werden.
Wenn die Lüfung nicht läuft, wären Sensoren im Kelleraum und aussen besser. Je nach Lage (innen: hoch oder tief im Raum, aussen: Wetterseite, Sonne, Schatten, bodennähe,...) kommt noch einiges an Ungenauigkeit hinzu.

Den BME280 könntest du z.B. im Keller dazuhängen, er belegt andere I2C-Adressen.

osid-timo

Hallo,
vor kurzem habe ich dieses Modul gefunden und versucht es mit einem HDC1080 zu nutzen

welche Anpassungen sind nötig um einen HDC1080 mit dem Modul zu nutzen?
die ersten unbedarften Versuche sind schon mal gescheitert.

Gruß Oswald
FHEM Pi3: 1* CUL, 30* Homematic, 10* EnOcean
FHEM Pi3: IR-Lesekopf, BT->SMA
FHEM Pi3: ZHK, 1-wire, 1* VBus   Resol DeltaSol BS

schlawiano

Hallo Oswald,
ich habe gerade (allerdings nur im Schnelldurchgang) die Datenblätter beider Sensoren verglichen,
die Konfigurationsregister sind identisch, das Schreiben , Lesen vom Hum.,/Temp-Register auf dem
ersten Blick auch.

Ich hänge mal den aktuellsten inoffiziellen Stand an. Der kann mehr loggen.
Bitte das Modul in den FHEM - Ordner schieben
In der Fhem-Oberfläche bitte Befehl "reload 52_I2C_HDC1008" eingeben.

Dann bitte das Attribut Verbose für den Sensor dann mal auf 5 setzen
und mir das log mal zukommen lassen.

Danke Gruß
Karsten 

osid-timo

Hallo Karsten,
danke für die schnelle Info
hier mein Log
2016.12.12 12:42:40 5: im init client fuer HDC1080
2016.12.12 12:42:41 5: [HDC1080] I2C_HDC1008_Attr call InternalTimer with new value  5
2016.12.12 12:42:41 5: [HDC1080] I2C_HDC1008_UpdateValues starts with state: READY
2016.12.12 12:42:41 5: II2CMaster: vom client empfangen|direction: i2cwrite|reg: 2|data: 0 0|i2caddress: 64
2016.12.12 12:42:41 5: II2CMaster: HWaccess I2CAddr: 0x40
2016.12.12 12:42:41 5: II2CMaster: vom client empfangen|direction: i2cwrite|reg: 2|data: 0 0|i2caddress: 64
2016.12.12 12:42:41 3: II2CMaster: HWaccess blockweise nach 0x40 schreiben, Reg: 0x02 Inh: 0 0, laenge: 3| -> syswrite failure: Input/output error
2016.12.12 12:42:41 5: II2CMaster ->Client gefunden: HDC1080, I2Caddress: 64 Data: 0 0
2016.12.12 12:42:41 5: [HDC1080] I2C_HDC1008_Walker call InternalTimer with 0.025 seconds
2016.12.12 12:42:41 5: [HDC1080] I2C_HDC1008_UpdateValues starts with state: READY
2016.12.12 12:42:41 5: II2CMaster: vom client empfangen|direction: i2cwrite|reg: 2|data: 0 0|i2caddress: 64
2016.12.12 12:42:41 5: II2CMaster: HWaccess I2CAddr: 0x40
2016.12.12 12:42:41 5: II2CMaster: vom client empfangen|direction: i2cwrite|reg: 2|data: 0 0|i2caddress: 64
2016.12.12 12:42:41 3: II2CMaster: HWaccess blockweise nach 0x40 schreiben, Reg: 0x02 Inh: 0 0, laenge: 3| -> syswrite failure: Input/output error
2016.12.12 12:42:41 5: II2CMaster ->Client gefunden: HDC1080, I2Caddress: 64 Data: 0 0
2016.12.12 12:42:41 5: [HDC1080] I2C_HDC1008_Walker call InternalTimer with 0.025 seconds
2016.12.12 12:42:41 5: [HDC1080] I2C_HDC1008_UpdateValues starts with state: CONFIGURING
2016.12.12 12:42:41 5: II2CMaster: vom client empfangen|direction: i2cwrite|data: 0|i2caddress: 64
2016.12.12 12:42:41 5: II2CMaster: HWaccess I2CAddr: 0x40
2016.12.12 12:42:41 5: II2CMaster: vom client empfangen|direction: i2cwrite|data: 0|i2caddress: 64
2016.12.12 12:42:41 3: II2CMaster: HWaccess blockweise nach 0x40 schreiben,  Inh: 0, laenge: 1| -> syswrite failure: Input/output error
2016.12.12 12:42:41 5: II2CMaster ->Client gefunden: HDC1080, I2Caddress: 64
2016.12.12 12:42:41 5: [HDC1080] I2C_HDC1008_Walker call InternalTimer with 0.00636 seconds
2016.12.12 12:42:41 5: [HDC1080] I2C_HDC1008_UpdateValues starts with state: MEASURING_TEMPERATURE
2016.12.12 12:42:41 5: II2CMaster: vom client empfangen|direction: i2cread|nbyte: 2|type: temp|i2caddress: 64
2016.12.12 12:42:41 5: II2CMaster: HWaccess I2CAddr: 0x40
2016.12.12 12:42:41 5: II2CMaster: vom client empfangen|direction: i2cread|nbyte: 2|type: temp|i2caddress: 64
2016.12.12 12:42:41 3: II2CMaster: HWaccess blockweise von 0x40 lesen, -> sysread failure: Input/output error
2016.12.12 12:42:41 1: PERL WARNING: Exiting subroutine via last at ./FHEM/00_RPII2C.pm line 520.


Gruß Oswald
FHEM Pi3: 1* CUL, 30* Homematic, 10* EnOcean
FHEM Pi3: IR-Lesekopf, BT->SMA
FHEM Pi3: ZHK, 1-wire, 1* VBus   Resol DeltaSol BS

schlawiano

Hallo Oswald,

das ist merkwürdig , jede Schreiboperation auf den I2C-Bus geht schief.
Geht denn irgendein anderes I2C-Device ?

Nicht dass irgendwelche Rechte auf den Bus fehlen.
ggf. mal

sudo adduser fhem i2c

ausprobieren.
Viele Grüße
Karsten