简体   繁体   中英

Read multiple digits from 4x4 keypad using raspberry pi 3

I am doing some attendance related project. Where I am using 4x4 keypad and a LCD display. So the question is, How can I read more than one number from a 4x4 matrix keypad?. I am using pad4pi library. Where I am allowed to read only single number or digit at a time. Now I want to read a number like 1234 or 12345. Could you please help me.

Storing a sequence of keys could be facilitated by using a data structure to store the pressed values. And then clearing it when you need to reset.

class KeyStore:
    def __init__(self):
        #list to store them
        self.pressed_keys = []

    #function to add to list
   def store_key(self,key):
       if(key==‘#’):
      #im printing but you should do whatever it is you intend to do with the sequence of keys. 
      print(self.pressed_keys)
 else:
      self.pressed_keys.append(key)

    #function to clear list
    def clear_keys(self):
        self.pressed_keys.clear()

keys = KeyStore()

# store_key will be called each time a keypad button is pressed
keypad.registerKeyPressHandler(keys.store_key)

I did this but still I am stucked

from pad4pi import rpi_gpio
import time


# Setup Keypad
KEYPAD = [
        ["1","2","3","A"],
        ["4","5","6","B"],
        ["7","8","9","C"],
        ["*","0","#","D"]
]

# same as calling: factory.create_4_by_4_keypad, still we put here fyi:
ROW_PINS = [16, 20, 21, 5] # BCM numbering; Board numbering is: 7,8,10,11 (see pinout.xyz/)
COL_PINS = [6, 13, 19, 26] # BCM numbering; Board numbering is: 12,13,15,16 (see pinout.xyz/)

factory = rpi_gpio.KeypadFactory()

# Try keypad = factory.create_4_by_3_keypad() or 
# Try keypad = factory.create_4_by_4_keypad() #for reasonable defaults
# or define your own:
keypad = factory.create_keypad(keypad=KEYPAD, row_pins=ROW_PINS, col_pins=COL_PINS)


class KeyStore:
    def __init__(self):
        #list to store them
        self.pressed_keys =[]

    #function to add to list
    def store_key(self, key):
        self.pressed_keys.append(key)

    #function to clear list
    def clear_keys(self):
        self.pressed_keys.clear()

keys = KeyStore()

# store_key will be called each time a keypad button is pressed
keypad.registerKeyPressHandler(keys.store_key)
for key in keys.pressed_keys:
    print(key)

try:
    while(True):
        time.sleep(0.2)
except:
    keypad.cleanup()

But its not doing anything.

Thanks for showing me. That code isn't going to do anything. You have to actually do something with the stored data structure after registering keys.

For example:

#change store key function to do something on submission of a certain key that indicated send, will use pound for example.
def store_key(self,key):
     If(key==‘#’):
          #im printing but you should do whatever it is you intend to do with the sequence of keys. 
          print(self.pressed_keys)
     else:
          self.pressed_keys.append(key)

That code will print the internal data structure on # being pressed. Of course I'm assuming the key passed on is a string, but I don't really know I'm not familiar with the library.

here is my code according to changes.

from pad4pi import rpi_gpio
import time


# Setup Keypad
KEYPAD = [
        ["1","2","3","A"],
        ["4","5","6","B"],
        ["7","8","9","C"],
        ["*","0","#","D"]
]

# same as calling: factory.create_4_by_4_keypad, still we put here fyi:
ROW_PINS = [16, 20, 21, 5] # BCM numbering; Board numbering is: 7,8,10,11 (see pinout.xyz/)
COL_PINS = [6, 13, 19, 26] # BCM numbering; Board numbering is: 12,13,15,16 (see pinout.xyz/)

factory = rpi_gpio.KeypadFactory()

# Try keypad = factory.create_4_by_3_keypad() or 
# Try keypad = factory.create_4_by_4_keypad() #for reasonable defaults
# or define your own:
keypad = factory.create_keypad(keypad=KEYPAD, row_pins=ROW_PINS, col_pins=COL_PINS)


class KeyStore:
    def __init__(self):
        #list to store them
        self.pressed_keys =''

    #function to clear string
    def clear_keys(self):
        self.pressed_keys = self.pressed_keys.replace(self.pressed_keys,'')

    def store_key(self,key):
        if key=='#':
            #printing the sequence of keys.
            print(self.pressed_keys)
            self.clear_keys()
        else:
            self.pressed_keys += key

keys = KeyStore()

# store_key will be called each time a keypad button is pressed
keypad.registerKeyPressHandler(keys.store_key)


try:
    while(True):
        time.sleep(0.2)
except:
    keypad.cleanup()

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM