Forum: Mikrocontroller und Digitale Elektronik SHT11 an AVR liefert falsche Werte


von Gast (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

ich habe ein Problem mit einem SHT11 Temperatur- und Feuchtesensor an 
einem Mega128.
Dieser liefert mir immer zu hohe Werte (ca. 1-3 Grad).
Mit dem Testprogramm für den LPT- Port am PC werden mir jedoch die 
richtigen angezeigt.

Ich kann aber in meinem Quellcode nichts unstimmiges finden was den 
Fehler verursachen könnte.
Evtl. vergesse ich ja ein Bit auszulesen?
Schaltungstechnisch ist der SHT11 über eine längere Leitung (wobei es 
keine Rolle spielt ob 20m oder 1m) an den AtMega angeschlossen:
http://www.imgbox.de/users/public/images/c7717q134.jpg

Als Anlage habe ich mal die relevanten Teile des Quellcodes hochgeladen.

Evtl. hat mal jemand die Zeit kurz drüber zu sehen?! (C-Code)
Würde mich sehr freuen!


Gruß und noch einen schönen Montag ;)


PS. Wenn jemand einen funktionierenden Codeschnippsel für einen AtMega 
hat, welcher mir die Werte in eine Variable schreibt wäre ich auch sehr 
dankbar, dann kann ich zumindest schon mal testen ob es an meinem 
Quellcode liegt….

von (prx) A. K. (prx)


Lesenswert?

Nicht zu oft messen, wg. Selbstaufheizung. Einige Sekunden Pause lassen.

von Gast (Gast)


Lesenswert?

Wurde bereits im Quellcode beachtet, trotzdem Danke für den Tip ;=)

von spess53 (Gast)


Lesenswert?

Hi

>Schaltungstechnisch ist der SHT11 über eine längere Leitung (wobei es
>keine Rolle spielt ob 20m oder 1m) an den AtMega angeschlossen...

Mit dieser Aussage wäre ich vorsichtig.

Datenblatt:

>*1.9 Wiring Considerations and Signal Integrity*
>Carrying the SCK and DATA signal parallel and in close
>proximity (e.g. in wires) for more than 10cm may result in
>cross talk and loss of communication.

Evtl. mal den Takt reduzieren.

MfG Spess

von Gast (Gast)


Lesenswert?

Aber sollte 1µs nicht ausreichen?
Da ist doch schon genug Reserve drin...

Gruß

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Aus Versehen die Heizung eingeschaltet?
1
An on chip heating element can be switched on. It will 
2
increase the temperature of the sensor by approximately 5°C

von Gast (Gast)


Lesenswert?

Leider auch nicht, die Register spreche ich überhaupt nicht an....
(siehe Quellcode)

von Gast (Gast)


Lesenswert?

Ich bin gerde dabei die Lib (Beitrag "Lib für Sensirion SHT1x Sensor an AVR") 
an so anzupassen das ich einfach nur die Temp. ausgelesen bekomme.
Aber leider steige ich bei dem Quelltext überhaupt nicht ein.

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Hallo Gast, wenn du bis heute Nachmittag zeit hast poste ich dir mal 
meinen angepaßten SHT11 Test Quellcode von obiger Lib.

von Gast (Gast)


Lesenswert?

Oh, das wäre super...
Ich probiere zwar noch ein wenig weiter, aber ich denke dein angepasster 
wäre mir eine große Hilfe!

von Läubi .. (laeubi) Benutzerseite


Angehängte Dateien:

Lesenswert?

So... du mußt in der libsht.h die Pins und Ports anpassen, sowie 
SHT_TEMP_OFFSET an deine Betriebspannung anpassen.

