mikrocontroller.net

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


Autor: Gast (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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….

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nicht zu oft messen, wg. Selbstaufheizung. Einige Sekunden Pause lassen.

Autor: Gast (Gast)
Datum:

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

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Gast (Gast)
Datum:

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

Gruß

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

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

Autor: Gast (Gast)
Datum:

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

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

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

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Läubi .. (laeubi) Benutzerseite
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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
#include <avr/io.h>
#include <stdint.h>
#include <util/delay.h>
#include "libsht.h"
.
.

void printIntFp(int i) {
  int b, c;
  uint8_t buff[5];
  for(c=0;c<5;c++) {
    b = i % 10;
    buff[4-c] = (uint8_t)(b & 0xFF);
    i = i / 10;

  }
  b = 0;
  for(c=0;c<5;c++) {
    if (b == 0 && buff[c] == 0) {
      b = 1;
      continue;
    }
    if (c==3) {
      uart_putc(',');
    }
    uart_putc(buff[c]+'0');
  }
}

.
.
.

int main(void) {
    //init UART und soweiter...

    unsigned char checksum;
    sht_value humidity;
    sht_value temperature;
    int temp;
    //Reset
    sht_softreset();
    _delay_ms(100);
    //Ohne Heizung...
    sht_measure(&humidity, &checksum, HUMI);
    sht_measure(&temperature, &checksum, TEMP);
    debug("\r\nOhne Heizung:\r\n- Hum1: ");
    temp = sht_convert_humidity_fp(&humidity, &temperature);
    printIntFp(temp);
    debug("%\r\n");
    debug("- Temp1: ");
    temp = sht_convert_temp_fp(&temperature);
    printIntFp(temp);
    debug("°C\r\nMit Heizung\r\n");
    //Mit Heizung...
    _delay_ms(1000);
    sht_switch_heating_element(1);
    _delay_ms(1500);
    sht_measure(&temperature, &checksum, TEMP);
    sht_measure(&humidity, &checksum, HUMI);
    sht_switch_heating_element(0);
    debug("- Temp2: ");
    temp = sht_convert_temp_fp(&temperature);
    printIntFp(temp);
    debug("°C\r\n");
    debug("- Hum2: ");
    temp = sht_convert_humidity_fp(&humidity, &temperature);
    printIntFp(temp);
    debug("%\r\nDone!");
    while(1) {
        _delay_ms(5000);
        sht_measure(&temperature, &checksum, TEMP);
        sht_measure(&humidity, &checksum, HUMI);
        debug("\r\n- T: ");
        temp = sht_convert_temp_fp(&temperature);
        printIntFp(temp);
        debug("°C\r\n");
        debug("- H: ");
        temp = sht_convert_humidity_fp(&humidity, &temperature);
        printIntFp(temp);
        debug("%\r\n\r\n");
    }
}
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)

Autor: Gast (Gast)
Datum:

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


Gruß

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!!

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Ralf82k (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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..

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Wie genau sind den deine Vergleichsthermometer?

MfG Spess

Autor: Ralf K. (ralf82k)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

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

Autor: Ralf K. (ralf82k)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Timo P. (latissimo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

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

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

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

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

Autor: Timo P. (latissimo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
jo habs schon gelesen... THX

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.