Quantcast
Aktuelles
Digital Eliteboard - Das Digitale Technik Forum

Registriere dich noch heute kostenlos, um Mitglied zu werden! Sobald du angemeldet bist, kannst du auf unserer Seite aktiv teilnehmen, indem du deine eigenen Themen und Beiträge erstellst und dich über deinen eigenen Posteingang mit anderen Mitgliedern unterhalten kannst! Zudem bekommst du Zutritt zu Bereichen, welche für Gäste verwehrt bleiben

Registriere dich noch heute kostenlos, um Mitglied zu werden! Sobald du angemeldet bist, kannst du auf unserer Seite aktiv teilnehmen, indem du deine eigenen Themen und Beiträge erstellst und dich über deinen eigenen Posteingang mit anderen Mitgliedern unterhalten kannst! Zudem bekommst du Zutritt zu Bereichen, welche für Gäste verwehrt bleiben

( gelöst ) Relais ansteuern

sralus

Ist oft hier
Registriert
25. April 2010
Beiträge
140
Reaktionspunkte
20
Punkte
38
Hallo
habe ein skript geschrieben welches auch funktioniert aber beim ausschalten stimmt die reinfolge nicht immer.Es ist bestimmt auch nicht 1A programiert ich bin halt neu in dem Bereich.
Evtl. kann das ja jemand abändern bzw.besser aufbauen,.
Besten Dank vorab.
Code:
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
GPIO.setup(26,GPIO.OUT)
GPIO.setup(21,GPIO.OUT)
GPIO.setup(20,GPIO.OUT)
GPIO.setup(19,GPIO.OUT)
GPIO.setup(16,GPIO.OUT)
GPIO.setup(13,GPIO.OUT)
GPIO.setup(4,GPIO.OUT)
chan_list = (26,21)
chan_list2 = (20,19)
chan_list3 = (16,13)
while True:
    if ( GPIO.input(4) == False ): 
        GPIO.output(chan_list, GPIO.HIGH)
    time.sleep(1)
    if ( GPIO.input(4) == False ):
        GPIO.output(chan_list2, GPIO.HIGH)
    time.sleep(1)
    if ( GPIO.input(4) == False ):
        GPIO.output(chan_list3, GPIO.HIGH)
        if not ( GPIO.input(4) == False ):
        GPIO.output(chan_list3, GPIO.OUT)
    time.sleep(1)
    if not ( GPIO.input(4) == False ):
        GPIO.output(chan_list2, GPIO.OUT)
    time.sleep(1)
    if not ( GPIO.input(4) == False ):
        GPIO.output(chan_list, GPIO.OUT)
 
Zuletzt bearbeitet von einem Moderator:
Hi @sralus,
kannst du beschreiben, was du genau vorhast und welcher GPIO-PIN mit welchem Bauteil an welchem PIN verbunden ist? Die Initialisierung vom GPIO-PIN 4 sollte als IN sein; ist doch bestimmt ein Taster-ähnliches Bauteil oder? .. und die mehrfachen if ( GPIO.input(4) == False ) Abfragen; sowie doppelte Verneinungen; kann man bestimmt eleganter lösen. Die GPIO.output findet man so auch nicht in der Doku.
 
Ich habe einen bewegungsmelder am anfang meiner auffahrt .. dieser schaltet ein octocopler relais.. dies schaltet ein GPIO . das wiederum schaltet ein skript welches meine Relais schalten . Die relais schalten je eine Lampe.
Ich habe 6 lampen in meiner aufhart verbaut und diese sollen der reihe nach angehen.
Wenn der bewegungsmelder ausschaltet sollen die Lampen der reieh nach wieder ausgehen.
Das habe ich soweit auch hinbekommen.
Jetzt habe ich am Ende der auffahr noch einen zweiten Bewegungsmelder. Der soll das gleiche machen wie der erste bewegungsmelde (nur umgekehrt)
So ist meine Idee ..
 

Anhänge

Du musst angemeldet sein, um die Anhangsliste zu sehen.
hi,
wenn das hier die Initialisierung vom GPIO-PIN für den Bewegungsmelder ist GPIO.setup(4,GPIO.OUT) .. dann muss der mit GPIO.IN initialisiert werden ... ansonsten ist der Zustand mehr oder weniger zufällig. Jedes Relay würde ich mit einem einzelnen Befehl steuern .. ich habe bis jetzt noch nie gesehen, das man der output-Funktion eine Liste übergeben und als Zustand nutze GPIO.LOW und GPIO.HIGH und nicht GPIO.OUT/GPIO.IN .. auch wenn intern beide Varianten auf "0" und "1" zurückfallen; macht es aber einfacher zu verstehen.
 