In deinem Controllerprogramm mußt du dan den header mit einbinden
1
#include <avr/io.h>
2
#include <stdint.h>
3
#include <util/delay.h>
4
#include "libsht.h"
5
.
6
.
7
8
void printIntFp(int i) {
9
  int b, c;
10
  uint8_t buff[5];
11
  for(c=0;c<5;c++) {
12
    b = i % 10;
13
    buff[4-c] = (uint8_t)(b & 0xFF);
14
    i = i / 10;
15
16
  }
17
  b = 0;
18
  for(c=0;c<5;c++) {
19
    if (b == 0 && buff[c] == 0) {
20
      b = 1;
21
      continue;
22
    }
23
    if (c==3) {
24
      uart_putc(',');
25
    }
26
    uart_putc(buff[c]+'0');
27
  }
28
}
29
30
.
31
.
32
.
33
34
int main(void) {
35
    //init UART und soweiter...
36
37
    unsigned char checksum;
38
    sht_value humidity;
39
    sht_value temperature;
40
    int temp;
41
    //Reset
42
    sht_softreset();
43
    _delay_ms(100);
44
    //Ohne Heizung...
45
    sht_measure(&humidity, &checksum, HUMI);
46
    sht_measure(&temperature, &checksum, TEMP);
47
    debug("\r\nOhne Heizung:\r\n- Hum1: ");
48
    temp = sht_convert_humidity_fp(&humidity, &temperature);
49
    printIntFp(temp);
50
    debug("%\r\n");
51
    debug("- Temp1: ");
52
    temp = sht_convert_temp_fp(&temperature);
53
    printIntFp(temp);
54
    debug("°C\r\nMit Heizung\r\n");
55
    //Mit Heizung...
56
    _delay_ms(1000);
57
    sht_switch_heating_element(1);
58
    _delay_ms(1500);
59
    sht_measure(&temperature, &checksum, TEMP);
60
    sht_measure(&humidity, &checksum, HUMI);
61
    sht_switch_heating_element(0);
62
    debug("- Temp2: ");
63
    temp = sht_convert_temp_fp(&temperature);
64
    printIntFp(temp);
65
    debug("°C\r\n");
66
    debug("- Hum2: ");
67
    temp = sht_convert_humidity_fp(&humidity, &temperature);
68
    printIntFp(temp);
69
    debug("%\r\nDone!");
70
    while(1) {
71
        _delay_ms(5000);
72
        sht_measure(&temperature, &checksum, TEMP);
73
        sht_measure(&humidity, &checksum, HUMI);
74
        debug("\r\n- T: ");
75
        temp = sht_convert_temp_fp(&temperature);
76
        printIntFp(temp);
77
        debug("°C\r\n");
78
        debug("- H: ");
79
        temp = sht_convert_humidity_fp(&humidity, &temperature);
80
        printIntFp(temp);
81
        debug("%\r\n\r\n");
82
    }
83
}
Debug ist dabei eine Funktion die einen String auf der UART ausgibt und 
uart_putc gibt ein einzelnes Zeichen aus.

Was soll passieren:
1) Das Program gibt auf der UART Feuchte und Temp auf UART aus
2) Die Heizung wird für etwa 1,5Sek angeschaltet
3) Es wird erneut gemessen und ausgegeben. Die Temperatur sollte 
steigen die Luftfeuchte sinken
4) Heizung wird wieder ausgeschaltet
5) Alle 5 Sekunden wird Temp+Feuchte ausgegeben. Anhauchen des Sensors 
erhöht die Luftfeuchtigkeit

Ansosnten solltest du noch beachten, das nach lötarbeiten am Chip dieser 
eigentlich rekonditioniert werden muß in einer Klimakammer. Tut man das 
nicht heißt es im Datenblatt das der Chip u.U. zu hohe Werte ausgibt und 
sich langsam wieder den Kalibrierungsdaten annähert. (Wie lange das 
genau dauert steht aber nicht dabei und ist sicherlich von verschiedenen 
Faktoren abhängig)

von Gast (Gast)


Lesenswert?

Super besten Dank!
Ich habe leider erst morgen wieder die Hardware zum probieren vor mir!
Aber ich werde auf jeden Fall berichten ;)


Gruß

von Gast (Gast)


Lesenswert?

