Page 1 sur 1

Dommage !

Posté : ven. 10 nov. 2017 15:06
par Ferois
Boonjour,

J'ai un programme qui comprend :

Code : Tout sélectionner

control_B=38
GPIO.setmode(GPIO.BOARD)
GPIO.setup(control_B,GPIO.IN,pull_up_down=GPIO.PUD_UP)
if GPIO.add_event_detect(control_B,GPIO.BOTH):
    if GPIO.input(control_B):
        print ("contacts ouverts')
    else:
        time.sleep(100)
        print ("contacts fermes')
la réponse de python :
if GPIO.add_event_detect(control_B,GPIO.BOTH):
RuntimeError: Conflicting edge detection already enabled for this GPIO channel

J'ai l'impression que le programme considère que le GPIO est toujours à 1 du fait de la résistance pull-up, et qu'il juge impossible l’existence d'un front.

Alors j'ai modifié la première ligne du programme pour une résistance pull-up extérieure :

Code : Tout sélectionner

GPIO.setup(control_B,GPIO.IN)
et j'ai la même réponse!

Pourquoi ? Et comment contourner l'obstacle ?

Re: Dommage !

Posté : ven. 10 nov. 2017 20:33
par jelopo
Bonjour,

Je crois qu'il dit que "GPIO.add_event_detect(control_B,GPIO.BOTH)" à déjà été fait. En fait à chaque boucle de if il le refait.
Il me semble que cette commande n'est pas une mesure d'état mais un début de détection.
Je pense qu'il faut qu'elle soit initialisée qu'une fois dans le script donc avant le if, ensuite pour la mesure il faut un "GPIO.event_dectect"

Si certains on l'habitude de manipuler les GPIO sous Python, merci de nous venir en aide.

A+

Re: Dommage !

Posté : sam. 11 nov. 2017 09:02
par nexen
bonjour,

Le add_event est à usage unique ... donc dans ta boucle il tente de rajouter à chaque fois un event


voici mon code pour tester un bouton et actionner un relay de mon coté

Code : Tout sélectionner

import RPi.GPIO as GPIO                 #bibliothèque RPi.GPIO
Button_Red = 5
Button_Green = 6
RelayPin = 20
RLed = 19
GLed = 16
print 'Debut ...' 
GPIO.setmode(GPIO.BCM)                  #utilisation des numéros de ports du
                                        #processeur
GPIO.setup(Button_Red, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(Button_Green, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(RelayPin, GPIO.OUT)
GPIO.setup(RLed, GPIO.OUT) 
GPIO.setup(GLed, GPIO.OUT) 
while True:
	time.sleep(0.5) # test tempo lecture fichier xml
	input_state_START = GPIO.input(Button_Green)
	input_state_STOP = GPIO.input(Button_Red)
	Relayinput = GPIO.input(RelayPin)
	RLedInput  = GPIO.input(RLed)
	GLedInput  = GPIO.input(GLed)

if (input_state_START == False and Relayinput == 0 ):
		print('Button_Green Pressed' + str(input_state_START))
		GPIO.output(RelayPin, GPIO.HIGH)
		GPIO.output(GLed, GPIO.HIGH)      #sortie 16 high

if (input_state_STOP == False and Relayinput == 1 )
		print('Button_RED Pressed' + str(input_state_START))
		GPIO.output(RelayPin, GPIO.LOW)
		GPIO.output(RLed, GPIO.HIGH)      #sortie 19 high
		

C'est un exemple mais dans ton cas :

Code : Tout sélectionner

control_B=38
GPIO.setmode(GPIO.BOARD)
GPIO.setup(control_B,GPIO.IN,pull_up_down=GPIO.PUD_UP)
while True :
    if GPIO.input(control_B):
        print ("contacts ouverts')
    else:
        time.sleep(100)
        print ("contacts fermes')
ou aprés lecture du Add_event : on ajoute une FONCTION sur un événement du bouton ;)

Code : Tout sélectionner



def buttonPressed():
    print ("contacts")
    
    
control_B=38
GPIO.setmode(GPIO.BOARD)
GPIO.setup(control_B,GPIO.IN,pull_up_down=GPIO.PUD_UP)
GPIO.add_event_detect(control_B, GPIO.FALLING, callback=lambda x: buttonPressed(), bouncetime=2000)

PS : tu as des erreurs entre ' et " sur tes prints ;)

Re: Dommage !

Posté : sam. 11 nov. 2017 16:06
par Ferois
Merci les Amis

Je comprends mieux cette commande add_event_detect.
Tout changement d'état de la broche 38 durant la boucle while entraine une interruption qui appelle un sous programme.
A l'issue de ce sous programme la boucle continue après le point d'interruption

Code : Tout sélectionner

control_B=38
GPIO.setmode(GPIO.BOARD)
GPIO.setup(control_B,GPIO.IN,pull_up_down=GPIO.PUD_UP)

def position_control_B()
    time.sleep(5)
    if GPIO.input(control_B):
        print ('contacts ouverts')
    else:
        print ('contacts fermes')

GPIO.add_event_detect(control_B,GPIO.BOTH, bouncetime=2000, callback=lambda x: position_control_B())

while True:
    mon programme
nexen a écrit :tu as des erreurs entre ' et " sur tes prints
Tu as l'oeil :D