PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [ERLEDIGT] Feuchtigkeitssensor HH10D



Kampi
08.02.2013, 23:01
Hallo Forum,

ich habe nun (mehr oder weniger gut ;) ) erfolgreich einen HH10D Feuchtigkeitssensor an mein Raspberry Pi anschließen könne.
Bei dem Sensor handelt es sich um diesen hier:

http://www.hoperf.com/upload/sensor/HH10D.pdf

Dieser gibt eine Frequenz aus, welche abhängig von der Luftfeuchtigkeit ist.
Da ich nicht weiß wie ich in Python Timer und GPIO Interrupts anspreche (falls das überhaupt geht), habe ich die Frequenzmessung erstmal ohne entsprechende Hardware gemacht.
Das Ergebnis ist, dass der Wert für die Frequenz um etwa 30Hz schwank, was sich natürlich auf das Messergebnis auswirkt (+-10% im Vergleich zum ausgerechneten Messwert mit einer vom Oszi gemessenen Frequenz).
Sobald ich eine Möglichkeit gefunden habe Timer oder ähnliches zu nutzen, werde ich das Programm dementsprechend anpassen :)
Eine Ausgabe sieht atm so aus:
http://img138.imageshack.us/img138/7730/unbenanntttw.png (http://imageshack.us/photo/my-images/138/unbenanntttw.png/)

Und den Code findet ihr hier:


# !/usr/bin/python


import smbus
import time
import RPi.GPIO as GPIO

GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)

FOUT = 25 # Anschluss von FOUT des Sensors

# GPIO als Eingang schalten
GPIO.setup(FOUT, GPIO.IN)

# Adresse
HH10D_EEPROM = 0x51 # I2C Adresse vom EEPROM des Sensors

# Variablen
# EEPROM-Werte
Sens = [0, 0] # Variable fuer die Sensitivity (LSB, MSB)
Off = [0, 0] # Variable fuer den Offset (LSB, MSB)
Sensitivity = 0 # Fertige Sensitivity (16-Bit)
Offset = 0 # Fertiger Offset (16-Bit)


# Frequenzmessung
Frequenz = 0.0 # Variable fuer die Frequenz
Start = 0.0 # Startzeit
Stop = 0.0 # Stopzeit
Differenz = 0.0 # Zeitdifferenz
Zyklen = 2000 # Anzahl der Messzyklen
Korrektur = 0.80 # Korrekturfaktor in % (abhaengig von den Messzyklen!)


# Berechnung
Feuchtigkeit = 0.0 # Variable fuer die Luftfeuchtigkeit


# I2C Bus 0 oeffnen
Bus = smbus.SMBus(0)


# Kalibrationswerte auslesen
Bus.write_byte(HH10D_EEPROM, 0x0A) # Startadresse auf 10 einstellen
for Adresse in range(2): # Beide Sensitivity Bytes auslesen
Sens[Adresse - 1] = Bus.read_byte(HH10D_EEPROM)

for Adresse in range(2): # Beide Offset Bytes auslesen
Off[Adresse - 1] = Bus.read_byte(HH10D_EEPROM)

# Daten umwandeln
Sensitivity = Sens[0] + (Sens[1] << 8)
Offset = Off[0] + (Off[1] << 8)


# Periodenzeit ermitteln
Differenz = 0


for Counter in range(Zyklen):


while GPIO.input(FOUT) == 0: # Warten bis ein High-Pegel anliegt
pass


Start = time.time() # Startzeit festhalten


while GPIO.input(FOUT) == 1: # Warten bis ein Low-Pegel anliegt
pass


Stop = time.time() # Stopzeit festhalten
Differenz = Stop - Start # Differenz der Messzeit errechnen
Frequenz = Frequenz + Differenz # Gesamtdifferenz berechnen


# Frequenz ermitteln
Frequenz = Frequenz / Zyklen # Durchschnittliche Differenz berechnen
Frequenz = Frequenz * 2 # Differenz auf einen kompletten Zyklus hochrechnen
Frequenz = 1 / Frequenz # Differenz in eine Frequenz umrechnen


# Korrekturfaktor einrechnen
Frequenz = Frequenz * (1.0 + (Korrektur/100.0))


# Luftfeuchtigkeit berechnen
Feuchtigkeit = Offset - round(int(Frequenz), 0)
Feuchtigkeit = Feuchtigkeit * (float(Sensitivity) / 4096)
Feuchtigkeit = round(Feuchtigkeit, 2) # Ergebnis runden



print "Sens:" , Sensitivity
print "Offset:", Offset
print "Frequenz:", Frequenz
print "Feuchtigkeit:", Feuchtigkeit, "%"


GPIO.cleanup()


Ich werde morgen oder so auch noch einen ausführlichen Artikel auf meiner HP veröffentlichen (und nächste Woche die Werte mal mit einem "richtigen" Messgerät checken) :)

Btw.....den Shebang habe ich erstmal ausgeklammert, da mir Programmers Notepad immer fiese Steuerzeichen in den Code geschmuggelt hatte und ich jedesmal den Code mittels "vi" nacharbeiten durfte sobald ich diesen geändert habe ;)

pinsel120866
10.02.2013, 10:48
Hallo Kampi,

ich habe gelesen, dass der einzige Pin, der Hardware PWM zur Verfügung stellen kann, GPIO18 (PIN 12) ist. Wie das geht, weiss ich allerdings nicht...
Mehr unter http://www.rpiblog.com/2012/11/pwm-on-raspberry-pi.html