IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Raspberry Pi Discussion :

Aide Script Python


Sujet :

Raspberry Pi

  1. #1
    Membre régulier
    Homme Profil pro
    Lycéen
    Inscrit en
    Février 2016
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Février 2016
    Messages : 9
    Par défaut Aide Script Python
    Bonjour !

    J'avais déjà demandé de l'aide pour écrire un script RPi2 ici.

    J'ai enfin reçu tout le materiel, mais malheureusement le programme a quelques difficultés à se lancer. Après plusieurs problèmes d'indentations, j'ai encore :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    File "./button.py", line 85
    except KeyboardInterrupt:
         ^
    SyntaxError : invalid syntax
    Après quelques recherches, il semble que cela ne vient pas de la commande en particulier mais d'une erreur avant dans le code. Et là je sèche :/

    Merci d'avance pour votre aide !

    Voici le code du script :
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    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()

    Le script doit allumer une LED quand on le lance. Lorsqu'on appuie vite fait sur le bouton ça éteint l'affichage hdmi et la led, quand on appuie ça fait l'inverse. Un appui long redémarre le Raspberry.

  2. #2
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    13 126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 13 126
    Billets dans le blog
    47
    Par défaut
    Salut,

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    def system_button(CHANNEL):
    	...
     
    	def system_button(CHANNEL):
    		...
    Tu as deux fonctions system_button()

    De plus, un bloc except doit suivre un bloc try. Voir Traitement des erreurs : les exceptions

  3. #3
    Membre régulier
    Homme Profil pro
    Lycéen
    Inscrit en
    Février 2016
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Février 2016
    Messages : 9
    Par défaut
    Du coup la fonction except ne sert à rien puisque le script tourne en continue ?

  4. #4
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    13 126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 13 126
    Billets dans le blog
    47
    Par défaut
    Elle sert à traiter l'exception provoquée par un CTRL+C, et quitter le programme proprement après avoir remis le port GPIO en sécurité (cleanup).

  5. #5
    Membre régulier
    Homme Profil pro
    Lycéen
    Inscrit en
    Février 2016
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Février 2016
    Messages : 9
    Par défaut
    Qu'est ce que je dois écrire alors ? (désolé je ne maitrise pas très bien le langage :/)

  6. #6
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    13 126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 13 126
    Billets dans le blog
    47
    Par défaut
    Ben dans l'autre discussion (qu'on n'aurait pas dû quitter d'ailleurs), on en était là :

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    #!/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
     
    	while GPIO.input(CHANNEL) == False : # tant que le bouton est maintenu presse ...
    		button_press_timer += 0.2 # ... on enregistre le temps que cela dure
    		sleep(0.2)
     
     
    	# le bouton a ete relache, on compte combien de temps cela a dure
    	if (button_press_timer > very_long_press) :
    		# etc.
     
    # 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:
    		# en mai, faites ce qu'il vous plait
    		sleep (2)
     
    # on reinitialise les ports GPIO en sortie de script
    except KeyboardInterrupt:
    	GPIO.cleanup()

  7. #7
    Membre régulier
    Homme Profil pro
    Lycéen
    Inscrit en
    Février 2016
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Février 2016
    Messages : 9
    Par défaut
    Je n'osai pas rouvrir un sujet déjà résolu

    Le try s'était fait la mallle, erreur de ma part. J'ai finalement réussi à faire tourner le code en le reprenant en entier. Le problème c'est que lorsque j'appuie sur le bouton une fois pour éteindre l'écran, il m'afffiche :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Traceback (most recent call last):
      File "./Bouton.py", line 48, in system_button
        switchoff()
      File "./Bouton.py", line 23, in switchoff
        subprocess.call(['/opt/vc/bin/tvservice -o'])
      File "/usr/lib/python2.7/subprocess.py", line 522, in call
        return Popen(*popenargs, **kwargs).wait()
      File "/usr/lib/python2.7/subprocess.py", line 710, in __init__
        errread, errwrite)
      File "/usr/lib/python2.7/subprocess.py", line 1335, in _execute_child
        raise child_exception
    OSError: [Errno 2] No such file or directory
    De plus, il ne redémarre pas lors de longue pression (il ne reconnait que les fonctions allumer/éteindre).

    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    very long press :  5.6
    Traceback (most recent call last):
      File "./Bouton.py", line 48, in system_button
        switchoff()
      File "./Bouton.py", line 23, in switchoff
        subprocess.call(['/opt/vc/bin/tvservice -o'])
      File "/usr/lib/python2.7/subprocess.py", line 522, in call
        return Popen(*popenargs, **kwargs).wait()
      File "/usr/lib/python2.7/subprocess.py", line 710, in __init__
        errread, errwrite)
      File "/usr/lib/python2.7/subprocess.py", line 1335, in _execute_child
        raise child_exception
    OSError: [Errno 2] No such file or directory
    Et dernière chose, la led ne s'allume qu'une fois que le bouton a été appuyé :/

    Je remets code (qui marche cette fois)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    #!/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)
    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 "Reboot du systeme par bouton GPIO" &'], shell=True)
    
    # notre fonction de gestion du bouton
    def system_button(CHANNEL):
    	# cette variable servira a stocker le temps de pression
    	button_press_timer = 0
    	led = 1
    	GPIO.output(18,True)
    
    	while True:
    			if (GPIO.input(CHANNEL) == False) : # le bouton a ete presse...
    				button_press_timer += 0.2 # ... on enregistre le temps que cela dure
    				GPIO.output(18, not GPIO.input(18))
    
    			else: # le bouton a ete relache, on compte combien de temps cela a dure
    				if (button_press_timer > long_press, button_press_timer < very_long_press, led == 1) :
    					print "very long press : ", button_press_timer
    					switchoff()
    					led = 0
    					GPIO.output(18,False)
    
    				elif (button_press_timer > long_press, button_press_timer < very_long_press, led == 0) :
    					print "very long press : ", button_press_timer
    					switchon()
    					led = 1
    					GPIO.output(18,True)
    
    
    				elif (button_press_timer > very_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)
    
    try :
    	while True:
    		sleep(2)
    
    except KeyboardInterrupt:
    	GPIO.cleanup() 
    GPIO.cleanup()

Discussions similaires

  1. Exécution d'un script python à l'aide d'une page web
    Par ameunie dans le forum Général Python
    Réponses: 3
    Dernier message: 06/03/2016, 13h05
  2. Aide script python
    Par darkh2 dans le forum Général Python
    Réponses: 1
    Dernier message: 10/01/2011, 06h33
  3. aide pour script python
    Par bansan dans le forum Général Python
    Réponses: 1
    Dernier message: 28/11/2008, 23h51
  4. aide pour script python
    Par bansan dans le forum Programmation multimédia/Jeux
    Réponses: 0
    Dernier message: 28/11/2008, 19h41
  5. Réponses: 3
    Dernier message: 05/04/2005, 14h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo