“TL;DR: This post describes an easy way to add a power button to a raspberryp pi that:
Only needs a button and wires, no other hardware components.
Allows graceful shutdown and powerup.
Only needs modification of config files and does not need a dedicated daemon to read GPIO pins.
There are two caveats:
This shuts down in the same way as shutdown -h now or halt does. It does not completely cut the power (like some hardware add-ons do).
To allow powerup, the I²C SCL pin (aka GPIO3) must be used, conflicting with externally added I²C devices.
If you use Raspbian stretch 2017.08.16 or newer, all that is required is to add a line to /boot/config.txt:
Make sure to reboot after adding this line. If you need to use a different gpio, or different settings, lookup gpio-shutdown in the docs.
Then, if you connect a pushbutton between GPIO3 and GND (pin 5 and 6 on the 40-pin header), you can let your raspberry shutdown and startup using this button.
If you use an original Pi 1 B (non-plus) revision 1.0 (without mounting holes), pin 5 will be GPIO1 instead of GPIO3 and you will need to specify gpio_pin=1 instead. The newer revision 2.0 (with 2 mounting holes in the board) and all other rpi models do have GPIO3 and work as above.
All this was tested on a Rpi Zero W, Rpi B (rev 1.0 and 2.0) and a Rpi B+.
If you have an older Raspbian version, or want to know how this works, read on below.”