Vergleich einer GPIO Ausgabe mit Reaktion

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Guten Abend Forum,

    ich würde mich freuen wenn Sie zu meiner Idee Lösungs/Verbesserungs Vorschläge hätten.

    :thumbs1:

    Was soll geschehen (Grob):
    Mein Raspberry Pi ist über GPIO mit einem Temperatur- und Luftfeuchtigkeitfühler ausgestattet.
    Ich möchte nun das mein Pi alle 10min die Luftfeuchtigkeit und Temperatur überprüft.
    Wenn jedoch die Temperatur über 35°C oder die Luftfeuchtigkeit über 90% ist sollten die 2 Lüfter (auch über GPIO angeschlossen) starten (Zu- & Abluft).
    Wie bekomm ich das hin?

    Grund Idee:

    2 Scripte

    1 Datei in C/C++ geschrieben


    1.Script beinhaltet den Befehl zum abfragen der Temperatur und Luftfeuchtigkeit.
    Diese schreibt er dann in eine .txt-Datei. Die Befehle hab ich schon ;)

    Bash
    #!/bin/bash
     
    cd Adafruit-Raspberry-Pi-Python-Code
     
    cd Adafruit_DHT_Driver
     
    sudo ./Adafruit_DHT 11 4 > Temp_Feucht.txt


    Ausgabe

    Using pin #4

    Data (40): 0x31 0x0 0x10 0x0 0x41

    Temp = 16 *C, Hum = 49 %




    2.Script beinhaltet das einschalten der Lüfter.
    Dh. es führt den Befehl aus der die Lüfter zum Laufen bringt.

    1 Datei die in C/C++ geschrieben ist beinhaltet legendlich den Vergleich zwischen Dem Temperatur SOLL-Wert und dem IST-Wert.

    Code
    Dh. (Grob):
    Ausführen = alle 10 Minuten
     
    If Temp_Soll < Temp_IST
         -> Schalte den Lüfter an (Set GPIO Pin auf 1)
    Else if Temp_Soll > Temp_IST
         -> Schalte den Lüfter aus (Set GPIO Pin auf 0)


    So nun zu meiner Frage::helpnew:

    1.Kann ich das so machen oder ist es nicht empfehlenswert?
    2.Habt Ihr bessere Ideen?
    3.Wie könnt ich das am besten umsetzen?
    4.Wie kann ich die Werte in eine .txt-Datei speichern
    5.Wie kann ich Werte aus einer .txt-Datei importieren und Vergleichen?
    6.Gibt es ein (Grund) Script in dem ich den Pin und den Zustand eintragen kann und er führt diesen dann aus? (Für die Lüfter ist das ja nur ein einfacher AN oder AUS Befehl)
    7.Könnte jemand so nett sein und mir beim C/C++ Programm helfen, da ich überhaupt kein Plan von C/C++ habe es jedoch als beste Möglichkeit ansehe.

    Ich bedanke mich im Voraus für Lösungsvorschläge. Danke :danke_ATDE:

  • [font="Arial"]Hallo,

    ich habe auch schon mal etwas ähnliches gebaut.

    Sah bei mir so aus:

    Ich hatte ein PHP-Skript, welches die Temperatur vom Sensor abfragt und anschließend in eine MySQL-Datenbank schreibt. Dieses Skript habe ich dann über einen Cronjob aufrufen lassen.


    Ein weiteres Skript hat mir dann aus den Temperaturdaten aus der Datenbank eine Verlaufsgrafik errechnet.





    Vieleicht hilft dir das ja vom Grundansatz her. Du könntest dein Projekt zum Beispiel ähnlich realisieren und als zusätzliche Funktion beim schreiben in die Datenbank prüfen ob die Werte zu hoch ist und ggf. den/die Lüfter starten.


    Soviel zu meiner Anregung für dein Projekt

    Viel Erfolg[/font]

    Einmal editiert, zuletzt von Nidro (7. November 2013 um 19:53)

  • Vielen Dank für die schnelle Antwort.

    Deine Umsetzung hört sich nicht schlecht an. Nur hab ich da ein fatales Problem,:wallbash:

    ich bin noch sehr jung und hab wenig bis gar keine Erfahrungen was MySQL Datenbanken und php Scripte angeht..

    Könntest du, wenn du Zeit und Lust hast, mir dabei zur Hand gehen indem du bspw. ausschnitte aus deinem Projekt hier teilst die mich weiter bringen oder mir zu mindest das Grundprinzip verdeutlichen?

    Da mir leider überhaupt nicht klar ist wie ich denn so etwas angehe, geschweige denn Programmiere...:huh:


    Das währe für mich die größte Hilfe.
    Cookieflavour

  • Irgendwie passt die Überschrift nicht zum Inhalt :huh:


    MySQL finde ich - wie immer - übertrieben... Begründung:


    Ich würde hierfür überlegen anstatt MySQL zu nutzen lieber auf SQLite3 umzusatteln

    Meine Erfahrungen mit MySQL auf dem RPI sind eher schlecht als recht - die permanent laufenden mysqld Prozesse fressen verhälltnismässig unnötig viel CPU + RAM aber soviel hat der Raspberry nicht

    Die Syntax ist eigentlich die gleiche, es gibt nur minimale Unterschiede und das erzeugen des Datenbank-Files ist natürlich SQlite spezifisch.. Aber was die Performance angeht so macht sich MySQL erst bei grösseren Datenbank-Strukturen bemerkbar, was aber hierrauf denk ich nicht zutreffen wird ;)


    Da das Projekt hier aber bereits passend für MySQL geschrieben wurde und ich keinen 1-Wire Sensor habe - müsste sich damit jemand anderes auseinandersetzen :-/


    Guck dir mal das hier an, vielleicht hilft dir das weiter: CPU/Sys-Infos


    Allerdings verstehe ich nicht ganz wofür du die Daten in eine Datenbank/Datei schreiben willst?
    Wieso machst du das nicht über ein Script?
    Ein Script was die Temperatur ausliest legt fest ob ein GPIO pin auf high oder low gestellt wird, sinkt die Temperatur unter einen bestimmten Wert wird der Zustand geändert und fertig

    zB in bash:
    Adafruit_DHT auslesen und Rückgabe in eine Variable speichern:

    Code
    WERT=$(sudo /home/pi/Adafruit-Raspberry-Pi-Python-Code/Adafruit_DHT_Driver/Adafruit_DHT 11 4 | grep Temp)


    Dann beinhaltet WERT:

    Code
    Temp = 11 *C, Hum = 100 %

    Temperatur aus WERT auslesen:

    Code
    TEMP=$(echo $WERT | awk {'print $3'})


    Luftfeuchtigkeit aus WERT auslesen:

    Code
    HUM=$(echo $WERT | awk {'print $7'})

    Und die Werte vergleichst du dann mit den von dir festgelegten Maximalwerten und führst entsprechende Aktionen aus


    Es ist btw manchmal hilfreich wenn man die Forumsuche nutzt zB nach "Lüftersteuerung" oder "DHT11" oder "DHT22" , jenachdem was du nutzt

  • Ich würde sagen das die Überschrift passt :D, da ich durch einen Befehl (oben Beschrieben) an folgene Ausgabe komme:

    Using pin #4
    Data (40): 0x31 0x0 0x10 0x0 0x41
    Temp = 16 *C, Hum = 49 %

    (Ausgabe sieht 1:1 so im Terminal aus)

    Und durch diese Ausgabe soll anschließend eine vorbestimmte Reaktion auftreten.


    Wie du, so denk auch ich, dass ein script sinvoll sein würde. Nur hab ich hierbei wieder das Problem das ich in dieser hinsicht ein totaler Newbie bin. Ich verstehe zwar schon teils die Basics nur reicht es leider nicht für ein komplett (Funktions fähiges) Script :(

    Was ich möchte:
    -Daten aus dem Terminal sinvoll weiterverarbeiten ohne großartige CPU-Auslastung, da im Vordergrund ein Emulator läuft und der nicht stocken soll
    -Eine sich Zeitlich wiederholende Ausführung
    -Eine Beschreibung wie und mit welchen Befehlen man das kurz und knackig programmieren kann


    Was ich nicht möchte:
    -Die Daten übers Internet abspeichern um sie von dort aus weiter zu verarbeiten
    -Unnötig viel aufwand (Da ich mir sonst alles erlesen müsste um es zu verstehen:wallbash:)
    -Die Temperatur und Luftfeuchtigkeit langzeitig abspeichern (Nur für die Zeit der Überprüfung)


    Was ich überlege:
    -Ob eine Datenbank für die 2 Einträge wirklich nötig/sinvoll ist
    -Wie genau ich später den Lüfter ansteuern kann

    -Welche Programmiersprache am besten wäre

    PS:
    Ich nutze den DHT 11

    Einmal editiert, zuletzt von Cookieflavour (8. November 2013 um 12:24)

  • Also ich mag bash sehr gerne da es aus meiner Sicht auch leichter zu verstehen ist als python oder C/C++ ;)
    Was du letzlich nutzt ist aber denk ich relativ egal - es gibt aber immer mehrere Wege die ans Ziel führen

    Ich hab dir oben ja schon ein paar Zeilen genannt um die Werte deines Sensors auszulesen

    Nun weiss ich aber leider immer noch nicht Was du eigentlich schalten willst und Worüber :huh:
    Desweiteren würde mich auch deine Schaltung interessieren denn danach richtet sich wie das Script aussehen müsste...


    Grundsätzlich werden Scripts immer von oben nach unten eingelesen, wenn du also etwas aufrufst sollte das vorher bereits deklariert worden sein - eine Ausnahme stellt php dar was erst die Datei einliest und dann functions aufufen kann die erst weiter unten im Code stehen können....

    Fang wir erstmal damit an eine Script Datei anzulegen und anschliesend ausführbar machen: nano temp.sh && chmod +x temp.sh

    Die aller erste Zeile sollte den Shebang beinhalten, also der vollständige Pfad zum Interpreter der den nachfolgenden Code verarbeiten soll - das ist für bash/python/php wichtig

    Bash
    #!/bin/bash

    Dann würd ich erst mal ein paar Variablen festlegen wie zB den Befehl und die Maximalwerte auf die das Script reagieren soll, damit man nur diese paar Zeilen anpassen müsste aber nicht in den eigentlich Code rein muss (also nicht hardcoded)

    Code
    CMD="sudo /home/pi/Adafruit-Raspberry-Pi-Python-Code/Adafruit_DHT_Driver/Adafruit_DHT 11 4 | grep Temp"
    MAXtemp=35
    MAXhum=50
    GPIOpin=17

    Dann würde ich erst mal sicherstellen das der GPIO pin aktiv ist, also erst mal prüfen ob der "export"ed wurde und das entsprechende Verzeichnis existiert, bzw wenn dies nicht ( ! ) existiert sollte der pin exported werden:

    Code
    if [ ! -d /sys/class/gpio/gpio$GPIOpin ]; then
      echo $GPIOpin > /sys/class/gpio/export
      echo out > /sys/class/gpio/gpio$GPIOpin/direction
      echo 0 > /sys/class/gpio/gpio$GPIOpin/value
    fi

    Nun gehen wir daher und lesen die Werte aus:

    Code
    WERTE=$($CMD)


    Eine alternative Schreibweise wäre auch: WERTE=`$CMD`
    Damit wird ein Befehl ausgeführt und der Rückgabewert in die Variable WERTE geschrieben

    Dann beinhaltet WERT: Temp = 16 *C, Hum = 49 %

    Nun splitten wir diese Zeile noch weiter auf da wir nur die Zahlen gebrauchen können:

    Code
    TEMP=$(echo $WERTE | awk {'print $3'})
    HUM=$(echo $WERTE | awk {'print $7'})


    Hintergrund zu awk: Jedes Wort das durch ein Leerzeichen getrennt ist, gilt als 'Argument' oder auch 'Parameter'. Bei awk ist also das erste Argument von $WERTE "Temp", das zweite Argument wäre "=", das dritte Argument wäre "16", das vierte Argument wäre "*C," usw
    Das " | " ist eine Pipe. Also die ausgabe des linken Befehls wird durch die Pipe an den nachfolgenden Befehl übergeben

    Jetzt vergleichen wir die Werte und falls die den Maximal Werten überschritten werden führen wir eine entsprechene Aktion aus:

    Code
    if [ "$TEMP" -gt "$MAXtemp" ]; then
      echo 1 > /sys/class/gpio/gpio$GPIOpin/value
    else
      echo 0 > /sys/class/gpio/gpio$GPIOpin/value
    fi


    -gt bedeutet: greater then


    Auf mehr möchte ich an dieser Stelle erst mal nicht eingehen da ich wichtige Details nicht kenne - die müsstest du uns erst beantworten

  • Vilen Dank für die hilfe und den Code! Das hilft mir sehr beim Verständnis.


    Ich Verstehe leider nur nicht, was das (!) sein soll...?:huh:


    So hab ich es aufgebaut und Verdrahtet:

    Masse (-) = schwarz / braun

    Plus (+) = rot / gelb (wobei rot und braun auch an einer Externen Spannungsversorgung angeschlossen ist...damit das Relais sauber schaltet)

    Steuerleitung = orange / grün


    Pin Belegung :

    Ich hoffe das Hilft euch mir zu Helfen ;)

  • Ich Verstehe leider nur nicht, was das (!) sein soll...?:huh:

    Das ! ist eine Negation also NICHT

    if [ -d /bla ]; then

    Bedeutet code-wörtlich: Wenn Verzeichnis existiert /bla; dann...

    if [ ! -d /bla ]; then

    Bedeutet code-wörtlich: Wenn NICHT Verzeichnis existiert /bla; dann...


    So hab ich es aufgebaut und Verdrahtet:

    Ich wollte eigentlich nicht wissen an welche GPIO Pins du das angeschlossen hast sondern Woran ;) zB Benutzt du nen Transistor oder ein Rails oder nix dergleichen?
    Was schliest du an den GPIO Pins an?
    Wie sieht der Schaltplan aus? (meinetwegen auch der Steckbrettplan)


    Was willst du damit überhaupt schalten? :)

  • Okay dann Versuch ich es nochmal :D


    Was hab ich damit vor:

    Ich möchte über die 250V Relais (Externe Spannungsversorgung) einen Monitor und 2 Lampen an und aus Schalten.
    Da diese Lampen recht heiß werden und mit dem Monitor in der nähe des Pi´s stehen möchte ich die Temperatur überwachen und bei zu hoher wärme Entwicklung die Lüfter anlaufen lassen.

    Ich bin mir aber nicht sicher an welchen Pin ich den Lüfter anschließe oder ob ich das mit dem Steckbrett kombiniere. IDEEN?

    Da ich auch ein bisschen Angst um meinen Pi habe..wie viel Strom/Spannung kann ich dem Pi klauen ohne das er auseinander fliegt ?


    So sieht ca mein Schaltplan aus:

    ggf. nehme ich aber auch die 5V Externe Verorgungsspannung für die Lüfter und schalte dann über Masse..mal sehen.

    Das Steckbrett so:


    Fragen zum Code:

    Zu dem sagt er mit beim Ausführen $ ist ein unbekantes Token
    (Ich nutze zum Scripten den AppleScript-Editor)

    Einmal editiert, zuletzt von Cookieflavour (9. November 2013 um 15:06)


  • Da ich auch ein bisschen Angst um meinen Pi habe..wie viel Strom/Spannung kann ich dem Pi klauen ohne das er auseinander fliegt ?

    Pro GPIO Pin maximal 20mA

    Du solltest also auf jedenfall sowas wie einen Transistor o.ä. nehmen um "was auch immer" einzuschalten.. den PI nutzt du nur als Schaltsignal
    Über GPIO gibst du ein Signal auf die Basis und schaltest dann den zB Minuspol für deine Lampen oder Lüfter. Der GPIO pin bleibt solange auf 1 bis die Value geändert wird


    Deine Code Frage versteh ich aber nicht - bitte mach unten Beitragsvorschau und versuch es so verständlich wie möglich
    Keine Ahnung was du mir hiermit sagen sollst:

    Code
    ! = [i]/sys/class/gpio/gpio7/[/i]
    ! = gpio7
    welches oder gar keins ?

    Zu dem sagt er mit beim Ausführen $ ist ein unbekantes Token
    (Ich nutze zum Scripten den AppleScript-Editor)

  • Hallo ich hatte in letzter Zeit wenig Freizeit, deswegen melde ich mich erst jetzt..

    Zu meiner Frage:

    Zitat


    Also ich weiß immer noch nicht, was ich als "!" in deim´nem beispiel code nehme deswegen meine Frage ob eins der beiden zutrifft?


    Code
    [i]/sys/class/gpio/gpio7/[/i]
    Code
    gpio7

    Ich wollte nur sagen das ich das Script im AppleScriptEditor schreibe und er mir dort, wenn ich das Script ausführen möchte die Fehlermeldung raus gibt :

    $ ist ein unbekantes Token

    Und ich weiß nicht warum!?

Jetzt mitmachen!

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