Page 1 sur 1

GPIO.wait_for_edge et KeyboardInterrupt

Posté : ven. 26 mai 2017 14:59
par finopat
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]

Re: GPIO.wait_for_edge et KeyboardInterrupt

Posté : ven. 26 mai 2017 15:17
par dyox
Bonjour,

Essayez simplement pour sortir

Code : Tout sélectionner

except KeyboardInterrupt:      
    GPIO.cleanup()

Re: GPIO.wait_for_edge et KeyboardInterrupt

Posté : dim. 28 mai 2017 08:35
par finopat
Bonjour,
même résultat avec cette syntaxe.

Re: GPIO.wait_for_edge et KeyboardInterrupt

Posté : dim. 28 mai 2017 09:10
par dyox
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)

Re: GPIO.wait_for_edge et KeyboardInterrupt

Posté : lun. 29 mai 2017 08:07
par finopat
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.

Re: GPIO.wait_for_edge et KeyboardInterrupt

Posté : lun. 29 mai 2017 08:12
par finopat
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")

Re: GPIO.wait_for_edge et KeyboardInterrupt

Posté : lun. 29 mai 2017 08:24
par Manfraid
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

Re: GPIO.wait_for_edge et KeyboardInterrupt

Posté : lun. 29 mai 2017 20:53
par Bud Spencer
vite fait ...
sonette.png
sonette.png (38.98 Kio) Vu 6471 fois

Re: GPIO.wait_for_edge et KeyboardInterrupt

Posté : mar. 30 mai 2017 02:38
par finopat
merci pour ces réponses,je teste dès que je peux.