Zwei Scripts verbinden

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
DrakMission
User
Beiträge: 3
Registriert: Samstag 15. Januar 2022, 18:39

Guten Tag,

ich habe zwei Scripts welche ich gerne verbinden möchte.

Das eine Script fragt einen Bewegungsmelder ab und gibt mir eine Information, wenn sich etwas bewegt.
Das zweite Script lässt eine LED für eine Sekunde brennen.
Nun würde ich gerne, dass bei einer Bewegung die LED leuchtet.
Wie kann ich diese zwei Codes verbinden?

Bewegungsmelder:

Code: Alles auswählen

import RPi.GPIO as GPIO
import time
import datetime

 
print ("BEWEGUNGSMELDER")
print ("")
 
#Board Mode: Angabe der Pin-Nummer
GPIO.setmode(GPIO.BOARD)
 
#GPIO Pin definieren fuer den Dateneingang vom Sensor
PIR_GPIO = 8
GPIO.setup(PIR_GPIO,GPIO.IN)

read=0
wait=0
 
try:  
 #PIR auslesen
 while GPIO.input(PIR_GPIO)==1:
   read=0
 print ("WARTEN auf Bewegung...")
 
 #Abbruch ctrl+c
 while True : 
   #PIR auslesen
   read = GPIO.input(PIR_GPIO)
   
   if read==1 and wait==0:
       
     print ("ALARM %s: Bewegung erkannt!" % datetime.datetime.now()) 
     wait=1
 
   elif read==0 and wait==1: 
     print ("WARTEN auf Bewegung...") 
     wait=0
 
 time.sleep(0.01)
 
except KeyboardInterrupt:
 print ("Beendet")
 GPIO.cleanup()
LED:

Code: Alles auswählen

import RPi.GPIO as GPIO
import time
LED_PIN = 17
GPIO.setmode(GPIO.BCM)
GPIO.setup(LED_PIN, GPIO.OUT)
GPIO.output(LED_PIN, GPIO.HIGH)
time.sleep(1)
GPIO.output(LED_PIN, GPIO.LOW)
GPIO.cleanup()
DrakMission
User
Beiträge: 3
Registriert: Samstag 15. Januar 2022, 18:39

um ein Problem zu umgehen, habe ich einen anderen Code für den Bewegungsmelder genommen.

Code: Alles auswählen

import RPi.GPIO as GPIO
import time
import subprocess
import sys
sys.tracebacklimit=0
LED_PIN = 17 
SENSOR_PIN = 27

 
GPIO.setmode(GPIO.BCM)
GPIO.setup(SENSOR_PIN, GPIO.IN)
 
def mein_callback(channel):
 
 print ("Bewegung")                                                                                                                                                                                                                                                            


try:
    GPIO.add_event_detect(SENSOR_PIN , GPIO.RISING, callback=mein_callback)
    while True:
        time.sleep(100)
except KeyboardInterrupt:
    print ("Beende...")
GPIO.cleanup()
Dieser funktioniert soweit.
Wie führe ich jetzt nach jeder Bewegung den LED code aus statt print bewegung?
Benutzeravatar
sparrow
User
Beiträge: 4187
Registriert: Freitag 17. April 2009, 10:28

Zu dem GPIO-Code wird sicher noch jemand etwas sagen, weil der nicht stabil aussieht.
Grundsätzlich: Was hindert dich denn daran, die entsprechenden Zeilen, die ausgeführt werden, einfach an die Stelle zu kopieren? Oder noch besser, die Aufgaben in Funktionen zu kapseln?
DrakMission
User
Beiträge: 3
Registriert: Samstag 15. Januar 2022, 18:39

sparrow hat geschrieben: Samstag 15. Januar 2022, 22:24 Zu dem GPIO-Code wird sicher noch jemand etwas sagen, weil der nicht stabil aussieht.
Grundsätzlich: Was hindert dich denn daran, die entsprechenden Zeilen, die ausgeführt werden, einfach an die Stelle zu kopieren? Oder noch besser, die Aufgaben in Funktionen zu kapseln?
ich hatte es versucht direkt einzubinden bekam aber immer ein Fehler, hab ihn aber gerade gefunden und jetzt funktioniert es :D
Benutzeravatar
Dennis89
User
Beiträge: 1153
Registriert: Freitag 11. Dezember 2020, 15:13

Hallo,

wesentlich einfacher/übersichtlicher und meiner Meinung nach auch schöner geht das mit gpiozero:
https://gpiozero.readthedocs.io/en/stable/

'as' ist zum umbenennen da, du nennst 'GPIO' in 'GPIO' um. Dann sollte auf Modulebene nur Code stehen, der Konstanten, Funktionen oder Klassen definiert und kein ausführbarer Code.
Einrückungen sind immer 4 Leerzeichen.
Anstelle von deiner Schleife könntest du 'signal.pause()' aufrufen. 'cleanup' gehört in einen 'finally'-Block, damit das immer aufgerufen wird, wenn das Programm, auf welchen Weg auch immer, beendet wird.

Ungetestet:

Code: Alles auswählen

#!/usr/bin/env python3

from functools import partial
from signal import pause

from gpiozero import LED, MotionSensor

MOTION_SENSOR_PIN = 17
LED_PIN = 27


def controll_led(motion_signal):
    motion_signal.blink(on_time=0.5, off_time=0.5, n=3)


def main():
    motion_sensor = MotionSensor(MOTION_SENSOR_PIN)
    motion_signal = LED(LED_PIN)
    motion_sensor.when_motion = partial(controll_led, motion_signal)
    pause()


if __name__ == "__main__":
    main()
Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Antworten