Canales populares

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




¿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.



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



En mi Raspberry


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.
+22
2
0
2Comentarios