Raspberry Pi mit langen Tastendruck herunterfahren

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Dein System hat Python 3.4, also ist auch das apt-Paket für Python 3.4.
Dogma2k
User
Beiträge: 20
Registriert: Donnerstag 25. Februar 2021, 15:15

Also muss ich "sudo apt install python3.8-rpi.gpio" statt "sudo apt install python3-rpi.gpio" machen? Weil ich ja 3.8 nachinstalliert hab?
Dogma2k
User
Beiträge: 20
Registriert: Donnerstag 25. Februar 2021, 15:15

Ich glaub jetzt weiß ich wieder warum ich früher Abstand von Linux genommen hatte. Ich bekomme es nicht mal hin für die nach installierte python 3.8 die RPi Module zu installieren weil es keine python3.8-rpi.gpio gibt mit dem o.g. Befehl.

Kann mir da jemand mal unter die Arme greifen bitte, das wäre echt super
Benutzeravatar
Dennis89
User
Beiträge: 1124
Registriert: Freitag 11. Dezember 2020, 15:13

Hallo,

ich habe den Überblick verloren, was du jetzt alles installiert hast. Was bekommst du im Terminal für eine Ausgabe wenn du 'pip3 install RPi.GPIO' eingibst?
Alternativ:
sudo apt-get install python-rpi.gpio python3-rpi.gpio

Das habe ich von https://sourceforge.net/p/raspberry-gpi ... i/install/
Dort steht auch, das Raspbian das Modul eigentlich schon vorinstalliert hat.
Habe das gerade auf einem frischen Raspberry-Pi OS mit dem Programm von Sirus3 getestet. Es funktioniert, ich musste kein Modul nachinstallieren. Habe auch kein Python hin und her installiert.

Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Dogma2k: Der Alias gilt für die Bash in der er gesetzt ist. Wenn Du mit ``sudo`` ausführst wird das mit einer Shell von dem Benutzer ausgeführt den Du zum Ausführen benutzt und *dessen* ``.bashrc`` wird verwendet. Und ich würde beim `root`-Benutzer nicht ``python`` per Alias auf irgendetwas anderes umbiegen. Das würde ich nicht mal für einen regulären Benutzer machen.

Ich würde an Deiner Stelle wirklich als erstes mal schauen welches Linux da in welcher Version installiert ist und ob das überhaupt noch unterstützt wird und ggf. das System aktualisieren. Also nicht das alte System auf seinen aktuellsten Stand bringen, sondern das System selbst auf einen neueren Stand bringen.

Ansonsten ist `RPi.GPIO` halt nicht für Python 3.8 installiert. Wie hast Du das denn installiert? Wenn das nicht aus den Paketquellen von der Linuxdistribution kommt, dann wird man auch `RPi.GPIO` dafür nicht über ``apt`` installieren können.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Dogma2k
User
Beiträge: 20
Registriert: Donnerstag 25. Februar 2021, 15:15

@_blackjack_
Ich hab eben mit "cat /etc/os-release" die Version ausgelesen es ist Linux 8 (Jessi) denke das sagt dir mehr als mir...

Zur installation von python 3.8 bin ich so vorgegangen
1. sudo apt update && sudo apt upgrade
2. wget https://www.python.org/ftp/python/3.8.0 ... 8.0.tar.xz
3. tar xf Python-3.8.0.tar.xz
4. cd Python-3.8.0
5. ./configure
6. make -j -l 4
7. sudo make altinstall
Dogma2k
User
Beiträge: 20
Registriert: Donnerstag 25. Februar 2021, 15:15

