Seite 1 von 1

Raspberry PI 4 2GB /Bewegungsmelder Inrarot

Verfasst: Dienstag 16. Juni 2020, 10:38
von Kla-Sur
Hallo bin neu hier. Habe gerade Phyton für mich entdeckt und versuche mich daran. Habe gerade einen Versuch
mit einem Beispielprogramm gestartet und komme da irendwie nicht weiter :

#!/usr/bin/python
# coding=utf-8
import time,sys
import RPi.GPIO as GPIO

GPIO.setmode(GPIO.Board)
GPIO.setup(7,GPIO.IN, pull_up_down=GPIO.PUD_DOWN)

def motion(pin):
print ("Achtung!Bewegung erkannt!")
return

GPIO.add_event_detect(7, GPIO.RISINGI)
GPIO.add_event_callback(7, motion)

# mit minimaler CPU-Auslastung auf das Prog -End STRG-C

try:
while True:
time.sleep(0.5
# except KeyboardInterrupt :
# GPIO.cleanup()
sys.exit()

Die Fehlermeldung lautet :

Traceback (most recent call last):
File "/home/pi/Bewegungsmelder.py", line 23
sys.exit()
^
SyntaxError: invalid syntax

Es sollte doch eigentlich die Meldung kommen
Achtung!Bewegung erkannt!

Wo liegt hier der Fehler ?

mfg Klaus

Re: Raspberry PI 4 2GB /Bewegungsmelder Inrarot

Verfasst: Dienstag 16. Juni 2020, 11:06
von Sirius3
Zähl mal Deine Klammern.

Das sys.exit ist eh überflüssig. Warum hast Du cleanup auskommentiert? Das solle übrigens immer aufgerufen werden, nicht nur, wenn das Programm per STRG+C abgebrochen wird.
Python2 solltest du nicht mehr benutzen.

Re: Raspberry PI 4 2GB /Bewegungsmelder Inrarot

Verfasst: Dienstag 16. Juni 2020, 13:36
von __blackjack__
@Kla-Sur: Weitere Anmerkungen:

``as`` beim Importieren ist zum umbenennen gedacht, `GPIO` wird aber gar nicht umbenannt.

Auf Modulebene sollte nur Code stehen der Konstanten, Funktionen, und Klassen definiert. Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst.

`GPIO` kennt weder `Board` noch `RISINGI` als Attribute. Beim ersten ist wahrscheinlich `BOARD` gemeint und beim zweiten das `I` am Ende zu viel.

Die Rückruffunktion kann man auch gleich bei `add_event_detect()` übergeben.

Der Kommentar mit minimaler CPU-Auslastung ist falsch, denn auch die ``while``-Schleife mit dem `sleep()` verbraucht CPU-Zeit. Und es geht mit weniger CPU-Zeit: `signal.pause()`.

Das ``return`` in der `motion()`-Funktion ist überflüssig.

Code: Alles auswählen

#!/usr/bin/env python3
from signal import pause

from RPi import GPIO


def on_motion(_pin):
    print("Achtung! Bewegung erkannt!")


def main():
    GPIO.setmode(GPIO.BOARD)
    GPIO.setup(7, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
    GPIO.add_event_detect(7, GPIO.RISING, on_motion)
    #
    # Mit minimaler CPU-Auslastung auf das Programmende durch STRG-C warten.
    #
    try:
        pause()
    except KeyboardInterrupt:
        pass
    finally:
        GPIO.cleanup()


if __name__ == "__main__":
    main()

Re: Raspberry PI 4 2GB /Bewegungsmelder Inrarot

Verfasst: Mittwoch 17. Juni 2020, 17:03
von hyle
Mit gpiozero (https://gpiozero.readthedocs.io/en/stab ... ion-sensor) statt RPi.GPIO wäre das ganze übrigens noch einfacher umzusetzen. :wink:

Re: Raspberry PI 4 2GB /Bewegungsmelder Inrarot

Verfasst: Freitag 10. Juli 2020, 14:16
von Kla-Sur
Hallo habe wieder gebastelt und jetzt komme ich nicht weiter.
Da brauche ich mal eure Hilfe!

import RPi.GPIO as gpio
gpio.setmode(gpio.BOARD)

gpio.setup(11, gpio.IN )
status = gpio.input(11)
gpio.wait_for_edge(11,gpio.FALLING)
print(status)
gpio.cleanup(11)

Jetzt möchte ich bei Wechsel eine Mail versenden

import smtplib, sys
from email.mime.text import MIMEText
from email.header import Header

frm = "absender"
to = "empfänger"
subj = "Betr"
msg = "Meldung"


try:
mime = MIMEText(msg, "plain", "utf-8")
mime["From"] = frm
mime["to"] = to
mime["Subject"] = Header(subj, "utf-8")

smtp = smtplib.smtp("mailserver")
smtp.starttls()
smtp.login("Anmeldung")
smtp.sendmail(frm, [to], mime.as_string())
smtp.quit()
except:
print("Beim Mail Versandt in ein Fehler aufgetreten", sys.exc_info())

Die einzelnen Scripte klappen schon , aber wie kann ich die zwei zusammenstellen !!

Dank schon jetzt.

Klaus

Re: Raspberry PI 4 2GB /Bewegungsmelder Inrarot

Verfasst: Samstag 11. Juli 2020, 14:50
von hyle
Du willst ein callback verwenden und die Mail-Geschichte in eine Funktion schreiben. https://sourceforge.net/p/raspberry-gpi ... ki/Inputs/ (wenn es unbedingt RPi.GPIO sein muss)

Btw. Verwende bitte in Zukunft Codeblocks (</>), dann bleiben auch die Einrückungen erhalten.

Re: Raspberry PI 4 2GB /Bewegungsmelder Inrarot

Verfasst: Mittwoch 15. Juli 2020, 09:42
von Kla-Sur
Danke für deine Antwort Hyle,

was meinst du mit der Bemerkung (wenn es unbedingt RPI.GPIO sein muss)?

Re: Raspberry PI 4 2GB /Bewegungsmelder Inrarot

Verfasst: Mittwoch 15. Juli 2020, 09:48
von Jankie
hyle hat geschrieben: Mittwoch 17. Juni 2020, 17:03 Mit gpiozero (https://gpiozero.readthedocs.io/en/stab ... ion-sensor) statt RPi.GPIO wäre das ganze übrigens noch einfacher umzusetzen. :wink:
Das meint er damit. Das Modul gpiozero wird heutzutage eher genutzt als RPi.GPIO.

Re: Raspberry PI 4 2GB /Bewegungsmelder Infrarot

Verfasst: Mittwoch 15. Juli 2020, 16:19
von Kla-Sur
Das ist doch wieder Schei.... Da lernste laut Buch und bist froh das mal was geklappt hat und dann ist das grade erlernte schon "alt".
Danke Jankie

Re: Raspberry PI 4 2GB /Bewegungsmelder Inrarot

Verfasst: Mittwoch 15. Juli 2020, 19:31
von __blackjack__
@Kla-Sur: Das ist im Computerbereich eigentlich schon immer so gewesen. Sowohl die Technik als auch die Software entwickelt sich weiter. Und aus Fehlern lernt man. `gpiozero` ist in der Regel einfacher und trotzdem etwas ”mächtiger” als `RPi.GPIO`. Die haben da auf die Benutzer, insbesondere auch die Zielgruppe der Anfänger, geschaut, und was sie für die besser machen können.