epelpad

Botón para apagar Raspberry Pi

Hola Taringueros!
Hace unas semanas pude conseguirme una Raspberry Pi 3 y pensé aportar en algo.
Se trata, como bien dice el títuto, de usar un botón para encender y apagar la Raspberry Pi mediante un pequeño script creado en python y con un botón conectado a los puertos GPIO 5 y 6. Con esto se realiza un apagado seguro usando el comando "sudo shutdown -h now" por que así evitamos corromper los datos en la tarjeta micro SD


Botón para apagar Raspberry Pi

¿Qué necesitamos?
  • Una raspberry conectada a la red.
  • Un botón o pulsador y un par de cables (yo usé uno del encendido de una cpu vieja).
  • Raspbian, Retropie o similar (yo lo hice en esos) instalado en la micro SD.

script

Comenzamos:
primero con la raspi encendida y conectada a la red abren una terminal (usando el teclado o conectandose a través de SSH) actualizan el sistema:

sudo apt update
sudo apt upgrade


E instalamos
sudo apt-get -y install python-rpi.gpio

Luego creamos el Script y lo guardamos en un lugar fácil de recordar:
Yo lo llamaré shutdown, con la extención .py (de python) y lo guardaré en /home/pi/

sudo nano /home/pi/shutdown.py

Dentro copiamos el siguiente codigo:

[color=#000000] 
import RPi.GPIO as GPIO
import time
import os

GPIO.setmode(GPIO.BCM)
GPIO.setup(03, GPIO.IN, pull_up_down = GPIO.PUD_UP)
while True:
    print GPIO.input(03)
    if(GPIO.input(03) == False):
        os.system("sudo shutdown -h now")
        break
    time.sleep(1)
[/color]


Pulsamos Ctrl+X y guardamos (yes)
Ahora tenemos que indicarle a la raspberry que cada vez que iniciamos se debe ejecutar el script.

sudo crontab -e

Al final del archivo escribimos

@reboot sudo python /home/pi/shutdown.py

Y apagamos.

Vean que /home/pi/shutdown.py es la ubucación del script, deben de cambiarlo dependiendo de donde lo guardaron.

Ahora conectamos el botón en los GPIO 5 y 6

python

En mi Raspberry
Linux

Si todo va bien, el código no arrojará ningún error por pantalla y se quedará escuchando a que pulsemos el botón. Si lo pulsamos, la raspberry se debe apagar!

Una vez apagada podemos comprobar que, efectivamente, la raspberry también enciende si pulsamos el botón.
Con eso terminamos, espero que lo disfruten y cualquier duda no duden en consultar.

------Pequeña actualizaci{on------


primero: Gracias a todos por sus comentarios! Sé que no es mucho el aporte que realicé (vamos, un poco de googe y encontraran muchas formas de hacer lo mismo ) pero me alegra el interés que demostraron.
Hace poco entontré la forma de realizar un reset usando el mismo botón. Funciona de la siguiente manera: si mantenemos precionado por unos segundos (unos tres segundos) el boton, la raspy pasara a apagarse, ahora si apenas tocamos lo soltamos, el comando hara que se reinicie.
Sigan los mismos pasos anteriores (si no lo habían hecho antes) y solo reemplazan el código anterior por el siguiente:


[color=#000000] 
#!/usr/bin/python
# shutdown/reboot(/power on) Raspberry Pi with pushbutton

import RPi.GPIO as GPIO
from subprocess import call
from datetime import datetime
import time

# pushbutton connected to this GPIO pin, using pin 5 also has the benefit of
# waking / powering up Raspberry Pi when button is pressed
shutdownPin = 5

# if button pressed for at least this long then shut down. if less then reboot.
shutdownMinSeconds = 3

# button debounce time in seconds
debounceSeconds = 0.01

GPIO.setmode(GPIO.BOARD)
GPIO.setup(shutdownPin, GPIO.IN, pull_up_down=GPIO.PUD_UP)

buttonPressedTime = None


def buttonStateChanged(pin):
    global buttonPressedTime

    if not (GPIO.input(pin)):
        # button is down
        if buttonPressedTime is None:
            buttonPressedTime = datetime.now()
    else:
        # button is up
        if buttonPressedTime is not None:
            elapsed = (datetime.now() - buttonPressedTime).total_seconds()
            buttonPressedTime = None
            if elapsed >= shutdownMinSeconds:
                # button pressed for more than specified time, shutdown
                call(['shutdown', '-h', 'now'], shell=False)
            elif elapsed >= debounceSeconds:
                # button pressed for a shorter time, reboot
                call(['shutdown', '-r', 'now'], shell=False)


# subscribe to button presses
GPIO.add_event_detect(shutdownPin, GPIO.BOTH, callback=buttonStateChanged)

while True:
    # sleep to reduce unnecessary CPU usage
time.sleep(5)
[/color]


Este codigo lo encontré en GitHub, y lo comparto con ustedes.

8 comentarios - Botón para apagar Raspberry Pi

jerauma +1
A fav
yuki94 +1
gracias y espero que te sea útil
Troll_erotico
Muy buena información, esto es inteligencia colectiva
yuki94
Gracias!
jaykoxx
es lo malo de la raspberry no tiene botón de apagado
yuki94 +6
pero lo bueno de la raspberry es que podés hacerle uno
jose_pura +1
Suelo apagar con el comando. Lo malo de mi raspberry es que al hacerlo, el fan sigue funcionando pero me gusta la idea del botón.

Gracias
yuki94 +1
exacto, es casi lo mismo, solo que en vez de estar escribiendo el comando, lo tenés "al toque de un botón"
pero con lo del fan no tengo idea ya que no tengo
abelnicolas1976
Hay un par de cosas que me vienen bien del post, sólo tengo una duda:
funciona el comando shutdown sin agregarlo a /etc/sudoers.d/tu_usuario ?

pregunto porque si llega a pedir contraseña, el loop queda colgado hasta que se apague el sistema o se mate al proceso del script.
yuki94 +1
muy buena tu pregunta, si usas sudo shutdown desde la terminal te pedirá la contraseña (a lo que seguro es tu duda). pues mira, al ejecutar el script al inicio del sistema con la ayuda de "sudo crontab -e " que es un gestor de tareas de linux, nos evita el uso de la contraseña.
(es lo que tengo entendido, tal vez sea otra la respuesta y no la conozca)
yuki94 +1
me quede con la duda y encendí la raspberry (usando Retropie y despues en Raspbian), escribí "sudo shutdown" y no me pidieron la contraseña.....
abelnicolas1976
@yuki94 Gracias, ahora me quedo tranquilo con tu segunda respuesta
isi_89
lo guardo para cuando me compre la RP3
Novateh
Muy bueno, como hago para mandar un comando en c++ a la consola? osea si quiero hacerle un shutdown pero en C++?. Saludos
yuki94
esa amigo te la debo.. no manejo C++
puedo darte este limón a cambio?