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.

  • 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 the wait_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:

      # Use built-in internal pullup resistor so the pin is not floating
      GPIO.setup(reset_shutdown_pin, GPIO.IN, pull_up_down=GPIO.PUD_UP)


      # Use Qwiic pHAT's pullup resistor so that the pin is not floating
      GPIO.setup(reset_shutdown_pin, GPIO.IN)

      • 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. ^_^

If you've found a bug or have other constructive feedback for our tutorial authors, please send us your feedback!