GPIO.wait_for_edge et KeyboardInterrupt

Python est le langage de prédilection du Raspberry Pi

Modérateurs : Francois, Manfraid

Répondre
finopat
Messages : 7
Enregistré le : mar. 23 août 2016 12:54

GPIO.wait_for_edge et KeyboardInterrupt

Message par finopat » ven. 26 mai 2017 14:59

Bonjour,
je prépare une sonnette qui enverra un SMS à plusieurs destinataires.
Pour détecter l'appui j'utilise la fonction wait_for_edge de la librairie GPIO, pour les debug je voulais remettre à 0 les GPIO en cas de CTRL+C mais cela ne fonctionne pas.
J'obtiens une erreur : RuntimeError: Error waiting for edge, est ce qu'il y a un moyen de sortir proprement en remettant les GPIO à 0 ?

Voici l'erreur que j'obtiens quand j’appuie sur ctrl+c :

pat@raspi2:~/Python/sonnette $ sudo ./sonnette.py
^CTraceback (most recent call last):
File "./sonnette.py", line 50, in <module>
attente_appui()
File "./sonnette.py", line 37, in attente_appui
GPIO.wait_for_edge(pin, GPIO.FALLING, bouncetime=debounce)
RuntimeError: Error waiting for edge

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "./sonnette.py", line 50, in <module>
attente_appui()
KeyboardInterrupt

et voici mon script :

