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
1 | #define MAKE_SHT_SCK_PIN_OUTPUT SHT_SCK_DDR |= ( 1 << SHT_SCK_PIN)
|
2 |
|
3 | /*und in libsht.c in der Funktion sht_softreset(void) folgende Zeile vorn angefügt:*/
|
4 | 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.
1 | int main(void)
|
2 | {
|
3 | uart_init();
|
4 | sht_value humi_val,temp_val;
|
5 |
|
6 | unsigned char error,checksum;
|
7 | float dew_point;
|
8 | unsigned int i;
|
9 | unsigned char tstr[10];
|
10 | unsigned char hstr[10];
|
11 |
|
12 | sht_connectionreset();
|
13 |
|
14 | while(1) {
|
15 | error=0;
|
16 | error+=sht_measure((unsigned char*) &humi_val.i,&checksum,HUMI); //measure humidity
|
17 | error+=sht_measure((unsigned char*) &temp_val.i,&checksum,TEMP); //measure temperature
|
18 | if(error!=0) sht_connectionreset(); //in case of an error: connection reset
|
19 | else {
|
20 | humi_val.f=(float)humi_val.i; //converts integer to float
|
21 | temp_val.f=(float)temp_val.i; //converts integer to float
|
22 | sht_raw_to_physical(&humi_val.f,&temp_val.f); //calculate humidity, temperature
|
23 | dew_point=calc_dewpoint(humi_val.f,temp_val.f);
|
24 | //float_to_lcd(humi_val.f);
|
25 |
|
26 |
|
27 | uart_puts(itoa(humi_val.i, tstr , 10));
|
28 | uart_puts(itoa(temp_val.i, hstr , 10));
|
29 | }
|
30 | //----------wait approx. 0.8s to avoid heating up SHTxx------------------------------
|
31 | for (i=0;i<400000;i++); //(be sure that the compiler doesn't eliminate this line!)
|
32 | //---
|
33 |
|
34 | }
|
35 | return 0;
|
36 | }
|
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?
1 | int main()
|
2 | {
|
3 | uart_init();
|
4 | _delay_ms(100);
|
5 |
|
6 | unsigned char error =0;
|
7 | unsigned char checksum;
|
8 | sht_value humidity;
|
9 | sht_value temperature;
|
10 | _delay_ms(100);
|
11 | _delay_ms(10);
|
12 | error=sht_softreset();
|
13 | if (error) {
|
14 | uart_puts("ERROR Softreset");
|
15 | }
|
16 | _delay_ms(100);
|
17 | error=sht_measure(&humidity, &checksum, HUMI);
|
18 | if (error)
|
19 | {
|
20 | uart_puts("ERROR Hum");
|
21 | }
|
22 | _delay_ms(100);
|
23 | error=sht_measure(&temperature, &checksum, TEMP);
|
24 | if (error)
|
25 | {
|
26 | uart_puts("ERROR Temp");
|
27 | }
|
28 | _delay_ms(100);
|
29 | sht_raw_to_physical(&humidity, &temperature);
|
30 |
|
31 | unsigned char tstr[10];
|
32 | unsigned char hstr[10];
|
33 |
|
34 | uart_puts(itoa(temperature.i, tstr , 10));
|
35 | uart_puts(itoa(humidity.i, hstr , 10));
|
36 | return 0;
|
37 | }
|
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