Wie kann ich beim Raspberry Pi ein Script mit einem GPIO wieder schließen?
Hallo Leute, ich habe ein Script geschrieben in dem ein weiteres Script geöffnet wird, wenn ich einen GPIO betätige. Jetzt möchte ich das dieser wieder schließt wenn ich einen anderen GPIO betätige. Das fehlende Script muss bei den ??? hin.
Hier einmal mein Script:
#!/bin/sh
while [ "1" = "1" ]; do
gpio17=$(cat /sys/class/gpio/gpio17/value)
#echo $gpio17
if [ $gpio17 -eq 1 ]
then
sh /home/pi/Joystick.sh
fi sleep 0;
gpio17=$(cat /sys/class/gpio/gpio17/value) #echo $gpio17
if [ $gpio17 -eq 0 ]
then
???
fi sleep 0;
done
Viele Grüße
2 Antworten
vielleicht einfach mit
killall Joystick.sh
Dazu wird es wohl aber mit deinem Programm nicht kommen, denn an diese Stelle kommst du erst dann, wenn sh /home/pi/Joystick.sh terminiert und dann musst und kannst du es auch nicht mehr beenden.
Hinter
sh /home/pi/Joystick.sh
muss dann mindestens noch ein & für "arbeite im Hintergrund"
Wenn so ein dort aufgerufenes Programm im Hintergrund arbeite, dann gibt es auch seine Prozess-ID zurück und die kannst du dann eindeutig für
kill -9 "diese-PID"
benutzen, wenn die in einer Variablen steht.
Noch 2 Anmerkungen:
Für "Script geöffnet" und "Script geschlossen" sollten besser die Begriffe "gestartet" und "beendet" benutzt werden. Öffnen steht mehr für Edit als für Run.
Hast du mal überlegt, ob du als Scriptsprache vielleicht die tclsh-Shell benutzen solltest. Im einem Raspberry benutze ich die, um meine gesamte Haustechnik damit zu steuern.
Hier nur einige Zeilen in tclsh
aus
gpio17=$(cat /sys/class/gpio/gpio17/value)
würde
set gpio17 [ eval exec cat /sys/class/gpio/gpio17/value ]
und aus
sh /home/pi/Joystick.sh &
würde
set joy_PID [ eval exec sh /home/pi/Joystick.sh & ]
und zum Beenden von Joystick.sh
eval exec kill -9 $joy_PID
Auf den ersten Blick sieht das zwar alles viel Umfangreicher aus, ist aber doch recht übersichtlich und nachvollziehbar. Da muss man auch nicht fragen, was gerade in der Variablen ? steht ...
Ein weiter Vorteil ist, dass man Informationen wie mit echo $gpio17 grafisch darstellen kann
z.B. mit
if { $gpio17 == "0" } { set text "GPIO-Pin 17 ist LOW " } else { set text "GPIO-Pin 17 ist HIGH" }
tk_messageBox -icon info -titel "Systemmeldung" -message $text
So könnte ein Script zum Starten/Stoppen aussehen. Mit der GPIO-Schnittstelle habe ich mich nicht weiter beschäftigt. Nur so viel, dass es auf meinem Raspberry
/sys/class/gpio/gpio17/value
nicht gibt. Daher habe ich es auch nur auf meinem großen PC mit einer anderen Datei getestet.
Die ersten 3 Zeilen sind für das Betriebssystem und sollten nicht verändert werden.
In den nächsten 2 Zeilen werden nur Variable gesetzt, so dass man die Namen nicht mehrfach schreiben muss. pid ist eine Variable für die Prozess-ID das runFlag sagt, dass das Script ( Joystick ) bereits gestartet wurde und nicht noch einmal gestartet wird, wenn das gpio-Pin abgefragt wird. Die catch-Anweisung verhindert den Programmabsturz, wenn kill -9 nicht erfolgreich war (z.B. wenn die pid nicht existiert) after ist so etwas wie sleep, hier aber in Millisekunden.
#!/bin/bash
# \
exec tclsh "$0" "$@"
set joystick /home/pi/Joystick.sh
set gpioPort /sys/class/gpio/gpio17/value
set pid ""
set runFlag "no"
while { 1 } { set fpin [open $gpioPort r ]
set gpio17 [ read $fpin 1 ]
close $fpin
set gpio17 [expr $gpio & [format %x 0x01 ] ]
if { $gpio17 == "1" } { if { $runFlag == "no" } { set pid [eval exec $joystick & ] ; set runFlag "yes" } } else {
if { [ catch { eval exec kill -9 $pid } ] == "0" } { set runFlag "no" }
}
after 100
}
Hallo
Wie kann ich beim Raspberry Pi ein Script mit einem GPIO wieder schließen?
Warum startest Du nicht das Kommando welches in Joystick.sh steht, statt des Scripts?
Oder testest einfach den Zustand:
if [ $(cat /sys/class/gpio/gpio17/value) == 1 ;
exit 0
else
echo "0" > /sys/class/gpio/gpio17/value
fi
Aber vielleicht erklärst Du mal was da genau gemacht werden soll, eventuell gibt es einen einfacheren Weg.
Linuxhase
Könntest du mir das oben genannte Script einmal komplett übersetzen in tclsh? Bei mir funktioniert das nicht ganz....