Ich hab jetzt auf den RPi ein Linux 10 am laufen. Hier ist schon ein python 3.7.3 drauf
ich habe soweit alles wieder mit dem script von der 1. Seite fertig gemacht. Wenn ich jetzt aber mit -> sudo python3 /home/pi/shutdown_btn.py das script starten tue kommt zwar keine fehler Meldung es passiert aber auch nichts weiter. Es kommt einfach eine neue Zeile ohne
pi@.....
Was stimmt jetzt wieder nicht :shock:
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Dogma2k: Was hättest Du denn erwartet was passiert? Das Programm läuft halt.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Benutzeravatar
Dennis89
User
Beiträge: 1124
Registriert: Freitag 11. Dezember 2020, 15:13

Dogma2k hat geschrieben: Freitag 26. Februar 2021, 19:12 Was stimmt jetzt wieder nicht :shock:
Glückwunsch und jetzt halte deinen Button gedrückt und sieh wie das Programm seinen Job übernimmt 8)

Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Dogma2k
User
Beiträge: 20
Registriert: Donnerstag 25. Februar 2021, 15:15

Dennis89 hat geschrieben: Freitag 26. Februar 2021, 19:39
Dogma2k hat geschrieben: Freitag 26. Februar 2021, 19:12 Was stimmt jetzt wieder nicht :shock:
Glückwunsch und jetzt halte deinen Button gedrückt und sieh wie das Programm seinen Job übernimmt 8)

Grüße
Dennis
__blackjack__ hat geschrieben: Freitag 26. Februar 2021, 19:27 @Dogma2k: Was hättest Du denn erwartet was passiert? Das Programm läuft halt.
Ok nur leider passiert nichts wenn ich den GPIO5 mit dem GND verbinde nichts egal ob ich öffner oder schließer simuliere also scheid es doch nicht zu laufen wenn der RPi nicht reagiert
Dogma2k
User
Beiträge: 20
Registriert: Donnerstag 25. Februar 2021, 15:15

Nochmal eine Ergänzung,
wenn ich den RPi neu starte und "ps -ef | grep python3" eingebe sehe ich den Dienst laufen

root 426 410 0 21:31 ? 00:00:00 /bin/sh -c /usr/bin/python3 /home/pi/shutdown_btn.py
root 427 426 1 21:31 ? 00:00:00 /usr/bin/python3 /home/pi/shutdown_btn.py

pi 744 1 8 21:31 ? 00:00:01 /usr/bin/python3 /usr/bin/blueman-applet
pi 748 1 5 21:31 ? 00:00:01 /usr/bin/python3 /usr/share/system-config-printer/applet.py
root 1025 1 2 21:31 ? 00:00:00 /usr/bin/python3 /usr/lib/blueman/blueman-mechanism
pi 1299 1218 0 21:31 pts/0 00:00:00 grep --color=auto python3

Wenn ich den GPIO5 mit GND verbinde dann ist der Dienst weg

pi 744 1 2 21:31 ? 00:00:01 /usr/bin/python3 /usr/bin/blueman-applet
pi 748 1 1 21:31 ? 00:00:01 /usr/bin/python3 /usr/share/system-config-printer/applet.py
pi 1321 1218 0 21:33 pts/0 00:00:00 grep --color=auto python3

Hat jemand ein Erklärung?
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Dogma2k: Leite Standard- und Fehlerausgabe in eine Datei um und schau da nach was ausgegeben wird.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Dogma2k
User
Beiträge: 20
Registriert: Donnerstag 25. Februar 2021, 15:15

@_blackjack_ sry ich weiß nicht wie? Hast du einen Link oder evtl. gleich den Befehl parat?
Benutzeravatar
Dennis89
User
Beiträge: 1124
Registriert: Freitag 11. Dezember 2020, 15:13

Hallo,

ich habe das auf einem Pi Zero nachgestellt.:

Code: Alles auswählen

shut.py:12: RuntimeWarning: A physical pull up resistor is fitted on this channel!
  GPIO.setup(BUTTON_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP)
Traceback (most recent call last):
  File "shut.py", line 24, in <module>
    main()
  File "shut.py", line 16, in main
    channel = GPIO.wait_for_edge(BUTTON_PIN, GPIO_RISING, timeout=TIMEOUT)
