Hallo,
leider bekomme ich jede Minute einen Alarm, obwohl die Lichtschranke gar
nicht schließt.
Hier ist mein Code. Für nen Tipp wäre ich dankbar, da ich grad den Wald
vor lauter Bäumen nicht sehe...
1
#!/usr/bin/env python
2
# -*- coding: utf-8 -*-
3
importRPi.GPIOasGPIO
4
importsmtplib
5
importtime
6
BtnPin=11
7
Gpin=12
8
Rpin=13
9
fromaddr='xxx@googlemail.com'
10
toaddrs='xxx@googlemail.com'
11
msg="""From: Raspberry Pi Alarmsystem
12
To: xxx@googlemail.com
13
Subject: Die Lichtschranke wurde unterbrochen
14
Achtung: Ihre Lichtschranke wurde unterbrochen, bitte pruefen sie die Ursache!
Hallo,
was passiert denn, wenn du in "detect" mal alles sein lässt und
stattdessen dort einfach mal etwas ausgibtst?
Alternativ weiß ich auch nicht ganz genau, was das
"GPIO.setup(BtnPin..." tut, wenn man einen Pull-Up-Widerstand extern
eingebaut hat (hast du ja laut dem Bild) und gleichzeitig noch den im
Chip einschaltet. Also "pull_up_down" ggf. mal weglassen.
Versuch es erstmal mit einem Schalter, anstatt einer Lichtschranke.
Warum GPIO.BOTH? Was soll das time.sleep(60) in der SendMail()-Funktion?
Wenn man mit Python arbeitet, sollte man mal ein Tutorial über OOP
lesen, das macht es übersichtlicher.
Hallo,
danke für die Antworten. Ich habe bisher noch nichts mit Python gemacht
und diesen Code aus verschiedenen Teilen im Internet
zusammengeschustert. Wenn etwas schlecht daran ist, bitte ich um
Verbesserungsvorschläge oder Tipps zu guten Tutorials.
Die 60 Sekunden hatte ich nur eingefügt, da ich nicht ständig eine
Email-Benachrichtigungen bekommen wollte. Ich habe nun gemerkt, dass
dies ein einer schlechten Verbindung gelegen hat und nicht am Code.
Zudem hab ich nun den Eingang der Lichtschranke mit einem Pulldown
Widerstand belegt und nun bekomme ich (meist) wirklich nur noch eine
Benachrichtigung, wenn der die Schranke schließt.
Aktuelle Probleme:
1. Beim Unterbrechen der Lichtschranke erhalte ich innerhalb der ersten
Millisekunden mehrfach die Info, dass die Lichtschranke durchbrochen
wurde.
Wie bekomme ich dieses "prellen" raus?
2. Zudem möchte ich mich dagegen absichern, wenn die Lichtschranke
dauernd geschlossen ist (also kaputt ist oder wer was dazwischen
stellt). Auch in diesem Fall möchte ich eine Benachrichtigung erhalten.
(....Ich habe dies ansatzweise so gemacht, dass ich in der
Interrupt-Funktion eine while Schleife eingebaut habe, so dass man erst
1min warten musste, und dann nochmals prüfte, dass hat aber nicht
hingehauen)
sunshineh schrieb:> nur noch eine Lösung für den Dauerkontakt
Dafür verwendet man einen Timeout oder Watchdog.
Was willst Du wann im Falle des Dauerkontaktes machen bzw. auslösen?
Hallo,
sunshineh schrieb:> Das mit dem Prellen habe ich raus, habe die Bouncetime auf 2000 erhöht> nun bräuchte ich nur noch eine Lösung für den Dauerkontakt.
in deiner loop(), die im übrigen sowieso ein time.sleep(1) enthalten
sollte (schau dir mal die Prozessorauslastung an wenn dein Programm
läuft) fragst du den Zustand des Eingangs noch mal ab. Wenn der Eingang
aktiv ist erhöhst du einen Zähler, wenn der Eingang inaktiv ist setzt du
den Zähler auf Null. Erreicht der Zähler z.B. 10 dann ist der Eingang
schon 10s aktiv und du kannst dein gewünschtest Ereignis (Mail)
auslösen.
Sascha
Also nun bin ich schonmal soweit, dass ich in der Main die SleepTime
eingebunden habe. Nun dachte ich mir, dass ich jedesmal dort den Zustand
der Lichtschranke abfrage und in einer Variablen hochzähle
Er hält cnt für eine lokale Variable in cntUnterbrochen(), weil er's
nicht besser weiß. Das gibt natürlich Ärger (uninitialisierte Variable).
"global cnt" am Anfang der Funktion klärt das Mißverständnis auf.