• Hallo,
    ich habe da ein Problem: ich habe an die GPIO eine 8 er Relaiskarte angeschlossen und an die Relais jeweils Lampen meines Aquariums angeschlossen. Gesteuert jeweils über Bash Dateien die von derCrontab gestartet werden.
    Mein Problem: alles funktioniert nur wenn Relais 7 anzieht geht das Licht welches an Relais 1 hängt aus ...

    Crontab einträge
    00 12 * * * pi /home/pi/rotan.sh
    10 12 * * * pi /home/pi/ww1an.sh
    20 12 * * * pi /home/pi/ww2an.sh
    30 12 * * * pi /home/pi/kw1an.sh
    40 12 * * * pi /home/pi/kw2an.sh
    00 23 * * * pi /home/pi/blauan.sh

  • Die Jumper sind im Auslieferungszustand, die anderen Relais schalten ja auch alle richtig und die Lampen leuchten.

    #!/bin/sh
    gpio export 22 out
    sleep 120
    gpio export 22 in
    #

    nein der Pi und die Last die über die Relais hängen sind nur am 5 A Netzgerät. Über den Pi werden nur die Relais geschaltet. Die Schaltkontakte der Relais bekommen natürlich ein seperates Kabel zur Versorgung

    Einmal editiert, zuletzt von skorpionius (18. Dezember 2014 um 20:45)


  • #!/bin/sh
    gpio export 22 out
    sleep 120
    gpio export 22 in

    Und welche Datei deines Crontabeintrags soll das nun sein?

    Und wo wird der GPIO 22 auf 1 gestellt?

    Du hast doch anscheint 6 verschiedene Dateien - nicht nur diese eine?


    Wenn dann poste das auch bitte in CODE

  • die sind alle gleich aufgebaut und schalten zu verschiedenen Zeiten und überscheniden sich auch

    Crontab einträge Anfang Ende Dauer [min] Dauer [sec]
    00 12 * * * pi /home/pi/rotan.sh 12:00 12:20 20 1200
    10 12 * * * pi /home/pi/ww1an.sh 12:10 23:00 650 39000
    20 12 * * * pi /home/pi/ww2an.sh 12:20 23:10 650 39000
    30 12 * * * pi /home/pi/kw1an.sh 12:30 22:40 610 36600
    40 12 * * * pi /home/pi/kw2an.sh 12:40 22:50 610 36600
    00 23 * * * pi /home/pi/blauan.sh 23:00 01:00 120 7200

    Rot an 12:00
    WW1 an 12:10
    WW2 an 12:20
    KW1 an 12:30
    KW2 an 12:40

    KW1 aus 22:40
    KW2 aus 22:50
    WW1 aus; Blau an 23:00
    WW2 aus 23:10
    Blau aus 01:00

  • Moin,

    nochmal Relaiskarte, wie ist die Jumperstellung??
    VCC + JD-VCC oder abgezogen und Pi-GPIO-5 Volt an JD-VCC oder externe 5 Volt Stromquelle an JD-VCC....
    VCC an ????, Volt ????

    Offensichtlich nutzt Du wiringPi und schaltest über MODE out/in und nicht per write 0/1.
    Die bash umstellen, zuerst per dem GPIO auf OUT setzten und dann per write 1 / 0 den Schaltzustand bestimmen.
    gpio mode 22 out
    gpio write 22 1
    gpio write 22 0

    Liegen 5 Volt an VCC an und GPIO ist im mode in wird das auf Dauer zu einem Grillfest...

    Bye

    Jürgen

    PS.: Wann was per cronjob gesteuert wird ist unerheblich!!!

    Einmal editiert, zuletzt von rpivpn (18. Dezember 2014 um 21:09)

  • das mit dem write Befehl hat nur funktioniert wenn ich led direkt an die GPIO klemme, mit relais hat das nicht geklappt. So wie ich es nun habe schalten die Relais.
    Die Jumper sind gesteckt. Die Relaiskarte bekommt GND und VCC über die Pins die in der Reihe der in 1 bis in8 stehen


  • die sind alle gleich aufgebaut und schalten zu verschiedenen Zeiten und überscheniden sich auch

    Code
    Crontab einträge			Anfang	Ende	Dauer [min]	Dauer [sec]
    00 12 * * * pi /home/pi/rotan.sh			12:00	12:20	20	1200
    10 12 * * * pi /home/pi/ww1an.sh			12:10	23:00	650	39000
    20 12 * * * pi /home/pi/ww2an.sh			12:20	23:10	650	39000
    30 12 * * * pi /home/pi/kw1an.sh			12:30	22:40	610	36600
    40 12 * * * pi /home/pi/kw2an.sh			12:40	22:50	610	36600
    00 23 * * * pi /home/pi/blauan.sh			23:00	01:00	120	7200

    :-/...was son CODE ausmachen kann.... viel besser lesbar :fies:

    Naja nur 2x eine export Zeile im Script zu haben ist denk ich nicht ganz richtig.. Mal davon abgesehen dass das Licht nie mehr aus geht wenn das Script crasht bzw der PI zwischenzeitlich wegen Stromausfall o.ä. mal neu gestartet wurde...

    Ich würde also eher daher gehen und ein mal zum Einschalten und dann noch mal zum Ausschalten ein Script zu nehmen.
    Und dann würde es auch schon reichen nur ein einziges Script zu nehmen. An dieses eine Script wird dann der Status (an/aus) sowie die Gerätschaft (kw1/kw2/rot/ww1/ww2 etc) übergeben und gut is... Dann kann der PI zwischendurch auch ruhig mal neu starten aber trotzdem geht nachts das Licht wieder aus :geek:

    /home/pi/relais.sh

    Die Crontab Einträge (in deinem Fall wars ja in /etc/crontab) würden dann wie folgt aussehen:

  • led direkt an die GPIO klemme, mit relais hat das nicht geklappt. So wie ich es nun habe schalten die Relais.

    Du hast drei unterschiedliche Baustellen:
    1) Steuerung wann > cronjob
    2) Steuerung wie > xxx.sh / bash
    3) Schaltung > Relais

    Zu 3)
    das Relais hat 3 "Stufen"

    A) VCC und GND steuert die "Vorstufe", den Optocoupler

    B) JD-VCC und GND steuert die (5 Volt) Relaisspule

    C) die Relaisspule schaltet einen UM-Schalter und ist nicht mit GND, VCC und JD-VCC verbunden und schaltet bis 220 Volt / 10 A

    Wenn Du die Relais mit 5 Volt vom Pi versorgst (Jumper auf VCC + JD-VCC) kann es zu einem Dauerschaden beim Pi kommen, dieser ist nur für 3,3 Volt ausgelegt.

    Daher auch meine Anfrage.

    Geringe Last (Watt) kann unmittelbar über die GPIO´s geschaltet werden z. B. LED´s mit entsprechend dimensioniertem Widerstand, nein, keine "Power-LED´s".
    Dieses sollte aber niemals mit dem GPIO-Status IN erfolgen.
    Hier lauscht der Pi am GPIO (Eingang), bei mode OUT kann geringe Last geschaltet werden...salopp ausgedrückt.

    Wenn viele Relais gleichzeitig anziehen entsteht zudem eine "grosse" Last (durch Stufe B), die den Pi in die Knie zwingen können und sollten möglichst durch eine eigene Stromversorgung abgedeckt werden (zumindest bei Typ A + B. (Typ B+ habe ich keine Ahnung))

    Bye

    Jürgen

    PS.: vermutlich glimmen bei dir einige Relais-LED´s nach dem Hochfahren des Pi.

    Einmal editiert, zuletzt von rpivpn (18. Dezember 2014 um 23:41)

  • Hallo Jürgen.
    Vielen Dank erst einmal für deine Unterstützung. Ja die meisten Relais LED glimmen nach dem Hochfahren. Ich habe den PI am GPIO PIN 2 mit + versorgt und vom PIN 4 nehme ich + für die Relaisplate. Dachte wäre ok weil beide als 5V bezeichnet sind ( siehe Anlage).
    Ich werde am Wochenende die Versorgung der Relaisplatte ändern auf extern und den Jumper ziehen. Auch das mit der einzigen Bash aus deiner Anleitung werde ich ausprobieren .. bin gespannt wie das funktioniert. Dein Skript kann ich ja so kopieren nicht wahr?
    Würden meine alten Bash mit dem write Befehl

    #!/bin/sh
    gpio export 22 out
    sleep1
    gpio write 1
    sleep 120
    gpio write 0
    sleep1
    gpio export in
    #

    fünktionieren wenn die Relaisplatine fremd gespeist wird?


  • #!/bin/sh
    ...
    gpio export in

    Grrrrr... verabschiede dich bitte vom Modus IN !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    Der hat hier nix zu suchen.

    Basic:

    Was für eine Last (genaue Angabe bitte) möchtest Du schalten, nur LED ist zu dürfig, bitte den Typ und Anzahl je Relais angeben. Unter Umständen können diese, mit einem Vorwiderstand, direkt am GPIO betrieben werden.

    Bitte mache einen reboot und stelle dann die Ausgabe von ... ein:

    Code
    gpio -v


    und

    Code
    gpio readall

    Nach dem reboot dürften alle mit Name: GPIO. x aufgeführten PIN´s den Mode: IN haben.

    1) Um einen Mode OUT und Schaltzustand 1 beim Hochfahren/reboot zu erhalten muss dieser für jeden GPIO, der ein Relais steuert, gesetzt werden.
    z. B. per cronjob ( x = GPIO Nr.)

    Code
    @reboot  /usr/local/bin/gpio mode x out && /usr/local/bin/gpio write x 1


    oder per bash:
    Crontab-Eintrag:

    Code
    @reboot  /usr/local/bin/gpiomode.sh


    Inhalt von /usr/local/bin/gpiomode.sh:

    Bash
    #!/bin/bash
    # GPIO-Status definieren
    # GPIO x
    /usr/local/bin/gpio mode x out && /usr/local/bin/gpio write x 1
    # GPIO xx
    /usr/local/bin/gpio mode xx out && /usr/local/bin/gpio write xx 1
    # weitere GPIO´s .....

    Relais schalten z. B. per cronjob:

    Code
    00 12 * * * /usr/local/bin/gpio write x 0 # LEDx an
    20 12 * * * /usr/local/bin/gpio write x 1 # LEDx aus
    # weitere Schaltvorgänge ....

    Du kannst hierfür auch meigrafds Beispiel verwenden, clever, die GPIO´s definieren und den Schaltzustand übergeben.

    Die elekrische Komponente:
    mode out und Zustand 0 = Masse liegt am GPIO an
    mode out und Zustand 1 = 3,3 Volt liegen am GPIO an

    Bei 0 "leuchte" der Optocoupler (intern) und schaltet die am JD-VCC anliegenden 5 Volt gegen Masse, das Relais zieht an.

    Der Steuerteil A (VCC/Optocoupler) der Relaiskarten ist für den 5 Volt Betrieb ausgelegt.
    Um den Pi, der für 3,3 Volt ausgelegt ist, zu schützen können Massnahmen wie Vorwiderstand oder/und ULN2803 greifen.
    Meiner Ansicht nach ist dieses nicht zwingend notwendig und meine Pi´s bisher ohne Schaden, sofern unmittelbar beim Hochfahren mode out gesetzt wird!!!

    Bye

    Jürgen

    Einmal editiert, zuletzt von rpivpn (19. Dezember 2014 um 14:00)

  • könntest du mir die bash mal etwas erklären'?'

    Bash
    #!/bin/bash


    Shebang auf /bin/bash stellen. bash ist neuer als sh und kann mehr.
    Erforderlich wenn die Datei direkt ausgeführt werden soll, ohne es selber an einen Interpreter zu übergeben.

    Code
    ## GPIO # = Name
    GPIO[22]=WW1
    GPIO[23]=WW2
    GPIO[24]=KW1
    GPIO[25]=KW2
    GPIO[26]=ROT
    GPIO[27]=BLAU

    Array erstellen.
    Format: GPIO[pin#]=Deine.Bezeichnung.die.zur.Übergabe.ans.Script.verwendet.wird
    ..Hierzu mehr weiter unten..

    Code
    NAME=$1
    STATUS=$2


    Zuweisung der Übergabeparameter.
    Parameter werden generell durch Leerzeichen getrennt. Das erste Parameter was übergeben wird befindet sich in $1, das zweite in $2, das dritte in $3 usw. Das Script selbst ist in $0 hinterlegt. Alle übergebenen Parameter in $* bzw $@.
    Hierdurch werden also das 1.Parameter nachfolgend im Script durch $NAME abrufbar und somit der Code besser lesbar.

    Code
    if [ -z "$STATUS" ]; then
    	echo "Usage: $0 <Name> <Status>"
    	exit 1
    fi

    Sicherstellen das dem Script zwei Parameter übergeben wurden, also auch das zweite. " -z " bedeutet soviel wie: wenn leer. Wenn also $STATUS (bzw $2) leer ist; then ... echo und exit 1 um eine Fehlerhafte Ausführung anzuzeigen (Googlesuche nach: Exitcode)

    Code
    if [ $STATUS = "on" ]; then
    	#mode out und Zustand 0 = Masse liegt am GPIO an
    	#mode out und Zustand 1 = 3,3 Volt liegen am GPIO an
    	STATE=1
    else
    	STATE=0
    fi

    Bequemlichkeit, damit besser verständlich "on" ans Script übergeben werden kann, was hier dann STATE auf 1 setzen würde, da die GPIO's nur 1 oder 0 verstehen, nicht aber on oder off...

    Code
    for PIN in ${!GPIO[*]}; do

    eine for-Schleife, welche jeden Index des Arrays zurück gibt. Wir erinnern uns: GPIO[22]=WW1
    GPIO ist der name des Arrays. [ ] legt das Index des Arrays fest, also eine Zahl. = ist die Zuweisung zu dieser Array-Variablen.
    Arrays müssen in bash generell in Form von ${array[xxx]} aufgerufen werden
    Das ! sagt aus das man den Index haben möchte. [*] wird hierfür ebenfalls benötigt..

    Was das im Grund macht ist eine Liste mit allen Index's zurück zu geben: 22 23 24 25 26 27
    Die for-Schleife weißt dann jedem Index die Variable PIN zu. Bei jedem Durchlauf ist also das aktuelle Element aus der Liste über $PIN abrufbar.
    Er würde also bei for PIN in ${!GPIO[*]}; do zunächst folgendes formen: for PIN in 22 23 24 25 26 27; do
    Nun startet er mit der ersten Zahl aus der Liste, also der erste Durchlauf der Schleife. Dann wäre PIN=22

    Code
    if [ ${GPIO[$PIN]} = "$NAME" ]; then


    Überprüfung ob der vom Array hinterlegte Wert, dem 1.Paramter von der Script-Übergabe entspricht.
    Zuvor gelernt: $PIN beinhaltet beim ersten Durchlaufen 22. Es wird also die Variable $GPIO[22] abgerufen - da aber Eckklammern vorhanden sind müssen wir das umschließen: ${GPIO[22]}
    Hier würde dann WW1 ausgegeben werden.
    Wenn also dem Script WW1 übergeben wurde und somit diese Prüfung übereinstimmt; then ... nur dann macht er das innerhalb der if-Schleife:

    Code
    if [ ! -f /sys/class/gpio/gpio${PIN}/value ]; then

    Prüfen ob die Datei NICHT existiert. Das " ! " bedeutet NICHT. " -f " bedeutet FILE. ${PIN} wird durch 22 ersetzt. Wenn also /sys/class/gpio/gpio22/value NICHT existiert; then ...bedeutet dass, das der GPIO noch nicht initialisiert und exportet wurde, also holen wir das hier nach:

    Code
    echo $PIN > /sys/class/gpio/export
    			echo out > /sys/class/gpio/gpio${PIN}/direction
    		fi


    das " fi " schließt die if-Schleife.

    Code
    echo $STATE > /sys/class/gpio/gpio${PIN}/value

    Danach setzen wir den STATE - wir erinnern uns: Wenn wir an das Script "on" übergeben haben beinhaltet $STATE eine 1, ansonsten eine 0

    Code
    fi
    done
    
    
    exit 0

    Die erste if-Schleife schließen.
    Die for-Schleife schließen
    Falls das Script ohne Fehler durchgelaufen ist sollte man es immer mit " exit 0 " beenden, um dem übergeordneten Programm wie crontab zu signalisieren: Alles in Ordnung, keine Fehler aufgeteten

  • Folgende Pi-PIN´s (1 - 26 - nicht GPIO-Nr.) sind mit der Relaiskarte verbunden:
    Pi-Pin........Relaiskarte
    4 an VCC
    6 - GND
    18 - IN1
    % - IN2 nicht bbelegt
    12 - IN3
    16 - IN4
    07 - IN5
    11 - IN6
    15 - IN7
    % - IN8 nicht belegt


    In der Übersicht ist gezeigt wie die Relaisplatte angeschlossenist, alles über den Pi.
    Wie muss ich die Versorgung anschließen wenn ich den Jumper ziehe und die Relaisplatina fremd versorgen will um den Pi zu schonen?

Jetzt mitmachen!

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