NameError: name 'GPIO_RISING' is not defined
Da ich ja gpiozero-Fan bin:

Code: Alles auswählen

from gpiozero import Button
from subprocess import check_call
from signal import pause

def shutdown():
    check_call(['sudo', 'shutdown', '-h', '0'])
shutdown_button = Button(3, hold_time=2)
shutdown_button.when_held = shutdown

pause()

Funktioniert super.

Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Dogma2k
User
Beiträge: 20
Registriert: Donnerstag 25. Februar 2021, 15:15

:o
Na toll und bei mir geht immer noch nicht und weiter weis ich auch nicht mehr :?

Aber dein Code sieht um einiges anders aus als der den ich bekommen hab. Vor allem die time bei mir 3000 und bei dir 3 bei selben befehl.
Benutzeravatar
Dennis89
User
Beiträge: 1124
Registriert: Freitag 11. Dezember 2020, 15:13

Hallo,

die '3000' sind Millisekunden, das ergibt deine gewünschten 3 Sekunden.
Die '3' bei mir ist der GPIO 3 Pin, das entspricht der Pin-Nummer 5, siehe:
https://gpiozero.readthedocs.io/en/stable/recipes.html Absatz 2.2

Die Zeit, die man den Button gedrückt halten muss ist mit 'time=' angegeben, das ist bei mir jetzt 2 Sekunden. Kann man ja beliebig anpassen.
Der Code ist vom selben Link, Absatz 2.8.

Wenn du das verwenden möchtest, in dem Link Absatz 1.1 steht wie du gpiozero installierst. Das ist übrigends eine tolle Bibliothek mit guter und meiner Meinung nach verständlicher Doku.

Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Dogma2k
User
Beiträge: 20
Registriert: Donnerstag 25. Februar 2021, 15:15

Ok ich versuche mich mal das durch zu arbeiten evtl. klappt es ja damit.
Ist halt nur komisch das der Dienst immer verschwindet wen ich die kontakte verwende, das ist bei meinem alten script ohne timer nicht passiert
Benutzeravatar
Dennis89
User
Beiträge: 1124
Registriert: Freitag 11. Dezember 2020, 15:13

Nachtrag:

Der Fehler war nur ein Tippfehler, es muss heißen 'GPIO.RISING' anstatt 'GPIO_RISING'
Ich hatte allerdings noch eine Fehlermeldung wegen Berechtigungen bekommen, dann den Shutdown-Befehl abgeändert und es ging:

Code: Alles auswählen

#!/usr/bin/env python3
from RPi import GPIO
from subprocess import run

BUTTON_PIN = 5
TIMEOUT = 3000 # ms

def main():
    try:
        GPIO.setmode(GPIO.BCM)
        # GPIO5 (pin 29) set up as input. It is pulled up to stop false signals
        GPIO.setup(BUTTON_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP)
        while True:
            # wait for the pin to be sorted with GND and, if so, halt the system
            GPIO.wait_for_edge(BUTTON_PIN, GPIO.FALLING)
            channel = GPIO.wait_for_edge(BUTTON_PIN, GPIO.RISING, timeout=TIMEOUT)
            if channel is None:
                print("Shutting down...")
                run(["sudo", "shutdown", "-h", "0"])
    finally:
        GPIO.cleanup()

if __name__ == "__main__":
    main()
Grüße und viel Spass beim probieren
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Dogma2k
User
Beiträge: 20
Registriert: Donnerstag 25. Februar 2021, 15:15

Ah... damit hat es jetzt geklappt

Code: Alles auswählen

from gpiozero import Button
from subprocess import check_call
from signal import pause

def shutdown():
    check_call(['sudo', 'poweroff'])
shutdown_button = Button(3, hold_time=2)
shutdown_button.when_held = shutdown

pause()
Antworten