Hi Danke für deine Erklärung
Hab es jetzt so geschrieben:
#!/usr/bin/env python
#coding: utf8
import time
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
GPIO.setup(4, GPIO.IN, pull_up_down = GPIO.PUD_UP)
GPIO.setup(26,GPIO.OUT)
GPIO.setup(21,GPIO.OUT)
GPIO.setup(20,GPIO.OUT)
GPIO.setup(19,GPIO.OUT)
GPIO.setup(16,GPIO.OUT)
GPIO.setup(13,GPIO.OUT)

channel = 4
GPIO.add_event_detect(channel, GPIO.BOTH, bouncetime = 2000)

while 1:
if GPIO.input(channel) == GPIO.IN:
GPIO.output(13, GPIO.HIGH)
GPIO.output(19, GPIO.HIGH)
time.sleep(1)
GPIO.output(16, GPIO.HIGH)
GPIO.output(26, GPIO.HIGH)
time.sleep(1)
GPIO.output(20, GPIO.HIGH)
GPIO.output(21, GPIO.HIGH)
if not GPIO.input(channel) == GPIO.IN:
GPIO.output(21, GPIO.LOW)
GPIO.output(20, GPIO.LOW)
time.sleep(1)
GPIO.output(26, GPIO.LOW)
GPIO.output(16, GPIO.LOW)
time.sleep(1)
GPIO.output(19, GPIO.LOW)
GPIO.output(13, GPIO.LOW)
 
Zuletzt bearbeitet:
Hi,

so grob könnte es aussehen ... muss natürlich noch Finetuning ran .. vor allem der Bewegungsmelder muss noch sauber abgefragt werden.

Python:
#!/usr/bin/env python
#coding: utf8
import time
import RPi.GPIO as GPIO

channel = 4

GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
GPIO.setup(channel, GPIO.IN, pull_up_down = GPIO.PUD_UP)
GPIO.setup(26,GPIO.OUT)
GPIO.setup(21,GPIO.OUT)
GPIO.setup(20,GPIO.OUT)
GPIO.setup(19,GPIO.OUT)
GPIO.setup(16,GPIO.OUT)
GPIO.setup(13,GPIO.OUT)


# Status der Relays setzen
GPIO.output(26,GPIO.HIGH)
GPIO.output(21,GPIO.HIGH)
GPIO.output(20,GPIO.HIGH)
GPIO.output(19,GPIO.HIGH)
GPIO.output(16,GPIO.HIGH)
GPIO.output(13,GPIO.HIGH)

GPIO.add_event_detect(channel, GPIO.BOTH, bouncetime = 2000)

lastState = 0
while True:

    state = GPIO.input(channel)

    # Wenn sich nichts am Melder getan hat,
    # dann kurz schlafen und den Melder direkt wieder abfragen
    if lastState == state:
        time.sleep(0.5)
        next

    # aktuellen Status merken
    lastState = state

    if state == 1:
        GPIo_Output(13, GPIO.LOW)
        GPIo_Output(19, GPIO.LOW)
        time.sleep(1)
        GPIo_Output(16, GPIO.LOW)
        GPIo_Output(26, GPIO.LOW)
        time.sleep(1)
        GPIo_Output(20, GPIO.LOW)
        GPIo_Output(21, GPIO.LOW)
    else:
        GPIo_Output(21, GPIO.HIGH)
        GPIo_Output(20, GPIO.HIGH)
        time.sleep(1)
        GPIo_Output(26, GPIO.HIGH)
        GPIo_Output(16, GPIO.HIGH)
        time.sleep(1)
        GPIo_Output(19, GPIO.HIGH)
        GPIo_Output(13, GPIO.HIGH)
 
Zuletzt bearbeitet:
hi
ich bekomm den fehler ´:
File "ok.py", line 31
lastState = state
^
IndentationError: unindent does not match any outer indentation level
 
Traceback (most recent call last):
File "ok.py", line 34, in <module>
state = GPIO.input(switch)
NameError: name 'switch' is not defined

muss da die 4 rein ?

Danke !
Funktioniert ...
Code:
#!/usr/bin/env python
#coding: utf8
import time
import RPi.GPIO as GPIO

channel = 4

GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
GPIO.setup(channel, GPIO.IN, pull_up_down = GPIO.PUD_UP)
GPIO.setup(26,GPIO.OUT)
GPIO.setup(21,GPIO.OUT)
GPIO.setup(20,GPIO.OUT)
GPIO.setup(19,GPIO.OUT)
GPIO.setup(16,GPIO.OUT)
GPIO.setup(13,GPIO.OUT)


