mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Temperatur Feuchtigkeitssensor SHT7x Software/ hardware Problem


Autor: Badhan Talukder (Firma: BULME-HTL) (indian_buddy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Liebe Leute,
Ich bin gerade dabei Temperatur und Feuchtigkeit mittels SHT7x zu
bestimmen und will diese anschließend mittels der seriellen
Schnittstelle ausgeben.

MCU: Atmega32
Quarz: 16Mhz
AVRStudio
Compiler: GCC

Pinbelegung von SHT7x:
Pin Name Anschuluss an Atmega32
1   SCK  PA0(ADC0)
2   VDD  VCC
3   GND  GND
4   DATA PA1(ADC1)


Problem:
Ich bekomme keinen richtigen Wert von Temperatur und Feuchtigkeit. Ich 
bin nicht sicher, ob mein Sensor noch am Leben ist. Ich habe schon alle 
Beiträge durchgelesen. Die Routine/ Library habe ich von Timo Ditter(
Beitrag "Lib für Sensirion SHT1x Sensor an AVR" ) genommen.

Library:
libsht_0v2.zip
Beitrag "Re: Lib für Sensirion SHT1x Sensor an AVR"

Die Verbesserungen von Rockclimber habe ich auch angepasst.
Also folgende Zeile in libsht.h ergänzt
#define MAKE_SHT_SCK_PIN_OUTPUT SHT_SCK_DDR |= ( 1 << SHT_SCK_PIN)

/*und in libsht.c in der Funktion sht_softreset(void) folgende Zeile vorn angefügt:*/
MAKE_SHT_SCK_PIN_OUTPUT;

mein Erster Versuch:
Beitrag "Re: Lib für Sensirion SHT1x Sensor an AVR"
Ansatz von TurboCity (Autor) übernommen.

Mit dem untenstehende Code bekomme ich nur eine "0" in Hyperterminal.
int main(void)
{
         uart_init();  
         sht_value humi_val,temp_val;

  unsigned char error,checksum;
    float dew_point;
  unsigned int i;
  unsigned char tstr[10];
    unsigned char hstr[10];

  sht_connectionreset();

  while(1) {
    error=0;
    error+=sht_measure((unsigned char*) &humi_val.i,&checksum,HUMI);  //measure humidity
    error+=sht_measure((unsigned char*) &temp_val.i,&checksum,TEMP);  //measure temperature
    if(error!=0) sht_connectionreset();             //in case of an error: connection reset
    else {
    humi_val.f=(float)humi_val.i;                   //converts integer to float
    temp_val.f=(float)temp_val.i;                   //converts integer to float
    sht_raw_to_physical(&humi_val.f,&temp_val.f);   //calculate humidity, temperature
    dew_point=calc_dewpoint(humi_val.f,temp_val.f);
    //float_to_lcd(humi_val.f);
    
  
    uart_puts(itoa(humi_val.i, tstr , 10));
    uart_puts(itoa(temp_val.i, hstr , 10));
    }
  //----------wait approx. 0.8s to avoid heating up SHTxx------------------------------      
  for (i=0;i<400000;i++);     //(be sure that the compiler doesn't eliminate this line!)
  //---

  }
  return 0;
}


2te Versuch: Ansatz von Dieter Bohlen
 ( Beitrag "Lib für Sensirion SHT1x Sensor an AVR" )

Mit diesem unterstehende Programm bekomme ich einen 5-stelligen(auch
negetiven) Zahlenwert. Wobei wenn man mit dem Finger den SHT7x berührt,
ändern sich die Werte im Hyperterminal. Soll es heißen dass mein SHT7x
doch reagiert?
int main()
{
uart_init();
_delay_ms(100);

 unsigned char error =0;
unsigned char checksum;
  sht_value humidity;
  sht_value temperature;
_delay_ms(100);
_delay_ms(10);
  error=sht_softreset();
  if (error) {
  uart_puts("ERROR Softreset");
  }
  _delay_ms(100);
        error=sht_measure(&humidity, &checksum, HUMI);
  if (error)
  { 
  uart_puts("ERROR Hum");
  }
  _delay_ms(100);
  error=sht_measure(&temperature, &checksum, TEMP);
  if (error)
  {
  uart_puts("ERROR Temp");
  }
  _delay_ms(100);
  sht_raw_to_physical(&humidity, &temperature);

  unsigned char tstr[10];
  unsigned char hstr[10];
  
  uart_puts(itoa(temperature.i, tstr , 10));
  uart_puts(itoa(humidity.i, hstr , 10));
 return 0;
}
Vielleich kann mir wer sein Programm zur Verfügung stellen. Es ist klar,
das dass Forum nicht da ist um andere Aufgabe zu lösen sondern nur um
anderen zu helfen.
Meine Software und Dokumentation habe ich oben angehägt. Vielleicht
könnt ihr meine Fehler finden.
Danke im Vorraus.
mgf Badhan

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gibt's einen Grund, warum du den genau gleichen Fehler unbedingt nochmal 
machen musst?

Wie schon im vorherigen Thread ergibt das Kuddelmuddel aus Fliesskomma- 
und Integer-Daten mit der union so keinen Sinn. Einer der beiden 
Versionen dürfte dich auch mit Warnungen eindecken. Und in beiden Fällen 
rechnest du erst mit Fliesskommadaten (bzw. lässt in der Lib rechnen), 
nur um dann den diese Daten ohne Umwandlung als Integers auszugeben.

Ich fürchte, dieses Thema ist solange sinnlos, bis zu in dem C Code 
nicht nur blind rumstocherst, sondern ein bischen verstehst was mit den 
Daten passiert.

Empfehlung: Beschränke dich im ersten Anlauf auf die Rohdaten, also vor 
jeder Konvertierung per sht_raw_to_physical. Dann musst du zwar mit 
Taschenrechner oder Spreadsheet nachkontrollieren, aber du ersparst dir 
ein bischen was von dem Typensalat.

Autor: Lorenz .. (lorenz)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mach die Ausgabe lieber so:
uart_puts(dtostrf(temp_val.f, 6, 3, s));

Die Integer-Werte aus dem Union kannst du nicht so für die Ausgabe 
nutzen wie du es machst.

Autor: Pete (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und immer schön die Bibliothek für vprintf mit linken ... (siehe AVR-GCC 
Manual), sonst klappt das mit Fließkomma nicht.

Autor: Badhan Talukder (Firma: BULME-HTL) (indian_buddy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo Leute,
Vielen Dank für eure Tips.
Ich habe jetzt in AVRStudio vprinf lib. eingefügt ( 
http://winavr.scienceprog.com/avr-gcc-tutorial/usi... 
). Ich kann mit Float Daten arbeiten und in UART ausgeben.
Also der Unterstehenden Programm funktiniert :
char buffer[10]; //Ein Beispiel
double wert = 1.09;
sprintf(buffer,"%f",wert);
uart_puts(buffer);

Ich bekomme trotzdem noch zufählige Temperatur und Feuchtigkeitswerten. 
Mein programm habe ich angehägt.

Ich bedanke mich für jeden weitern Tips.
mfg Badhan

Autor: Badhan Talukder (Firma: BULME-HTL) (indian_buddy)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Ups.. hab vergessen die Datei zu anhängen.

Autor: Badhan Talukder (Firma: BULME-HTL) (indian_buddy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hat irgendwer eine Idee, wo der Fehler liegen könnte ?

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.