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

Python Discussion :

Compteur d’impulsions cadran téléphonique python


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    musicien bidouilleur
    Inscrit en
    Décembre 2018
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : musicien bidouilleur

    Informations forums :
    Inscription : Décembre 2018
    Messages : 28
    Par défaut Compteur d’impulsions cadran téléphonique python
    Bonjour,

    Je cherche à utiliser un vieux tel à cadran avec un raspbery pi pour déclencher des sons en fonction du numéro composé.
    J’ai trouvé différents tutos, mais cela ne correspondait pas exactement à ce que je voulais.
    Je suis donc parti de zéro, et je suis débutant en python…

    J’ai fait ce petit programme afin que lorsque l’utilisateur actionne le cadran, le chiffre correspondant s’affiche :
    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
     
        import RPi.GPIO as GPIO
        import time
     
        GPIO.setmode(GPIO.BCM)
        INPT = 17
     
        GPIO.setup(INPT, GPIO.IN)
        COMPTEUR = 0
     
        while True:
        while ( GPIO.input( INPT ) == False):
        COMPTEUR = 0
        pass
        while ( GPIO.input( INPT ) == True):
        COMPTEUR += 1
        time.sleep(0.17)
        print COMPTEUR
     
        GPIO.cleanup()
    malheureusement le compteur ne s’incrémente pas, il ne me renvoie que des 1.
    et je n’arrive pas à résoudre le problème… un peu d’aide serait bienvenue.
    Merci

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 752
    Par défaut
    Salut,

    Sans disposer de la même configuration matérielle et d'un oscilloscope, pas grand monde pourra vous aider.
    Côté programmation, vous devez pouvoir vous inspirer de sources qui, à priori, fonctionnent. Ce qui suppose savoir lire ce genre de codes et arriver à décortiquer comment ils fonctionnent (signal de l'oscillo. en tête).
    Ce qui vous donne une idée de tout ce qu'il faudrait maîtriser avant de pouvoir se lancer la dedans sans être perdu.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre averti
    Homme Profil pro
    musicien bidouilleur
    Inscrit en
    Décembre 2018
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : musicien bidouilleur

    Informations forums :
    Inscription : Décembre 2018
    Messages : 28
    Par défaut
    Merci pour votre réponse,

    effectivement, j'avais déjà vu ce code qui est un peu plus complexe que ce que je veux faire...
    Pour ce qui est mon code, j'y suis presque, car lorsque je tourne le cadran, le code me renvoie le bon nombre de 1.
    Le problème c'est qu'entre chaque 1 reçu, il doit y avoir un 0 qui remet le compteur à zéro...
    Il faudrait que lorsque le programme reçoit un zéro, il déclenche un timer qui chronomètre le temps passé jusqu'au prochain 1, et si ce temps est trop long (genre 1/2s par ex), on en déduit que la numérotation est fini, on affiche le nb et on remet à zéro le compteur, et c'est cela que je ne sais pas faire...

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 752
    Par défaut
    Citation Envoyé par jojomonk Voir le message
    Il faudrait que lorsque le programme reçoit un zéro, il déclenche un timer qui chronomètre le temps passé jusqu'au prochain 1, et si ce temps est trop long (genre 1/2s par ex), on en déduit que la numérotation est fini, on affiche le nb et on remet à zéro le compteur, et c'est cela que je ne sais pas faire...
    C'est exactement ce que fait le code que je vous ai indiqué.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre averti
    Homme Profil pro
    musicien bidouilleur
    Inscrit en
    Décembre 2018
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : musicien bidouilleur

    Informations forums :
    Inscription : Décembre 2018
    Messages : 28
    Par défaut
    oui sauf que j'ai cette erreur, lorsque je lance ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    RuntimeError: Failed to add edge detection
    Pour info j'ai modifié le code comme ci dessous :
    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
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
     
    # Rotary Dial Parser
    # Expects the following hardware rules:
    # 1 is 1 pulse
    # 9 is 9 pulses
    # 0 is 10 pulses
     
    import RPi.GPIO as GPIO
    from threading import Timer
    import time
     
    class RotaryDial:
     
        # We'll be reading BCM GPIO 4 (pin 7 on board)
        pin_rotary = 17
     
        # We'll be reading on/off hook events from BCM GPIO 3
        #pin_onhook = 3
     
        # After 900ms, we assume the rotation is done and we get
        # the final digit. 
        digit_timeout = 0.9
     
        # We keep a counter to count each pulse.
        current_digit = 0
     
        # Simple timer for handling the number callback
        number_timeout = None
     
        last_input = 0
     
        # Timer to ensure we're on hook
        #onhook_timer = None
        #should_verify_hook = True
     
        def __init__(self):
            # Set GPIO mode to Broadcom SOC numbering
            GPIO.setmode(GPIO.BCM)
     
            # Listen for rotary movements
            GPIO.setup(self.pin_rotary, GPIO.IN)
            GPIO.add_event_detect(self.pin_rotary, GPIO.BOTH, callback = self.NumberCounter)
     
            # Listen for on/off hooks
         #   GPIO.setup(self.pin_onhook, GPIO.IN)
          #  GPIO.add_event_detect(self.pin_onhook, GPIO.BOTH, callback = self.HookEvent, bouncetime=100)
     
           # self.onhook_timer = Timer(2, self.verifyHook)
            #self.onhook_timer.start()
     
        # Handle counting of rotary movements and respond with digit after timeout
        def NumberCounter(self, channel):
            input = GPIO.input(self.pin_rotary)
            #print "[INPUT] %s (%s)" % (input, channel)
            if input and not self.last_input:
                self.current_digit += 1
     
                if self.number_timeout is not None:
                    self.number_timeout.cancel()
     
                self.number_timeout = Timer(self.digit_timeout, self.FoundNumber)
                self.number_timeout.start()
            self.last_input = input
       #     time.sleep(0.002)
     
        # Wrapper around the off/on hook event 
        #def HookEvent(self, channel):
         #   input = GPIO.input(self.pin_onhook)
          #  if input:
           #     self.hook_state = 1
            #    self.OffHookCallback()
            #else:
             #   self.hook_state = 0
              #  self.OnHookCallback()
     
        #def StopVerifyHook(self):
         #   self.should_verify_hook = False
     
        #def verifyHook(self):
         #   while self.should_verify_hook:
          #      state = GPIO.input(self.pin_onhook) 
           #     self.OnVerifyHook(state)
            #    time.sleep(1)
     
        # When the rotary movement has timed out, we callback with the final digit
        def FoundNumber(self):
            if self.current_digit == 10:
                self.current_digit = 0
            self.NumberCallback(self.current_digit)
            self.current_digit = 0
     
        # Handles the callbacks we're supplying
        def RegisterCallback(self, NumberCallback, OffHookCallback, OnHookCallback, OnVerifyHook):
            self.NumberCallback = NumberCallback
            #self.OffHookCallback = OffHookCallback
            #self.OnHookCallback = OnHookCallback
            #self.OnVerifyHook = OnVerifyHook
     
            input = GPIO.input(self.pin_onhook)
            #if input:
             #   self.OffHookCallback()
            #else:
    #self.OnHookCallback()
     
    while True:
        RotaryDial()
        GPIO.cleanup()
    car je n'utilise pas l'interrupteur de décroché/raccroché du tel...

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 752
    Par défaut
    Citation Envoyé par jojomonk Voir le message
    oui sauf que j'ai cette erreur, lorsque je lance ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    RuntimeError: Failed to add edge detection
    Un peu de recherche sur Internet vous indiquerait qu'il s'agit peut être d'un problème de PIN (là vous avez branché le truc) ou de version...

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Compteur d'accès en python
    Par baptiste_m dans le forum Réseau/Web
    Réponses: 1
    Dernier message: 02/02/2013, 14h12
  2. CORBA & PYTHON
    Par stan91stan dans le forum CORBA
    Réponses: 5
    Dernier message: 10/06/2004, 12h32
  3. Remise à 0 d'un compteur automatique
    Par missllyss dans le forum SQL
    Réponses: 4
    Dernier message: 15/12/2003, 16h46
  4. Simulateur téléphonique
    Par vassilux dans le forum Autres Logiciels
    Réponses: 6
    Dernier message: 04/11/2003, 16h16
  5. Migration Access > SQL Server (suite) : Compteur
    Par LadyArwen dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 06/03/2003, 14h08

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