Forum: Mikrocontroller und Digitale Elektronik Luftfeuchtigkeit mit HCZ-H82A messen


von Marcel M. (hurrykane)


Lesenswert?

Hallo zusammen,

wir bauen in der Schule derzeit eine Wetterstation und sollen Temperatur 
,Luftfeuchtigkeit und Windrichtung ermitteln.

Temperatur habe ich mit einem KTY-88 ermittelt den ich mit einem 
Widerstand Linearisiert habe und mit Spannungsteiler am ADC vom ATmega32 
auswerte.

Windrichtung habe ich mittels drei CNY70 und einem Greycode ermittelt.

Bei dem Feuchtesensor stehe ich aber auf dem Schlauch und weiß auch 
nicht so ganz wie ich vorgehen soll.

Genommen werden muss ein HCZ-H82A von Conrad

Ich weiß das er 1V mit 1khz benötigt. Daher vermute ich das es ein 
Kapazitiv Sensor ist.

1.Die Rechnung zum Auswerten muss ich mit der Temperatur koppeln.

2.Daher meine Vermutung GND --->Sensor--->Widerstand--->1V 1KHZ
                                       |
                                       |
                                       V
                                    uC ADC

3. Kann ich die 1khz mit einem delay von 500us erzeugen?

Bin über Hinweise zum vorgehen dankbar

Gruß
Marcel

von public (Gast)


Lesenswert?

Hallo Marcel,

wie der genau funktioniert ist leider nicht exakt aus dem Datenblatt zu 
entnehmen:

http://www.conrad.com/ce/en/product/1170515/HCZ-H82A

Welche elektronischen Helferlein stehen dir zur Verfügung? 
Signalgenerator? Oszi? Wenn beides vorhanden, dann mal mit einem 1V 1kHz 
Sinussignal draufgehen(Signalgenerator) und schauen(Oszi) was passiert.

Ob 500µs ausreichen errechnet sich ja aus deiner µC-Taktfrequenz, wenn 
du es nicht rechnen willst (rate ich von ab) kannst du dir dein 
erzeugtes Signal ja auf dem Oszi anzeigen lassen und dann iterativ 
vorgehen...

Kannst du denn mit deinem µC ein Sinussignal erzeugen?

Zum Verarbeiten des gemessenen Wertes schau dir einfach mal die Tabelle 
auf der letzten Seite des Datenblatts an. Die Tabelle kannst du dir im 
Flash oder EEPROM ablegen und mit deiner ermittelter Temperatur und dem 
Sensorwert die relative Luftfeuchte entsprechend der Tabelle 
interpolieren.

Noch Fragen?

beste grüße
public

von public (Gast)


Lesenswert?

Heyho,

also der HCZ-H82A war schonmal Inhalt von einem Thread

Beitrag "2poligen Feuchtigkeitssensor am Arduino verwenden [Noob]"

bitte genau durchlesen! :)

grüße
public

von Marcel M. (hurrykane)


Lesenswert?

Zur verfügung habe ich nur ein Oszi. Funktionsgenerator habe ich leider 
nicht.

Sinus sollte mit dem uC möglich sein. Über PWM und Timer kriegt man es 
annähernd Sinusförmig hin mit nachschlaten von RC-Gliedern.

Den Beitrag habe ich bereits gelesen. Jedoch wird egal wo ich was lese 
davon abgeraten einen Kapazitiven Sensor zu nehmen. Jedoch habe ich 
keine Wahl da der Sensor vorgegeben ist.

Alternativ würde ich einen XR-2206 benutzen um ein Sinus Signal zu 
erzeugen.