# Status der Relays setzen
GPIO.output(26,GPIO.HIGH)
GPIO.output(21,GPIO.HIGH)
GPIO.output(20,GPIO.HIGH)
GPIO.output(19,GPIO.HIGH)
GPIO.output(16,GPIO.HIGH)
GPIO.output(13,GPIO.HIGH)

GPIO.add_event_detect(channel, GPIO.BOTH, bouncetime = 2000)

lastState = 0
while True:

    state = GPIO.input(4)

    # Wenn sich nichts am Melder getan hat,
    # dann kurz schlafen und den Melder direkt wieder abfragen
    if lastState == state:
        time.sleep(0.5)
        next

    # aktuellen Status merken
    lastState = state

    if state == 1:
        GPIO.output(13, GPIO.LOW)
        GPIO.output(19, GPIO.LOW)
        time.sleep(1)
        GPIO.output(16, GPIO.LOW)
        GPIO.output(26, GPIO.LOW)
        time.sleep(1)
        GPIO.output(20, GPIO.LOW)
        GPIO.output(21, GPIO.LOW)
    else:
        GPIO.output(21, GPIO.HIGH)
        GPIO.output(20, GPIO.HIGH)
        time.sleep(1)
        GPIO.output(26, GPIO.HIGH)
        GPIO.output(16, GPIO.HIGH)
        time.sleep(1)
        GPIO.output(19, GPIO.HIGH)
        GPIO.output(13, GPIO.HIGH)
 
Wie könnte ich jetzt noch dazu einen zweiten bewegungsmelder einbauen ?
also GPIO 4 schaltet den einen und GPIO 22 soll den anderen Bewegunsmelder schalten.
Die Relais sollen dann genau andersherum schalten....
 
Hi,
du kannst den zweiten Bewegungsmelder direkt hinter dem anderen abfragen lassen und musst dir den entsprechenden Status in einer neuen Variable merken; auch den letzten Status vom zweiten Melder muss du dir merken.
Dann muss man entscheiden, welcher Status hat mehr Priorität ... ... also, was soll zB passieren, wenn beide Bewegungsmelder "Aktivität" signalierisen ... bleiben die Lampen an oder gehen die aus ...
 
Hi
Danke für deine Info …
Bin schonmal angefangen aber leider fehlt mir das nötige wissen für den entsprechenden Status in einer neuen Variable. zudem soll der erst geschaltete Bewegungsmelder Priorität haben.... Wenn du zeit und lust findest kannst du mir ja evtl. dabei helfen .. bzw. mir einen ansatz geben auf dem ich weiter aufbauen kann..

Beste Grüß
Code:
#!/usr/bin/env python
#coding: utf8
import time
import RPi.GPIO as GPIO

channel = 17
channel2 = 4
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
GPIO.setup(channel, GPIO.IN, pull_up_down = GPIO.PUD_UP)
GPIO.setup(channel2, GPIO.IN, pull_up_down = GPIO.PUD_UP)
GPIO.setup(26,GPIO.OUT)
GPIO.setup(21,GPIO.OUT)
GPIO.setup(20,GPIO.OUT)
GPIO.setup(19,GPIO.OUT)
GPIO.setup(16,GPIO.OUT)
GPIO.setup(13,GPIO.OUT)


# Status der Relays setzen
GPIO.output(26,GPIO.LOW)
GPIO.output(21,GPIO.LOW)
GPIO.output(20,GPIO.LOW)
GPIO.output(19,GPIO.LOW)
GPIO.output(16,GPIO.LOW)
GPIO.output(13,GPIO.LOW)

GPIO.add_event_detect(channel, GPIO.BOTH, bouncetime = 2000)
GPIO.add_event_detect(channel2, GPIO.BOTH, bouncetime = 2000)
lastState = 0
while True:

    state = GPIO.input(channel)

    # Wenn sich nichts am Melder getan hat,
    # dann kurz schlafen und den Melder direkt wieder abfragen
    if lastState == state:
        time.sleep(0.5)
        next

    # aktuellen Status merken
    lastState = state

    if state == 1:
        GPIO.output(13, GPIO.HIGH)
        GPIO.output(19, GPIO.HIGH)
        time.sleep(0.5)
        GPIO.output(16, GPIO.HIGH)
        GPIO.output(26, GPIO.HIGH)
        time.sleep(1)
        GPIO.output(20, GPIO.HIGH)
        GPIO.output(21, GPIO.HIGH)
    else:
        GPIO.output(21, GPIO.LOW)
        GPIO.output(20, GPIO.LOW)
        time.sleep(1)
        GPIO.output(26, GPIO.LOW)
        GPIO.output(16, GPIO.LOW)
        time.sleep(0.5)
        GPIO.output(19, GPIO.LOW)
        GPIO.output(13, GPIO.LOW)
   