So, die Einbindung hat perfekt geklappt.
Die Heizfunktion habe ich raus genommen.

Leider liegt die Temp. immer noch ca. 0,4 - 0,6 Grad über der von 
anderen Thermometern.
Vermutlich muss der Sensor wirklich nach dem Löten die Behandlung mit 
Wärme und Feuchte bekommen (wie im Datenblatt angegeben).

Übrigens zeigen beide SHT11 Sensoren bis auf 0,1Grad genau das selbe 
Ergebnis, wobei einer an Lackdraht und der andere direkt auf eine 
Platine gelötet wurde.



PS. Danke nochmal für dein Beispielprogramm!!

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Wie gesagt, einmal mit Heizun und einmal Ohne gibt dir schonmal den 
Hinweis das er auch "misst".
Ansonsten sind 0,4 - 0,6 schon okay, vieleicht zeigt "das andere" 
Thermometer 0,2° zuwenig an und der SHT 0,2° zuviel...
Versuch doch mal den Mittelwert über einige Meßungen zu bilden, 
ansonsten steht im Datenblatt auch das Wärmequellen z.B. von Bauteilen 
in der Nähe) das Ergebnis u.U. verfälschen.

von Ralf82k (Gast)


Lesenswert?

Ist die Temperatur die ganze Zeit zu hoch? Also von Anfang an? Oder 
steigt sie erst in einer Minute so hoch? Ich lese ihn zwei mal die 
Sekunde aus und die Selbsterwärmung ist dabei ca. 0,15°C.
An welcher Spannung betreibst du ihn? Das muß in der Soft ja korigiert 
werden und kann auch schon 0,4°C ausmachen.
Die wärmebehandlung ist nur für die Feuchtigkeit wichtig. der 
Temperatursensor ist davon nicht betroffen.

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Ralf82k schrieb:
> Die wärmebehandlung ist nur für die Feuchtigkeit wichtig. der
> Temperatursensor ist davon nicht betroffen.
Hast recht hatte ich falsch in Erinnerung, alerdings gerade noch mal 
nachgelesen: Die höhchste genauigkeit bei diesem Sensor wird bei 3,3V 
erreicht..

von spess53 (Gast)


Lesenswert?

Hi

Wie genau sind den deine Vergleichsthermometer?

MfG Spess

von Ralf K. (ralf82k)


Lesenswert?

Läubi .. schrieb:
> Hast recht hatte ich falsch in Erinnerung, alerdings gerade noch mal
> nachgelesen: Die höhchste genauigkeit bei diesem Sensor wird bei 3,3V
> erreicht..

Wo steht das mit den 3,3V und höchste Genauigkeit? So wie ich das 
verstanden hab bedeutet das 3,3V typisch wären, 5V aber auch gehen. 
Dafür gibt es ja den Koeffizienten für die Temperatur, den man je nach 
Versorgungsspannung abziehen muß.

Aber mir ist nun aufgefallen das der SHT11 +- 0,4° Toleranz hat. Also 
sehe ich da nun kein Problem. Plus noch etwas Eigenerwärmung und schon 
ist man bei deinem Fehler von 0,4-0,6°C

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Version 4.1 von Sept 2008, Fußnote 10
1
Recommended voltage supply for highest accuracy is 3.3V, due to sensor
2
calibration.

von Ralf K. (ralf82k)


Lesenswert?

Hast recht. Hab ich überlesen. Nur blöd ist, dass genau für diese 
Spannung kein Wert zur Korrektur der Temperatur aufgeführt ist.

von Timo P. (latissimo)


Lesenswert?

Hallo!

Mich interessiert der Code auch.
Wo steckt denn die Funktion:

debug("%\r\nDone!");  ??

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Läubi .. schrieb:
> Debug ist dabei eine Funktion die einen String auf der UART ausgibt und
> uart_putc gibt ein einzelnes Zeichen aus.

von Timo P. (latissimo)


Lesenswert?

jo habs schon gelesen... THX

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.