Das mit der Tabelle hatte ich mir auch schon überlegt diese in Array`s 
zu legen und je nach Temperatur das Array zu wechseln.

Oder hat jemand einen besseren Vorschlag zum weiteren Vorgehen?

von Wolfgang (Gast)


Lesenswert?

Kann es nicht ein ganz gewöhnlicher DHT22 alias AM2302 mit digitaler 
Schnittstelle sein?

von Marcel M. (hurrykane)


Lesenswert?

Habe ich nachgefragt der Lehrer meinte das wir diesen nehmen müssen. 
Hätte auch lieber einen Digitalen genommen aber keinen Chance. Er 
besteht darauf.

Wegen dem Sinus könnte ich doch auch einen NE555 nehmen und dahinter 
einen TP setzen.

von public (Gast)


Lesenswert?

Hallo Marcel,

zwei Überlegungen zum Anregungssignal:

(1) mit der Sinusanregung kommst du widerstandsmesstechnisch 
höchstwahrscheinlich sehr nah an die im Datenblatt angegebenen Werte 
heran. Deshalb wäre es von Vorteil mal mit unterschiedlichen Signaltypen 
(Rechteck, Sinus, Dreieck...) auf den Sensor zu gehen und schauen was du 
als Widerstand messen kannst. (Tabelle machen!!!)

(2) theoretisch bekommst du mit einem X-beliebigen Signal einen 
irgendwie gearteten ADC-Wert (sprich Digitalwert), den du dann eh noch 
interpretieren darfst, für den Fall musst du dir die Tabelle selber 
stricken... was uns wieder zu (1) führt. :) ;)

Ich schätze du wirst also an einem Sinus nicht vorbeikommen, den kannst 
du ja mit deinem Oszi überprüfen.
Zum erfassen des Signals würde ich auf jeden Fall einen Impedanzwandler 
dazwischenschalten, sonst hast du wahrscheinlich wieder trouble mit dem 
ADC-Wert und der Interpretation...

Dann noch mal zum Algorithmus zum umrechnen. Vorschlag meinerseits:

(1) 2x16-dimensionales Array erschaffen :D hammer Rechenleistung
(2) Zellenindex 1 entspricht der Temperatur
(3) Zellenindex 2 entspricht der relativen Luftfeuchte
(4) als Inhalt in der Zelle jeweils den Widersstand aus der Tabelle 
ablegen

Beispiel-code:
1
int array[2][16] = {/* hier die Widerstandswerte ablegen */}
2
int temperaturGemessen = 0;
3
int widerstandGemessen = 0;
4
int relativeFeuchte = 20;
5
int rhCounter = 0;
6
7
temperaturGemessen = getTemp(); // auf 1°C genau
8
widerstandGemessen = getWiderstand();
9
/* Was getTemp und getWiderstand machen muss ich nicht erklären? */
10
11
while (widerstandGemessen < array[temperaturGemessen][rhCounter])
12
{  
13
  rhCounter++; 
14
}
15
16
relativeFeuchte += rhCounter * 5;
17
18
19
/* Also passiert folgendes: 
20
rhCounter = Zellenindexfaktor für Luftfeuchtestufen
21
0 = 20%RH
22
1 = 20%RH + 1*5
23
2 = 20%RH + 2*5
24
3 = 20%RH + 3*5
25
... */

Ich hoffe ich habe jetzt selber keinen Bock geschossen ;)

beste grüße
public

von public (Gast)


Lesenswert?

Heyho,

doch ich hab nen kleinen Bock geschossen...

Es müsste ein 11x16 Feld sein
11-Temperaturstufen
16-RH-Stufen

:D

ahja und die while-Schleife ist natürlich übertrieben groß

Zwischenstufen benötigt? --> Interpolieren

beste grüße
public

von Marcel M. (hurrykane)


Lesenswert?

Danke Public,

Werde das nachher mal testen wenn ich Zeit finde andernfalls spätestens 
am Wochenende.

Habe mir jetzt einen XR-2206 bestellt zwecks Sinus, denke damit geht es 
am leichtesten und am saubersten.

Danke Dir schon mal.

Gruß
Marcel

von Klaus (Gast)


Lesenswert?

Marcel M. schrieb:
> Habe mir jetzt einen XR-2206 bestellt zwecks Sinus, denke damit geht es
> am leichtesten und am saubersten.

Irgendwie kommt mir das vor, wie mit Kanonen auf Spatzen schießen.

Es geht doch wohl darum, die Impedanz eines Sensors bei ca. 1kHz zu 
messen. Dabei darf die Messspannung nicht größer als 1Vrms sin.

Ein Rechteckt mit 1kHz zu erzeugen ist mit einem µC kein Problem. Da die 
Spannung auf jeden Fall zu hoch ist, muß runtergeteilt werden. Das 
bekommt man mit einem passiven Tiefpass leicht hin. Bei einem Tiefpass 
2. Ordnung ist das für eine solche Messung schon ein prima Sinus. Alles 
andere ist für ein solches Schätzeisen overengineering.

MfG Klaus

von Marcel M. (hurrykane)


Lesenswert?

Hallo Klaus,

also reicht es, aus dem Rechtecksignal einen Sinus zu erzeugen. Wenn der 
Sensor damit läuft soll mir das auch recht sein.

Den XR-2206 nutzte ich dann zum Selbstbau eines Funktionsgenerators.

Gruß
Marcel

von Marcel M. (hurrykane)


Lesenswert?

Hallo Klaus,

sorry das es was länger gedauert hat.

Also habe den Lehrer überzeugt bekommen doch den DHT22 zu nehmen da er 
den anderen selber nicht ans laufen bekommen hat.

Der DHT22 läuft super. Ich gebe die Werte per LCD und Webpage auf dem 
Webserver von Ulrich Radig aus.

Habe das Programm schon gekürzt für meine Bedürfnisse, jedoch habe ich 
eine Frage zu dem erzeugen der Webpage.

if (strncasecmp_P("VA@",http_entry[index].new_page_pointer,3)==0)
      {
        b = (pgm_read_byte(http_entry[index].new_page_pointer+3)-48)*10;
        b +=(pgm_read_byte(http_entry[index].new_page_pointer+4)-48);
        dtostrf(var_array[b], 3, 1, var_conversion_buffer);
        str_len = strnlen(var_conversion_buffer,CONVERSION_BUFFER_LEN);
        memmove(&eth_buffer[TCP_DATA_START+a],var_conversion_buffer,str_len);
        a = a + (str_len-1);
        http_entry[index].new_page_pointer=http_entry[index].new_page_pointer+5;
      }

Der Obige Quellcode importiert ja Zahlen welche in dem Array stehen und 
setzt diese an die Platzhalter in der Webpage (z.B. VA@00).

Wie müsste ich denn Code abändern um Text zu übergeben?

Würde Gerne die Windrichtung übertragen.

char  *windrichtung[8] = {"N","NO","O","SO","S","SW","W","NW"};

Nur wie bekomme ich die in die Webpage übertragen?

Gruß
Marcel

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.