lastState2 = 1
while True:
   
   state2 = GPIO.input(channel2)
 
   # Wenn sich nichts am Melder getan hat,
   # dann kurz schlafen und den Melder direkt wieder abfragen
   if lastState2 == state2:
       time.sleep(0.5)
       next

    # aktuellen Status merken
   lastState2 = state2
   if state2 == 1:
        GPIO.output(21, GPIO.HIGH)
        GPIO.output(20, GPIO.HIGH)
        time.sleep(0.5)
        GPIO.output(16, GPIO.HIGH)
        GPIO.output(26, GPIO.HIGH)
        time.sleep(1)
        GPIO.output(19, GPIO.HIGH)
        GPIO.output(13, GPIO.HIGH)
   else:
        GPIO.output(19, GPIO.LOW)
        GPIO.output(13, GPIO.LOW)
        time.sleep(1)
        GPIO.output(26, GPIO.LOW)
        GPIO.output(16, GPIO.LOW)
        time.sleep(0.5)
        GPIO.output(21, GPIO.LOW)
        GPIO.output(20, GPIO.LOW)
 
Zuletzt bearbeitet von einem Moderator:
Hi ...
du musst alles in der ersten while Schleife machen ... weil die 2. while Schleife nie verwendet wird ... die erste while Schleife wird nie verlassen und läuft quasi unendlich
 
Hi !!!
Leider bekomm ich das nicht hin ..
So habe ich es bisher geschrieben aber klappt nicht so wie es soll ...
Beste Grüße
Code:
#!/usr/bin/env python
#coding: utf8
import time
import RPi.GPIO as GPIO

channel = 17
beweg = 4
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
GPIO.setup(channel, GPIO.IN, pull_up_down = GPIO.PUD_UP)
GPIO.setup(beweg, GPIO.IN, pull_up_down = GPIO.PUD_UP)
GPIO.setup(26,GPIO.OUT)
GPIO.setup(21,GPIO.OUT)
GPIO.setup(20,GPIO.OUT)
GPIO.setup(19,GPIO.OUT)
GPIO.setup(16,GPIO.OUT)
GPIO.setup(13,GPIO.OUT)


# Status der Relays setzen
GPIO.output(26,GPIO.LOW)
GPIO.output(21,GPIO.LOW)
GPIO.output(20,GPIO.LOW)
GPIO.output(19,GPIO.LOW)
GPIO.output(16,GPIO.LOW)
GPIO.output(13,GPIO.LOW)
lastState = 1
lastState2 = 1
while True:

    state = GPIO.input(channel)
    state2 = GPIO.input(beweg)
    # Wenn sich nichts am Melder getan hat,
    # dann kurz schlafen und den Melder direkt wieder abfragen
    if lastState != state & lastState2 == state2:
    time.sleep(0.5)
        next
    # aktuellen Status merken
    lastState = state
    lastState2 = state2
   
    if state != 1:
        GPIO.output(13, GPIO.LOW)
        GPIO.output(19, GPIO.LOW)
        time.sleep(0.5)
        GPIO.output(16, GPIO.LOW)
        GPIO.output(26, GPIO.LOW)
        time.sleep(1)
        GPIO.output(20, GPIO.LOW)
        GPIO.output(21, GPIO.LOW)
    if state2 == 1:
        GPIO.output(13, GPIO.LOW)
        GPIO.output(19, GPIO.LOW)
        time.sleep(0.5)
        GPIO.output(16, GPIO.LOW)
        GPIO.output(26, GPIO.LOW)
        time.sleep(1)
        GPIO.output(20, GPIO.LOW)
        GPIO.output(21, GPIO.LOW)
    else:
     if state != 1:
        GPIO.output(13, GPIO.HIGH)
        GPIO.output(19, GPIO.HIGH)
        time.sleep(0.5)
        GPIO.output(16, GPIO.HIGH)
        GPIO.output(26, GPIO.HIGH)
        time.sleep(1)
        GPIO.output(20, GPIO.HIGH)
        GPIO.output(21, GPIO.HIGH)        
    if state2 == 1:
        GPIO.output(13, GPIO.HIGH)
        GPIO.output(19, GPIO.HIGH)
        time.sleep(0.5)
        GPIO.output(16, GPIO.HIGH)
        GPIO.output(26, GPIO.HIGH)
        time.sleep(1)
        GPIO.output(20, GPIO.HIGH)
        GPIO.output(21, GPIO.HIGH)
 
Zuletzt bearbeitet von einem Moderator:
Zurück
Oben