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
| #!/usr/bin/env python2.7
#Code realise a partir de l'article "Raspberry Pi : Plusieurs fonctions avec un seul bouton" , modifie par Antoine Filali-Ansary - antoineos@hotmail.fr -, corrige par f-leb - 02/2016
#Made from the article "Raspberry Pi : Plusieurs fonctions avec un seul bouton" - modified by Antoine Filali-Ansary - antoineos@hotmail.fr -, checked by f-leb - 02/2016
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 demarrer
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 a allumer ou non la LED suivant l'etat allume/eteint.
led = 1
#De base, vu que le script demarre avec le boot, j'allume la LED
GPIO.output(18, 1)
def system_button(CHANNEL):
# cette variable servira a stocker le temps de pression
button_press_timer = 0
led = 1
while GPIO.input(CHANNEL) == False : # tant que le bouton est maintenu presse ...
button_press_timer += 0.2 # ... on enregistre le temps que cela dure
GPIO.output(18, not GPIO.input(18))
sleep(0.2)
if (button_press_timer > very_long_press, led == 1) :
print "very long press : ", button_press_timer
#J'eteinds la LED, le systeme s'eteinds''
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)
# on reinitialise les ports GPIO en sortie de script
except KeyboardInterrupt:
GPIO.cleanup()
GPIO.cleanup() |
Partager