Sposób 1 - GPIO 3:
Sposób ten pozwala nam na wprowadzenie Raspberry pi w stan uśpienia. Przez kliknięcie tego samego przycisku istnieje także możliwość ponownego uruchomienia układu. Co jest niestety niemożliwe w przypadku innych pinów.
Dodatkowo należy pamiętać, że ta linia obsługuje linię zegara I2C. Oznacza to, że nie ma możliwości włączania/wyłączania urządzenia z tego pinu gdy wykorzystujemy linię I2C do innych celów.
Zwarcie GPIO3 z masą powoduje "wyłączenie systemu" natomiast ponowne kliknięcie przycisku uruchamia urządzenie.
Można też ustawić inny pin tak aby przedstawiał aktualny stan RPI.
Aby ten sposób wyłączania Raspberry Pi działał należy wyłączyć interfejs I2C w urządzeniu.
Zwarcie GPIO3 z masą powoduje "wyłączenie systemu" natomiast ponowne kliknięcie przycisku uruchamia urządzenie.
- sudo nano /boot/config.txt
- //Do pliku należy wpisać:
- dtoverlay=gpio-shutdown,gpio_pin=3
Można też ustawić inny pin tak aby przedstawiał aktualny stan RPI.
- dtoverlay=gpio-poweroff,gpiopin=27,active_low=1
Aby ten sposób wyłączania Raspberry Pi działał należy wyłączyć interfejs I2C w urządzeniu.
Sposób 2 - Dowolny pin:
Ten sposób dotyczy uruchomienia skryptu działającego w tle, który sprawdza stan na wybranym pinie.
W poniższym kodzie zastosowałem wywołanie instrukcji wyłączenia Raspberry po 10 sekundach. Tutaj można wprowadzić inny czas bądź inną instrukcję np. reboot.
Można też uruchomić kilka skryptów z różnymi funkcjami np. pod jednym przyciskiem wyłączanie, pod drugim restart itp.
Całość skryptu jest dosyć prosta i wygląda następująco.
Najpierw definicja bibliotek:
- from gpiozero import Button
- import time
- import os
Teraz należy stworzyć dwie zmienne jedna z przypisanym odpowiednim pinem zdefiniowanym jako przycisk, w moim przypadku będzie to GPIO 21 (Można użyć dowolnego natomiast pin 21 czy 26 znajdują się blisko GND i nie posiadają żadnych specjalnych funkcji). Druga zmienna będzie zliczać ilość sekund po której nastąpi wywołanie komendy.
- connectedButton= Button(21)
- countValuesToShutdown = 0
Teraz pętla while w której właściwie sprawdzamy tylko czy został wciśnięty przycisk, jeśli tak to co sekundę ponownie sprawdzam stan przycisku po czym zwiększam dane dla zmiennej przechowującej czas wciśnięcia. W przypadku przerwania wciśnięcia przycisku przed odliczeniem do wyłączenia nastąpi zresetowanie odliczania czasu.
- while True:
- if stopButton.is_pressed:
- time.sleep(1)
- if stopButton.is_pressed:
- checkValue = checkValue + 1
- else:
- checkValue=0
- if checkValue==10:
- checkValue=0
- os.system("sudo shutdown now -h")
- if checkValue==0:
- time.sleep(1)
Cały skrypt dla Python2 oraz Python3:
- from gpiozero import Button
- import time
- import os
- connectedButton = Button(21)
- countValuesToShutdown = 0
- while True:
- if connectedButton.is_pressed:
- time.sleep(1)
- if stopButton.is_pressed:
- countValuesToShutdown = countValuesToShutdown + 1
- else:
- countValuesToShutdown =0
- if countValuesToShutdown ==10:
- countValuesToShutdown =0
- os.system("sudo shutdown now -h")
- if countValuesToShutdown ==0:
- time.sleep(1)
Tutaj podobnie jak w przykładzie pierwszym można wybrać jeden z pinów, który będzie służył do przekazywania informacji o statusie działania systemu. Można to wykonać przez dodanie linijki w pythonie lub wykonać instrukcję jak w przypadku 1.
Uruchomienie skryptu:
W celu wprowadzenia skryptu do uruchamiania przy starcie systemu należy przygotować odpowiedni skrypt .sh. Poniżej krótka instrukcja:
Najpierw w katalogu domowym użytkownika tworzymy plik .sh:
- cd /home/pi
- sudo nano btnLauncher.sh
Następnym krokiem jest wpisanie instrukcji do pliku launcher'a:
- cd /
- cd home/pi/btn_turn_off
- sudo python btn_turn_off.py
- cd /
Zapisuje zmiany i zamykam plik. Następnie należy zmienić uprawnienia przypisanie do pliku oraz odpalić skrypt w celu weryfikacji poprawności działania:
- chmod 755 btnLauncher.sh
- sh btnLauncher.sh
Teraz należy przejść do folderu home. Gdzie stworzonony zostanie folder przechowujący logi błędów dla Crontab'a.
- mkdir logs //Stworzenie folderu z logami
- sudo crontab -e //Otwarcie okna crontaba
- @reboot sh /home/pi/btnLauncher.sh >/home/logs/cronlog 2>&1 //Wprowadzenie uruchamiania sktyptu
Teraz po wpisaniu sudo reboot skrypt zostanie wykonywany. Aby podglądnąć ewentualne błędy należy wejść do folderu logs i otworzyć plik cronlog.