Petit programme bouton poussoir

Bonsoir à tout le monde !
Voilà, je suis tout débutant dans la création de programme :grimacing:

Voilà ce que je souhaite faire :

Créer un programme qui se lance en fond de tâche au boot du pi, qui surveille l’état de deux boutons poussoirs (type momentané) dans le but d’activer et désactiver deux relais qui leur sont respectivement attribués.

Pour être plus précis, je veux changer l’état de sortie du gpio sur lequel est le relais. (En gros une pression il s’allume une autre pression il s’éteint)

J’ai bricolé quelque chose, j’aimerais votre avis car il y a sûrement des bêtises… en espérant que ça surcharge pas trop le pi (j’ai mis des timesleeps dans ce but)

import time
import RPi.GPIO as GPIO

boutonON = 23
relaisON = 4
boutonLED = 24
relaisLED = 17

GPIO.setmode(GPIO.BCM)

GPIO.setup(boutonON, GPIO.IN, pull_up_down = GPIO.PUD_DOWN)
GPIO.setup(boutonLED, GPIO.IN, pull_up_down = GPIO.PUD_DOWN)
GPIO.setup(relaisON, GPIO.OUT)
GPIO.setup(relaisLED, GPIO.OUT)

while True:
    etat1 = GPIO.input(boutonON)
    etat2 = GPIO.input(boutonLED)
    
    if (etat1 == 0) :
        GPIO.output(4, not GPIO.input(4))
    	time.sleep(2)
    if (etat2 == 0) :
        GPIO.output(17, not GPIO.input(17))
    	time.sleep(2)
    time.sleep(1)

Merci d’avance :blush:

hello,

le GPIO 4 ou GPIO du relaisON est déclaré en sortie donc le GPIO.input va pas fonctionner …
de plus etat1 sera egal à zéro si le bouton n’est pas appuyé ( c’est a dire quasiment tous le temps…)

dans ce cas le plus simple ( les puristess me pardonneront lol ) c’est de jouer avec un flag. ( un drapeau qui va suivre l’état du relais )

en gros un truc genre :

flag =0
while True: 
   if GPIO.input(BoutonON) == GPIO.HIGH:
      print("Button was pushed!")
      time.sleep(1)
      if flag == 0:
        GPIO.output(4, 1)
        flag = 1
      else:
        GPIO.output(4, 0)
        flag = 0

d’abord au début du programme on l’initialise le flag à 0 puis si on appuie sur le bouton on allume le relais et on met le flag a 1 et la prochaine fois qu’on appuie on fait l’inverse.

NB: dans un premier temps, tu peux mettre des « print » a la place du GPIO.output dans les tests pour avoir l’état ça permet de tester sans le relais branché…

Bonjour! :blush:
Merci pour ton attention
La petite subtilité c’est que les relais vont aussi être manipulés en dehors de ce programme (via une appli et une page web)
Le but du programme est d’ajouter un bouton physique sur ces relais.
Donc j’ai l’impression que l’astuce des flags (qui est super intéressante) n’est pas idéale car leur valeur ne changera pas lors de l’activation des relais en dehors du programme :thinking:

Citation
GPIO 4 ou GPIO du relaisON est déclaré en sortie donc le GPIO.input va pas fonctionner …

J’ai lu quelque part que l’état du gpio pouvait être tout de même lu malgré qu’il soit en output :thinking:

j’ai appris un truc effectivement on peut lire un port en output:

import RPi.GPIO as GPIO

GPIO.setmode(GPIO.BOARD)
relaisON = 15
GPIO.setup(relaisON, GPIO.OUT)

etat1 = 0
print(etat1)

GPIO.output(relaisON, GPIO.HIGH)

etat1 = GPIO.input(relaisON)
print(etat1)

GPIO.output(relaisON, GPIO.LOW)

etat1 = GPIO.input(relaisON)
print(etat1)

GPIO.cleanup (relaisON) 

Bonjour !
Après quelques recherches… Je vous fait un petit retour pour ceux qui passent par là et que ça pourrait aider :slight_smile:

Donc, le code que j’ai posté dans mon premier message fonctionne parfaitement.
J’avais un petit problème d’instabilité sur mes inputs boutons car mon câblage est long, et chope donc beaucoup d’interférences/bruits, et il s’avère que les résistances pull up/down intégré au pi sont trop élevés pour stabiliser parfaitement tout ça.
J’ai donc câblé des résistances externe de 5kΩ et plus de problème de clignotement intempestifs :stuck_out_tongue:

Comme on l’a vu, on peut très bien choper l’état d’une sortie et l’utiliser.

Tout dépend du cablage :slight_smile: mon bp est câblé sur la masse donc mon input est 0 quand j’appuie…