Comments: Raspberry Pi Safe Reboot and Shutdown Button
Looking for answers to technical questions?
We welcome your comments and suggestions below. However, if you are looking for solutions to technical questions please see our Technical Assistance page.
If you've found an issue with this tutorial content, please send us your feedback!
Error Booting Up
If you have a typo in the python script or rc.local file, your Raspberry Pi might have problems booting up into the desktop GUI. If you notice this happening, try going into safe mode and editing the rc.local file through the command line as indicated by the instructions below.
Powering the Raspberry Pi back up to get back to the desktop GUI. Try checking your Python script to make sure that there are no errors. When ready, try adding the command back into the rc.local file again to execute the Python script. You will need to ensure that the command has no syntax errors. Otherwise, the Raspberry Pi will encounter the same problem booting up again.
Resources and Going Further
For more information about getting your Raspberry Pi into safe mode, check out the following post:
Due to the polling, top is reporting ~92 percent cpu usage when I apply this on my Raspberry Pi 1 Model B. Is there a way to do this using interrupts so that the code doesn't have to poll every half second?
Sweeeeeet, I got the interrupt to also to work for the safe reboot and shutdown example. I'll need to test both out with the rc.local and observe the performance. It's looking pretty good though since the interrupts are waiting for falling edge. Feel free to look at my gists if you don't want to wait for me to update this tutorial with the code commented, cleaned, and tested.
Hi,
There was another user that was wondering the same thing. At the time of writing, I didn't realize that the example code used a lot of resources when using it with a Pi 3. We use part of that code in production to test, program, and check certain boards. I don't believe we ever tested its performance by viewing it with the
top
command.Possible Solutions
I am not sure which example you are referring to but both examples are probably using a lot of resources. When the case was brought up from another user, I checked in with a co-worker and he believed that it might have something to do with the while loop. He suggested possibly using an interrupt as opposed to the while loop to check the button state. The other option that I was thinking is possibly adding a delay so that the piece of code is not constantly checking and running so much. The restart code already uses a delay to check how long it has been pressed so it may need to be placed as an additional else statement when it is not being pressed down.
Initial Tests with Interrupts
Looking at the documentation that is linked for the RPI.GPIO from PYPI, it appears to be efficient when using the
wait_for_edge()
example. I briefly tested using thewait_for_edge()
in the shutdown example in Thonny IDE. I'll need to configure the rc.local to run the example at startup to observe the performance but I think it will perform better than the original code. The next step is revisiting the safe reboot and shutdown example with the interrupt as well to see if that code can be improved as well. =)It may be possible to recover a corrupt microSD card if your Raspberry Pi is stuck in emergency mode. This happens when you remove power from your Pi without properly shutting it down. This happened to me once but I never got it working (I simply flashed a new image on another microSD card).
Here are the associated links that may be of some use if anyone runs into this issue:
I have a question with the scripts as presented. Why enable the internal pull-up resistor in the Pi for the presented application when the button on the Qwiic Phat already has one?
Hi,
That is a good question. I assumed that there was not a pull-up resistor on the board to prevent the pin from floating similar a few of my other projects. When testing, I did not notice any problems resetting or shutting down. I assumed that it was correct when checking against code that we use. However, that is redundant now that I look at the schematic.
Let me test the case out tonight when I have the Pi available. The following line can probably be adjusted from:
to
I would recommend leaving both options in the code and change your write up to state enable the GPIO pull-up line if duplicating the project without using the Qwiic Phat (just a push-button connected between GND and GPIO17) or use the other option if using the Phat.
I tested this out and my Pi seems to be running fine with the internal pull-up resistor commented out since Friday night. The code in example 1 and 2 have been updated so that the options are available. I also included a note in the tutorial. =)
Thanks for the feedback. Stay healthy and safe. ^_^