[edit] : les BBcodes ne fonctionnent pas sur ce post (je l'ai posté en ayant écrit moins de 5 messages)

#!/usr/bin/env python3
# -*- coding:utf-8 -*-
"""
Envoi SMS quand appui sur la sonnette
utilisation de la fonction GPIO.input()
Bouton poussoir raccordé entre GPIO22 et +3.3V
(avec montage Pull-up pour éviter les interférences)
nom programme : sonnette.py
logiciel : python 3.4.2
cible : raspberry Pi
date de création : 16/05/2017
date de mise à jour : N/A
version : 1.0
auteur : Pat
référence : http://www.framboise314.fr/le-bouton-po ... -etonnant/
: https://sourceforge.net/p/raspberry-gpi ... edomCookie
"""
#-------------------------------------------------------------------------------
# Bibliothèques
#-------------------------------------------------------------------------------
import RPi.GPIO as GPIO #bibliothèque RPi.GPIO
#-------------------------------------------------------------------------------

#-------------------------------------------------------------------------------
# Fonctions Persos
#-------------------------------------------------------------------------------
import sendSMS #envoi SMS via twilio
#-------------------------------------------------------------------------------

pin = 22 #broche utilisé en entrée
debounce = 5000 #attente anti-rebond / anti SPAM en ms
GPIO.setmode(GPIO.BCM) #utilisation des numéros de ports du processeur
GPIO.setup(pin, GPIO.IN) #GPIO en entrée (montage Pull-Up pour eviter interferences)

def attente_appui():
#attente d'un appui par détection de l'évènement passage à 0 (FALLING)
GPIO.wait_for_edge(pin, GPIO.FALLING, bouncetime=debounce) #<== ligne 37

#évènement FALLING détecté => on passe à la suite du programme
sendSMS.sendMessage ('On sonne', '+336XXXXXXXXX')
sendSMS.sendMessage ("Quelqu'un sonne", '+336YYYYYYYYY')


if __name__ == '__main__':
"""
Programme par défaut
"""
try:
while True:
attente_appui() #<== ligne 50

except (KeyboardInterrupt, SystemExit): #sortie boucle par ctrl-c
GPIO.remove_event_detect()
GPIO.cleanup() #libère toutes les ressources GPIO
print("\nProgramme interrompu\n")[/code]
Modifié en dernier par finopat le lun. 29 mai 2017 08:11, modifié 1 fois.

dyox
Raspinaute
Messages : 969
Enregistré le : dim. 28 déc. 2014 15:28
Localisation : Le long de la côte, au dessus du pays des bigoudennes, aïe

Re: GPIO.wait_for_edge et KeyboardInterrupt

Message par dyox » ven. 26 mai 2017 15:17

Bonjour,

Essayez simplement pour sortir

Code : Tout sélectionner

except KeyboardInterrupt:      
    GPIO.cleanup()

finopat
Messages : 7
Enregistré le : mar. 23 août 2016 12:54

Re: GPIO.wait_for_edge et KeyboardInterrupt

Message par finopat » dim. 28 mai 2017 08:35

Bonjour,
même résultat avec cette syntaxe.

dyox
Raspinaute
Messages : 969
Enregistré le : dim. 28 déc. 2014 15:28
Localisation : Le long de la côte, au dessus du pays des bigoudennes, aïe

Re: GPIO.wait_for_edge et KeyboardInterrupt

Message par dyox » dim. 28 mai 2017 09:10

Vous serait-il possible d'éditer le post et de mettre le script entre les balises

Code : Tout sélectionner

 ?
 
 Si je suis [url]http://raspi.tv/2014/rpi-gpio-update-and-detecting-both-rising-and-falling-edges[/url] et [url]https://sourceforge.net/p/raspberry-gpio-python/wiki/Inputs/?SetFreedomCookie[/url]
 
la ligne "GPIO.wait_for_edge(pin, GPIO.FALLING, bouncetime=debounce)" devrait être GPIO.add_event_detect(pin, GPIO.FALLING, bouncetime=debounce)

Et si on suit les exemples, plutôt du genre GPIO.add_event_detect(pin, GPIO.FALLING, callback=attente_appui, bouncetime=debounce)

finopat
Messages : 7
Enregistré le : mar. 23 août 2016 12:54

Re: GPIO.wait_for_edge et KeyboardInterrupt

Message par finopat » lun. 29 mai 2017 08:07

Bonjour, je vais éditer le post, je n'avais pas encore les 5 messages fatidiques pour pouvoir utiliser le BB code, cela devrait être chose faite maintenant.

finopat
Messages : 7
Enregistré le : mar. 23 août 2016 12:54

Re: GPIO.wait_for_edge et KeyboardInterrupt

Message par finopat » lun. 29 mai 2017 08:12

Je reposte mon code avec les balises code qui vont bien :

Code : Tout sélectionner

#!/usr/bin/env python3
# -*- coding:utf-8 -*-
"""
Envoi SMS quand appui sur la sonnette
utilisation de la fonction GPIO.input()
Bouton poussoir raccordé entre GPIO22 et +3.3V 
(avec montage Pull-up pour éviter les interférences)
nom programme       : sonnette.py
logiciel            : python 3.4.2
cible               : raspberry Pi
date de création    : 16/05/2017
date de mise à jour : N/A
version             : 1.0
auteur              : Pat
référence           : http://www.framboise314.fr/le-bouton-poussoir-un-composant-banal-o-combien-etonnant/
                    : https://sourceforge.net/p/raspberry-gpio-python/wiki/Inputs/?SetFreedomCookie
"""
#-------------------------------------------------------------------------------
# Bibliothèques
#-------------------------------------------------------------------------------
import RPi.GPIO as GPIO                 #bibliothèque RPi.GPIO
#-------------------------------------------------------------------------------

#-------------------------------------------------------------------------------
# Fonctions Persos
#-------------------------------------------------------------------------------
import sendSMS                          #envoi SMS via twilio
#-------------------------------------------------------------------------------

pin = 22                                #broche utilisé en entrée
debounce = 5000                         #attente anti-rebond / anti SPAM en ms
GPIO.setmode(GPIO.BCM)                  #utilisation des numéros de ports du processeur
GPIO.setup(pin, GPIO.IN)                #GPIO en entrée (montage Pull-Up pour eviter interferences)

def attente_appui():
        #attente d'un appui par détection de l'évènement passage à 0 (FALLING)
        GPIO.wait_for_edge(pin, GPIO.FALLING, bouncetime=debounce)                                   #<== ligne 37

        #évènement FALLING détecté => on passe à la suite du programme
        sendSMS.sendMessage ('On sonne', '+336XXXXXXXXX')
        sendSMS.sendMessage ("Quelqu'un sonne", '+336YYYYYYYYY')


if __name__ == '__main__':
     """
     Programme par défaut
     """
try:
        while True:
                attente_appui()                                             #<== ligne 50

except (KeyboardInterrupt, SystemExit): #sortie boucle par ctrl-c
        GPIO.remove_event_detect()
        GPIO.cleanup()          #libère toutes les ressources GPIO
        print("\nProgramme interrompu\n")

Avatar du membre
Manfraid
Modérateur
Messages : 1402
Enregistré le : ven. 3 oct. 2014 14:50
Contact :

Re: GPIO.wait_for_edge et KeyboardInterrupt

Message par Manfraid » lun. 29 mai 2017 08:24

Attention a l'indentation, sur le fin du script le try et le except ne sont pas dans le if car au même niveau
NAS : DIY OS Debian: DD250Go + 3x2To + 6To
Raspberry pi : 2B OS : Raspbian
Se tromper est humain, Vraiment foutre la merde nécessite le mot de passe de root.

Bud Spencer
Raspinaute
Messages : 1089
Enregistré le : lun. 15 août 2016 21:38

Re: GPIO.wait_for_edge et KeyboardInterrupt

Message par Bud Spencer » lun. 29 mai 2017 20:53

vite fait ...
sonette.png
sonette.png (38.98 Kio) Vu 6456 fois
Le premier ennemi de la connaissance n’est pas l’ignorance, c’est l’illusion de la connaissance (S. Hawking).

finopat
Messages : 7
Enregistré le : mar. 23 août 2016 12:54

Re: GPIO.wait_for_edge et KeyboardInterrupt

Message par finopat » mar. 30 mai 2017 02:38

merci pour ces réponses,je teste dès que je peux.

Répondre

Retourner vers « Python »