Raspberry PI 4 2GB /Bewegungsmelder Inrarot

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
Kla-Sur
User
Beiträge: 15
Registriert: Montag 15. Juni 2020, 14:04

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
Einen schönen Gruß aus dem Münsterland sendet
dir Klaus
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

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.
Benutzeravatar
__blackjack__
User
Beiträge: 13111
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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()
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
hyle
User
Beiträge: 96
Registriert: Sonntag 22. Dezember 2019, 23:19
Wohnort: Leipzig

Mit gpiozero (https://gpiozero.readthedocs.io/en/stab ... ion-sensor) statt RPi.GPIO wäre das ganze übrigens noch einfacher umzusetzen. :wink:
Alles was wir sind ist Sand im Wind Hoschi.
Kla-Sur
User
Beiträge: 15
Registriert: Montag 15. Juni 2020, 14:04

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
Einen schönen Gruß aus dem Münsterland sendet
dir Klaus
Benutzeravatar
hyle
User
Beiträge: 96
Registriert: Sonntag 22. Dezember 2019, 23:19
Wohnort: Leipzig

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.
Alles was wir sind ist Sand im Wind Hoschi.
Kla-Sur
User
Beiträge: 15
Registriert: Montag 15. Juni 2020, 14:04

Danke für deine Antwort Hyle,

was meinst du mit der Bemerkung (wenn es unbedingt RPI.GPIO sein muss)?
Einen schönen Gruß aus dem Münsterland sendet
dir Klaus
Jankie
User
Beiträge: 592
Registriert: Mittwoch 26. September 2018, 14:06

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.
Kla-Sur
User
Beiträge: 15
Registriert: Montag 15. Juni 2020, 14:04

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
Einen schönen Gruß aus dem Münsterland sendet
dir Klaus
Benutzeravatar
__blackjack__
User
Beiträge: 13111
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten