SHT11 an AVR liefert falsche Werte

Gast #1332446
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….
Angehängte Dateien:
Gast #1332670
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
Persönliche Seite #1334204
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)
Angehängte Dateien:
Gast #1335161
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!!
Persönliche Seite #1335362
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.
Gast #1335799
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.
#1336233
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren