Raspberry Pi zeigt nur eine uhrzeit an

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
Croudzz
User
Beiträge: 1
Registriert: Montag 2. September 2024, 10:11

Hi zusammen,

erstmal kurzes vorwort damit es leichter zu verstehen ist. Ich habe ein Projekt in meinem Ausbildungsbetrieb bekommen, per Magnetschalter eine Überwachung für das Rolltor zu bauen. Ich habe es mittlerweile geschafft, dass bei Statusänderung automatisch in der Commandline eine Nachricht erscheint mit Timestamp und dem Aktuellen Status nur habe ich das Problem, dass sobald der Code gestartet wird sich der Timestamp nicht mehr ändert. Habe ich hier einen Denkfehler? Geht das überhaupt nicht?
Des weiteren, würde ich zeitgleich eine *.txt Datei erstellen mit dem genannten Timestamp und der Statusänderung erzeugen also quasi ein LOG (alle änderungen sollen in die gleiche Datei geschrieben werden) Wie ist das möglich?

Hier der Code:
from datetime import datetime
import signal
import sys
import RPi.GPIO as GPIO

MAGNET_GPIO = 17

jetzt = datetime.now()
datum_zeit = jetzt.strftime("%Y-%m-%d %H:%M:%S")

def signal_handler (sig, frame):
GPIO.cleanup()
sys.exit(0)
def button_callback(channel):
if not GPIO.input(MAGNET_GPIO):
print(f"{datum_zeit}:" "tor offen")
wert = 1
else:
print(f"{datum_zeit}:" "Tor geschlossen")
wert = 0

if __name__ == '__main__':
GPIO.setmode(GPIO.BCM)
GPIO.setup(MAGNET_GPIO, GPIO.IN, pull_up_down=GPIO.PUD_UP)

GPIO.add_event_detect(MAGNET_GPIO, GPIO.BOTH, callback=button_callback, bouncetime=50)

signal.signal (signal.SIGINT, signal_handler)
signal.pause()

Ich hoffe es war halbwegs verständlich und bedanke mich im voraus für die Antworten.
Benutzeravatar
Dennis89
User
Beiträge: 1516
Registriert: Freitag 11. Dezember 2020, 15:13

Hallo,

du wirst hier die gleiche Antwort wie im Raspberry-Forum bekommen.


Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Sirius3
User
Beiträge: 18250
Registriert: Sonntag 21. Oktober 2012, 17:20

Eingerückt wird immer mit 4 Leerzeichen pro Ebene, nicht 8.
`as` bei Import ist zum Umbenennen da, GPIO wird aber gar nicht umbenannt. Das `as` macht also so keinen Sinn, wobei GPIO nach Konvention eigentlich gpio geschrieben sein sollte.
`signal_handler` sollte man nicht verwenden, ein einfaches try-finally wäre hier sowieso viel besser.
Innerhalb von callbacks sollte möglichst wenig passieren, vor allem irgendwelcher IO sollte es da nicht geben; normalerweise setzt ein callback einfach ein Event, das man dann im Hauptprogramm abfragen kann.
In Deinem Fall wieder wäre ein `wait_for_edge` deutlich lesbarer.
Das Hauptprogramm sollte in einer Funktion stehen.
Das ganz sollte also eher so aussehen:

Code: Alles auswählen

from datetime import datetime
import time
import RPi.GPIO as gpio

MAGNET_GPIO = 17

def main():
    try:
        gpio.setmode(gpio.BCM)
        gpio.setup(MAGNET_GPIO, gpio.IN, pull_up_down=gpio.PUD_UP)

        jetzt = datetime.now()
        while True:
            gpio.wait_for_edge(MAGNET_GPIO, gpio.BOTH)
            if not gpio.input(MAGNET_GPIO):
                print(f"{jetzt:%Y-%m-%d %H:%M:%S}:" "tor offen")
            else:
                print(f"{jetzt:%Y-%m-%d %H:%M:%S}:" "Tor geschlossen")
            time.sleep(0.05)
    finally:
        gpio.cleanup()

if __name__ == '__main__':
    main()
Da `jetzt` außerhalb der Schleife gesetzt wird, ändert es sich innerhalb der Schleife auch nicht mehr.
Antworten