1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
| #!/usr/bin/env python2.7
from time import sleep
import subprocess
import RPi.GPIO as GPIO
# On choisit le GPIO 23 (pin 16) pour notre bouton
CHANNEL = 23
# On definit nos durees
long_press = 1
very_long_press = 4
# on met RPi.GPIO en mode notation BCM
GPIO.setmode(GPIO.BCM)
# on initialise le GPIO 23 en mode entree
GPIO.setup(CHANNEL, GPIO.IN, pull_up_down=GPIO.PUD_UP)
# Initialisation pour la led
GPIO.setup(18, GPIO.OUT)
# notre fonction extinction
def switchoff():
subprocess.call(['/opt/vc/bin/tvservice -o'])
#Fonction démarrer
def switchon():
subprocess.call(['/opt/vc/bin/tvservice -p'])
# notre fonction reboot
def reboot():
subprocess.call(['sudo reboot'])
# notre fonction de gestion du bouton
def system_button(CHANNEL):
# cette variable servira a stocker le temps de pression
button_press_timer = 0
#La variable led sert à allumer ou non la LED suivant l'état allumé/éteind.
led = 1
#De base, vu que le script démarre avec le boot, j'allume la LED
GPIO.output(18, 1)
while True:
if (GPIO.input(CHANNEL) == False) : # le bouton a ete presse...
button_press_timer += 0.2 # ... on enregistre le temps que cela dure
#La LED clignote
GPIO.output(18, 0)
sleep(0.5)
GPIO.output(18.1)
sleep(0.5)
else: # le bouton a ete relache, on compte combien de temps cela a dure
if (button_press_timer > very_long_press, led = 1) :
print "very long press : ", button_press_timer
#J'eteinds la LED, le systeme s'eteind''
GPIO.output(18, 0)
led = 0
switchoff()
elif (button_press_timer > very_long_press, led = 0)
print "very long press : ", button_press_timer
#J'allume la led, le systeme s'allume'
GPIO.output(18, 1)
led = 1
switchon()
elif (button_press_timer > long_press) :
print "long press : ", button_press_timer
reboot()
elif (button_press_timer > 0.2):
print "short press : ", button_press_timer
button_press_timer = 0
# on attend 0.2 secondes avant la boucle suivante afin de reduire la charge sur le CPU
sleep(0.2)
# on met le bouton en ecoute par interruption, detection falling edge sur le canal choisi, et un debounce de 200 millisecondes
GPIO.add_event_detect(CHANNEL, GPIO.FALLING, callback=system_button, bouncetime=200)
# ici vous pouvez mettre du code qui sera execute normalement, sans influence de la fonction bouton
try:
while True:
# faites ce qui vous plait
sleep (2)
# on reinitialise les ports GPIO en sortie de script
except KeyboardInterrupt:
GPIO.cleanup()
GPIO.cleanup() |
Partager