User avatar
Nikolls
Posts: 3
Joined: Wed May 29, 2019 11:34 am

Problème de réactivité lecture pavé numérique matriciel

Mon Jan 13, 2020 5:44 pm

Hello à tous!

Petit post qui fait suite longtemps après à mon premier: https://www.raspberrypi.org/forums/view ... p?t=241631
Je posterais éventuellement des photos si y'a des demandes...

J'ai donc bien construit ma malle avec plein de truc à l'intérieur mais je me retrouve avec un petit soucis. J'ai acheté un pavé numérique matriciel pour pouvoir rentrer des chiffres. Celui-ci plus précisément : Adafruit 3x4 Phone-style Matrix Keypad

Image
Image

Le problème c'est qu'en temps qu'apprentie codeur python j'ai absolument pas réussi a coder un truc moi-même. Du coup j'ai fait un copié-collé (en essayant de comprendre au maximum évidement!) une fonction que j'ai trouvé sur le net et qui pour le coup marche avec.

Mais alors si cela marche, quel est le problème?


Ben le soucis c'est que quand je fais appel à ma fonction il faut rester appuyer un moment sur chaque touche du pavé pour que cela fonctionne.
Exemple j'ai mon 1 affiché en gros a l'écran (qui montre le dernier input). Si je veux que le 2 soit prit en compte, je dois rester appuyer bien 1 à 2 sec sur mon 2 avant que cela soit prit en compte et que le 2 s'affiche à l'écran.
J'aimerais que chaque input soit instantané évidement.

Voilà le code de la classe entière que j'utilise:

Code: Select all

class keypad():
    # CONSTANTS
    KEYPAD = [
        ['A', 'B', 'C'],
        ['D', 'E', 'F'],
        ['G', 'H', 'I'],
        ["*", '0', "#"]
    ]

    ROW = [11, 8, 7, 5]
    COLUMN = [10, 9, 25]

    def __init__(self):
        GPIO.setmode(GPIO.BCM)

    def getKey(self):

        # Set all columns as output low
        for j in range(len(self.COLUMN)):
            GPIO.setup(self.COLUMN[j], GPIO.OUT)
            GPIO.output(self.COLUMN[j], GPIO.LOW)

        # Set all rows as input
        for i in range(len(self.ROW)):
            GPIO.setup(self.ROW[i], GPIO.IN, pull_up_down=GPIO.PUD_UP)

        # Scan rows for pushed key/button
        # A valid key press should set "rowVal"  between 0 and 3.
        rowVal = -1
        for i in range(len(self.ROW)):
            tmpRead = GPIO.input(self.ROW[i])
            if tmpRead == 0:
                rowVal = i

        # if rowVal is not 0 thru 3 then no button was pressed and we can exit
        if rowVal < 0 or rowVal > 3:
            self.exit()
            return

        # Convert columns to input
        for j in range(len(self.COLUMN)):
            GPIO.setup(self.COLUMN[j], GPIO.IN, pull_up_down=GPIO.PUD_DOWN)

        # Switch the i-th row found from scan to output
        GPIO.setup(self.ROW[rowVal], GPIO.OUT)
        GPIO.output(self.ROW[rowVal], GPIO.HIGH)

        # Scan columns for still-pushed key/button
        # A valid key press should set "colVal"  between 0 and 2.
        colVal = -1
        for j in range(len(self.COLUMN)):
            tmpRead = GPIO.input(self.COLUMN[j])
            if tmpRead == 1:
                colVal = j

        # if colVal is not 0 thru 2 then no button was pressed and we can exit
        if colVal < 0 or colVal > 2:
            self.exit()
            return

        # Return the value of the key pressed
        self.exit()
        return self.KEYPAD[rowVal][colVal]

    def exit(self):
        # Reinitialize all rows and columns as input at exit
        for i in range(len(self.ROW)):
            GPIO.setup(self.ROW[i], GPIO.IN, pull_up_down=GPIO.PUD_UP)
        for j in range(len(self.COLUMN)):
            GPIO.setup(self.COLUMN[j], GPIO.IN, pull_up_down=GPIO.PUD_UP)
Et j’appelle dans mon code la fonction comme ceci:

Code: Select all

digit = kp.getKey()
            if digit != None:
                enigma5= updateEnigma5(digit)
                if digit=='A':
                    textinput='1'
                if digit=='B':
                    textinput='2'
                if digit=='C':
                    textinput='3'
                if digit=='D':
                    textinput='4'
                if digit=='E':
                    textinput='5'
                if digit=='F':
                    textinput='6'
                if digit=='G':
                    textinput='7'
                if digit=='H':
                    textinput='8'
                if digit=='I':
                    textinput='9'
                if digit=='0':
                    textinput='0'
                if digit=='*':
                    textinput='*'
                if digit=='#':
                    textinput='#'
Déso pour la qualité du code, je suppose qu'il y'a des façon plus élégantes de faire ce que je fais mais bon, je me démerde comme je peux.

Donc voilà si quelqu’un sait pourquoi je dois rester appuyer sur la touche pour que cela fonctionne je lui serais gré de m'en faire part!
Si vous avez une solution sans créer de classe (je suis naze en prog objet) je suis preneur aussi!

Merci en tout cas d'avoir jeté un oeuil à mon problème!

totoharibo
Posts: 4283
Joined: Thu Jan 24, 2013 8:43 am

Re: Problème de réactivité lecture pavé numérique matriciel

Mon Jan 13, 2020 8:35 pm

question con (je ne connais pas ton projet) : un pad numérique USB ça le fait pas ?

User avatar
Nikolls
Posts: 3
Joined: Wed May 29, 2019 11:34 am

Re: Problème de réactivité lecture pavé numérique matriciel

Tue Jan 14, 2020 12:46 pm

Et malheureusement non pour deux raison:
1 J'ai pas la place d'intégrer quelque chose de plus gros vu que je suis limité en place. En gros j'ai tout mes bouton encastré dans une grande plaque en plexi et celle dédiée au numpad ne peut vraiment pas etre augmenté
2 Meme si j'avais la place, je devrais du coup passer par des input clavier que je ne sais pas gérer avec le code


Return to “Français”