Temperaturwerte werden falsch ausgegeben

L I V E Stammtisch ab 20:30 Uhr im Chat
  • Guten Abend Raspberry Pi Forum,

    meine Frage baut auf dem Link zum Tutorial von logan517 auf.

    Ich habe es so gemacht wie beschrieben..
    Nur gibt mir der Raspberry, so glaube ich den Wert der Luftfeuchtigkeit aus und nicht der Temperatur.

    Daten
    -Raspberry Pi Modell: A
    -DHT11 Temperatur-/Luftfeuchtigkeitsmesser

    Hier das Script:


    Was er bei einer Terminal abfrage heraus gibt:


    Code
    pi@raspberrypi~/Adafruit-Raspberry-Pi-Python-Code/Adafruit_DHT_Driver $ sudo ./Adafruit_DHT 11 4 
    Using pin #4
    [size=10][font="Menlo"]Data (40): 0x2d 0x0 0x15 0x0 0x42[/font][/size]
    Temp = 21 *C, Hum = 45 %


    Ausgabe in der Datei:

    temperatur.txt

    Code
    45.464


    Ich vermute er vertausch das hier..
    Wie kann ich das ändern oder wo?

    Ich bin Ratlos ich pinselt 1 Woche am rumprobieren und hab langsam die Nase voll..:@

    Ich bitte um Hilfe :danke_ATDE:

    Einmal editiert, zuletzt von Cookieflavour (19. Januar 2014 um 19:04)

  • Hallo Cookieflavour,

    meistens liegt es an der Verkabelung...

    An welchen Pins hast Du den Sensor angeschlossen? (Welche Bezeichnungsweise hast Du zugrunde gelegt?)

    Hast Du daran gedacht, dass die GPIO-Pins für Version A und B unterschiedlich sind - und die meisten Bastelanleitungen sich auf die Version B beziehen?

    Offensichtlich wertest Du die Ausgabe der Leuftfeuchtigkeit aus, die in einer Datei abgelegt wird, die Du für die Temperatur nehmen wolltest.

    Was steht denn in der Datei für die Luftfechtigkeit drin?

    Wenn Du diese Fragen für Dich beantwortet hast, dann wirst Du auch die Lösung gefunden haben!


    Gutes Gelingen

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

  • Danke für die Antwort.

    Nach dem ich diese nun überprüft habe stelle ich kein Fehler fest, obwohl einer da sein muss! :wallbash:

    Meine Belegung:

    PIN 1 - 3,3V
    PIN 6 - Ground
    PIN 7 - Steuerung (GPIO4) - bleibt gleich


    Ich verglich die Belegung nach folgendem Bild:

    Stimmt meines achtens überein.

    Ich habe zwei Text-Dateien die er Generiert. In einer (luefterstatus.txt) steht der luefterstatus (also 0 oder 1) und in der anderen (temperatur.txt) die Temperatur.
    Nur leider steht dort die Luftfeuchtigkeit.
    Ich hätte nichts dagegen den Wert der Luftfeuchtigkeit zu kennen und weiter zu verwenden nur interessiert mich die Raum-temperatur eher bzw. ist diese wichtiger.


    Ich versteh es nicht... :@

    Einmal editiert, zuletzt von Cookieflavour (20. Januar 2014 um 09:38)

  • Dein Script ist leider abgeschntten (typischer copy&past fehler aus nem Terminal programm), aber wie ich finde auch ein bischen unsauber:

    • In TEMP_DATEI ist nur ein Wert eingetragen, es wird also kein "for" Schleife benötigt - die übergeordnete while reicht bereits.. Es reicht also den Wert auszulesen und in eine Variabe zu schreiben
    • Das selbe gilt für die "Lüfter ein-/aus-schalten" for-Schleifen, die sind ebenfalls unnötig
    • Warum "sleep 60" nachdem der Lüfter eingeschaltet wurde?
    • Wieso wird der Temperaturwert export'ed und mit einem Perl Befehl "berechnet" ?

    Was aber für dein eigentliches Anliegen wichtiger ist:

    $TEMP_DATEI ist der interne Sensor im Broadcom SoC ... Dieser Wert ist selbstverständlich ein anderer als ein Externer Sensor in form des nicht allzugenauen DHT11's

    Dein Script ist also nicht mit dem DHT11 zu vergleichen!! Das sind 2 extrem verschiedene Dinge die du hier durcheinander würfelst

    Das ist nur ein großer Zufall das die RaspberryPI CPU Temperatur so hoch wie die Luftfeuchtigkeit ist

  • Tut mir leid... ich verstehe deine Antwort nicht ganz.

    Info: Ich habe wenig Ahnung was Programmierungen angeht. (Bin aber lernbegeistert)

    Ich habe das Script nur dumm eingefügt und ein bisschen angepasst...Original Script hier:

    Ich sehe auch in dem Script nicht das eine Datei namens temperatur.txt erstellt wird :s


    Wie würdest du denn an soetwas herran gehen ?
    Ich nehme an du hast Erfahrung..? :helpnew:

  • :huh:

    Das ist der INTERNE Sensor des RaspberryPIs -> /sys/class/thermal/thermal_zone0/temp

    Das ist ein EXTERNER Sensor -> /Adafruit-Raspberry-Pi-Python-Code/Adafruit_DHT_Driver


    Das der Temperatur Wert der RaspberryPI CPU zufälligerweise gleich zu seinen scheint wie der Luftfeuchtigkeits Wert des DHT11 Sensors ; ist für deinen Fall der entscheidene Fehler anzunehmen dass dir ein falscher Wert angezeigt werden würde !!

    Du würfelst hier leider 2 grundlegend verschiedene Dinge durcheinander!


    War das nun verständlich :huh:


    Spoiler anzeigen
  • Hallo Cookieflavour,

    ich sehe immer noch nicht, über welchen GPIO-Eingang Du die Messwerte einliest. Für diesen Eingang werden entsprechend Dateien im GPIO-Verzeichnis abgelegt, die Du auslesen kannst.

    Anscheinend liest Du eine Datei aus, die zufälligerweise mit Daten gefüllt wird - aber eben nicht mit denen, die Dein Sensor produziert - und auf die Du reagieren möchtest, um einen Lüfter zu schalten

    Und Meigrafd hat mal wieder Recht: In der Datei ist nur ein Wert vorhanden - kein Verlauf der Temperatur. Es genügt also vollkommen auch nur einen Wert auszulesen, danach ist die Datei "am Ende" angekommen.

    An welchem GPIO-Pin liegt der Temperatur-Sensor, an welchem der Luftfeuchtigkeitssensor?

    Aus dem Code-Ausschnitt gehen jedenfalls andere GPIO-Pins für die Steuerung hervor (GPIO14).

    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

  • Das bash Script ist ausschliesslich für die CPU Temperatur - und führt ein Python Script aus wenn die Temperatur den Max_Temp Wert überschreitet: python /home/luefterscript/gpio14on.py

    Der DHT11 ist ein 1wire Sensor, der über "./Adafruit_DHT 11 4" ausgelesen wird.

    Beides ist zZt unabhängig voneinander und haben nichts gemein (zumindest nicht in dem bash Script)

  • Guten Morgen,

    ich bedanke mich erstmal für die Hilfe!

    meigrafd
    Ja es ist jetzt verständlicher...*scham*

    Also heißt das ich erstmal ein Script schreiben muss damit der Sensor ausgelesen werden kann? (also DHT11)
    Oder hat sich da schon mal jemand hingesetzt?
    Wenn nicht sollte das ja nicht so schwer sein oder ?

    Aber mal eine Frage: Wenn ich in einem Script in einem Verzeichnis Treiber laden muss wie schreibe ich das in das Script?
    Das würde mich mal interessieren... mit -cd- ?


    So heute werd ich hoffentlich etwas Zeit finden,
    um ein bisschen daran zu experementieren ich werd mich melden ;)

  • Nun, das kommt auf dein Script an und auch darauf wie du das nutzen willst :huh: Leider weiß ich nicht was du eigentlich genau machen möchtest, es is also schwer dir genau für dein Vorhaben den richtigen Drill zu geben..

    Es gäbe eben selbstverständlich mehrere Möglichkeiten, die meisten nutzen python oder C++ , es wäre aber auch eine Kombination möglich indem du zB aus einem bash oder PHP Script python oder eine C++ Binary ausführst und die Rückgabe weiter verarbeitest...

    Google mal nach " Raspberry DHT11 " da findest du in den ersten Treffern ein paar Beispiele - oder auch hier im forum


    PS: Der DHT11 kann keine Minusgrad, wenn du also auch Minusgrade auslesen willst brauchst du DHT22 oder DS18B20


  • Nun, das kommt auf dein Script an und auch darauf wie du das nutzen willst :huh: Leider weiß ich nicht was du eigentlich genau machen möchtest, es is also schwer dir genau für dein Vorhaben den richtigen Drill zu geben..

    Okay dann wede ich mal versuchen ein bisschen Python zu erlernen...:)
    DHT 11 braucht auch keine Minus Grade zu messen, dafür war er auch nicht gedacht...
    DHT 11 soll ausschließlich die Raumtemperatur messen und sie weiter geben.
    Da Ihr, wie Ihr sagtet, mein Anliegen nicht nachvollziehen könnt werde ich euch im folgenen den Aufbau ( schlecht gezeichnet -Paint :D ) versuchen zu verdeutlichen:

    Im Grunde genommen ist das ganz einfach aufgebaut nur immer diese Software..

    Danke für euchre Unterstützung nochmal :thumbs1:

    Bei weiteren Fragen meld ich mich... :angel:

    Einmal editiert, zuletzt von Cookieflavour (22. Januar 2014 um 09:41)

  • Ich meinte eigentlich was du Softwareseitig umsetzen willst :huh:

    Du hast jetzt leider auch nicht beschrieben was du eigentlich erreichen willst oder was das Missionsziel ist - nur einen Aufbau gezeigt aber der verwirrt ein bischen. Beschreib doch mal bitte mit deinen eigenen Worten deinen Aufbau - so wie man es in der Schule gelernt hat damit deine Idee/Gedanken auch andere verstehen und nachvollziehen können


    Ich versteh jetzt nämlich erst recht nicht wieso du in dem Script die CPU_Temp ausliest aber in deinem Aufbau der DHT11 zwischen den Lüftern plaziert ist? Welche Rolle spielt der DHT11 ? Ist der wichtig zum schalten der Lüfter?

  • Okay ich versuchs...

    Die CPU Temperatur auslesen ist nicht gewollt! Ich dachte das wäre das script für den DHT11:-/

    Ich möchte Softwareseitig:

    In einer Holzbox (2m x 1m x 1m) befindet sich ein Rechner, mehrere Lampen, ein Display und eine Konsole.
    In dieser Box entsteht eine hohe Hitze (geschätzt 40-50 ° oder mehr), die höst wahrscheinlich nicht gut für die Geräte ist.
    Das ist mein vorhaben..
    Ich möchte nun das der Raspberry den DHT11 Temperaturmesser dazu nutz, die IST-Temperatur auszulesen um diese dann mit der SOLL-Temperatur zu vergleichen. Hier (Max. 35°).
    Wird diese Grenze überschritten sollen sich 6 Zusatzlüfter neben dem permanent laufenden Lüfter zu schalten um die Temperatur abzusenken. Jedoch sollen die Zusatzlüfter sich erst abschalten wenn sie einen schwellwert von ca 30-35° unterschritten haben.
    Die Lüfter werden wegen einem zu hohen Anlaufstrom mit externer Spannung versorgt und werden über Relais an/aus geschaltet.

    Der Raspberry soll diese Temperatur jede Minute erneut auslesen.
    Jedoch möchte ich keine Tabelle haben die unnötig Speicherplatz verbraucht sondern immer nur einen Wert.


    ich habe mir nocheinmal die Zeit genommen ein kleines Struktogramm auf die Beine zu stellen:

    Einmal editiert, zuletzt von Cookieflavour (22. Januar 2014 um 11:56)

  • Oke nun hab auch ich es verstanden :)

    Also zunächst würd Ich einfach ein Script in die Crontab packen was dann jede Minute ausgeführt wird, damit sparst du dir den sleep und eine weitere Prüfung ob das Script überhaupt noch läuft (watchdog) usw

    Dann solltest du wie ich finde den DHT22 an einer strategisch guten Stelle positionieren, also nicht direkt im "Luftstrom" denn sonst schalten sich die Lüfter ständig an/aus da sonst der Sensor direkt angepustet wird und somit die Werte verfälscht werden...

    Zum Script:

    Du benötigst 2 verschiedene Temperatur Werte:

    • Ab welcher Temperatur die Lüfter eingeschaltet werden sollen
    • Ab welcher Temperatur die Lüfter ausgeschaltet werden sollen


    Desweiteren würde ich an deiner stelle die Temporären Dateien (LUEFTER_DATEI und TEMP_DATEI) in einem tmpfs Verzeichnis ablegen damit die SD von den ständigen Schreibvorgängen entlastet wird... tmpfs bedeutet das es im RAM liegt.
    Dafür bietet sich /tmp/ an, müsstest du aber noch in /etc/default/tmpfs einschalten: RAMTMP=yes (und anschliesend rebooten)

    Ich hab das Script jetzt so geschrieben das du optional auch die Luftfeuchte nutzen könntest - also nicht wundern, es ginge auch kürzer...

    Was das Script macht ist auch schnell erklärt:

    • Wenn Datei LUEFTER_DATEI existiert schreibe Inhalt in Variable LuefterStatus, wenn Datei nicht existiert schreibe 0 in Variable LuefterStatus (wichtig fürs erste mal ausführen des Scripts oder wenn rebootet wurde)
    • DHTvalues: Auslesen der relevanten Zeile des DHT Sensors (zB: Temp = 21 *C, Hum = 45 %)
    • Argument 3 der DHTvalues Ausgabe in die Variable CurrentTemp hinterlegen ( Temp wäre das erste Argument, = das zweite, 21 das dritte usw)
    • Argument 7 der DHTvalues Ausgabe in die Variable CurrentHum hinterlegen
    • 1.if-Abfrage initialisiert den GPIO für den Lüfter sofern die GPIO Datei noch nicht existiert.
    • 2.if-Abfrage/Vergleich: wenn $CurrentTemp 'greater than' $Max_Temp und $LuefterStatus 'equal to' 0 ; dann... schalte Lüfter an
    • wenn 2.if-Abfrage nicht zutrifft folgt die 3.if-Abfrage/vergleich: wenn $CurrentTemp 'greater than' $Min_Temp und $LuefterStatus 'equal to' 1 ; dann... Lüfter bleibt an (die if-Abfrage ist eigentlich unwichtig und dient nur der echo-Ausgabe)
    • wenn 3.if-Abfrage auch nicht zutrifft folgt die 4.if-Abfrage: wenn $CurrentTemp 'less than or equal to' $Min_Temp und $LuefterStatus 'equal to' 1 ; dann... schalte Lüfter aus

    (bash Operanten werden hier erklärt)


    Der Crontabeintrag könnte dann so aussehen um das Script jede Minute auszuführen:

    Code
    * * * * *   bash /path/to/script.sh >/dev/null 2>&1


    das ">/dev/null 2>&1" bewirkt das eine mögliche Ausgabe in den Mülleimer/Nirvana umgeleitet wird, 2>&1 leitet ebenfalls Fehlermeldungen um (stdout ist kanal 1 und stderr ist kanal 2)

  • So.... nun habe ich ein bisschen rumprobiert und hab wieder ein Problem..

    Was bisher geschah:
    Ich habe dein Lüfterscript durch meins ersetzt und anschließend versucht das ganze in den/die/das Crontatab einzufügen.
    Ebenfalls habe ich den "RAMTMP=yes" eingegeben


    Das Lüfterscript liegt hier:


    Jedoch nichts in der Datei /tmp/temperatur.txt


    Was mache ich falsch???

  • Führ das Script erst mal manuell aus um sicherzustellen das es funktioniert, bevor du es in irgendeine Crontab Datei einträgst...
    Gibt dazu bitte exakt das ein was ihr dir vorgebe:

    Code
    /home/luefterscript/temperaturscript.sh

    ...nix davor schreiben, nix dahinter...führ es genau so aus... wenn das nicht geht kann es crontab auch nicht ausführen

    dann kann man auch noch das logfile /var/log/syslog prüfen, was CRON meldet zu der Zeit wo es das script ausführen sollte


    PS: Meine Vorgabe wie der Crontab Eintrag aussehen sollte, sah minimal anders aus als du ihn umgesetzt hast
    PPS: um deine Zeilen küruer zu machen wärs vllt sinnvoll etwas weniger "script" zu nutzen: /home/luefterscript/temperaturscript.sh --> /home/luefter/temperatur.sh

  • Er will nicht...

    Code
    pi@raspberrypi~ $ /home/luefterscript/temperaturscript.sh
    /home/luefterscript/temperaturscript.sh: Zeile 19: [: -gt: Einstelliger (unärer) Operator erwartet.
    /home/luefterscript/temperaturscript.sh: Zeile 24: [: -gt: Einstelliger (unärer) Operator erwartet.
    /home/luefterscript/temperaturscript.sh: Zeile 26: [: -le: Einstelliger (unärer) Operator erwartet.

    Einmal editiert, zuletzt von Cookieflavour (26. Januar 2014 um 20:16)

  • tja dann musst du jetzt halt prüfen wieso er keine Werte ausgibt

    Zum Beispiel in dem du die Zeile unter Debug einkommentierst und dir anzeigen lässt was die vorhigen Befehle ausgeben...

    Oder das was das Script bzw die if Abfragen machen, selber ausführen

    Code
    Adafruit_DHT=/home/pi/Adafruit-Raspberry-Pi-Python-Code/Adafruit_DHT_Driver/Adafruit_DHT
    DHTvalues=$(sudo $Adafruit_DHT | grep Temp)
    CurrentTemp=$(echo $DHTvalues | awk {'print $3'})
    
    
    echo $CurrentTemp

    Oder das Script mit Debug Ausgabe ausführen:

    Code
    bash -xv /home/luefterscript/temperaturscript.sh


    Ich vermute aber mal das man die Stellen hinterm " . " von den Werten weg schneiden müsste...

    Code
    CurrentTemp=$(echo $DHTvalues | awk {'print $3'})
    CurrentHum=$(echo $DHTvalues | awk {'print $7'})

    ändern in:

    Code
    CurrentTemp=$(echo $DHTvalues | awk {'print $3'} | awk -F. {'print $1'})
    CurrentHum=$(echo $DHTvalues | awk {'print $7'} | awk -F. {'print $1'})
  • Was soll ich damit anfangen?

    was hat 1x + und was haben 2x + zu bedeuten?

    Einmal editiert, zuletzt von Cookieflavour (26. Januar 2014 um 20:35)

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!