StangPi
Posts: 68
Joined: Wed Feb 24, 2016 9:26 pm
Location: Indiana, USA

Program not running

Thu Mar 01, 2018 11:26 pm

Im not super new with the pi. Tinkered around with pre-written programs and a few remote sessions but nothing special.

Currently I am working on a security project and the RPi3 I am using, does not want to run what I have written

What I have done to try to get it working:
double-clicked the file
opened within Python 3 IDLE and selected run
used Terminal and entered the following commands
-- python keypad.py
-- python3 keypad.py
-- sudo python keypad.py
-- sudo python3 keypad.py
all of these were used while sitting in and out of the folder directory.

no idea where I am going wrong, any help would be appreciated

klricks
Posts: 6614
Joined: Sat Jan 12, 2013 3:01 am
Location: Grants Pass, OR, USA
Contact: Website

Re: Program not running

Fri Mar 02, 2018 12:18 am

StangPi wrote:
Thu Mar 01, 2018 11:26 pm
....no idea where I am going wrong, any help would be appreciated
Neither does anyone else....
You forgot to give the exact error message(s).....
You can also post your code here and be sure to use the code tags button [</>] so the code appears:

Code: Select all

Like this
Unless specified otherwise my response is based on the latest and fully updated Raspbian Buster w/ Desktop OS.

tinkerBOY
Posts: 9
Joined: Thu Mar 01, 2018 9:35 am
Location: Baguio City, PH
Contact: Website Facebook

Re: Program not running

Fri Mar 02, 2018 7:51 am

Paste your code and the error message. What version of OS you are using?
“Everything should be made as simple as possible, but not simpler.” Albert Einstein

StangPi
Posts: 68
Joined: Wed Feb 24, 2016 9:26 pm
Location: Indiana, USA

Re: Program not running

Fri Mar 02, 2018 8:12 pm

Sorry to all who read, and or replied to this post lol. I finally got the program to run.

While in terminal, I navigated my way to the folder location, listed the

Code: Select all

dir
and entered

Code: Select all

sudo python Keypad2.py
and BOOM, it worked.

Now Im working on using the keypad script as part of a whole security access script I am writing, based off of what pieces I have come across on the interwebs. Will post what I have when I achieve any worth while results.

A new snag I discovered, is trying to identify one of the buttons as a confirmation button. IE:

Code: Select all

 'E' = 'Enter' 

pcmanbob
Posts: 7255
Joined: Fri May 31, 2013 9:28 pm
Location: Mansfield UK

Re: Program not running

Fri Mar 02, 2018 8:20 pm

You should not need to use sudo to run a python program accessing the GPIO .

if you created the program or edited it using sudo nano then you should no do that you only need to create the program as the pi user not as root.

again no one can help you if you don't post your code.
We want information… information… information........................no information no help
The use of crystal balls & mind reading are not supported

StangPi
Posts: 68
Joined: Wed Feb 24, 2016 9:26 pm
Location: Indiana, USA

Re: Program not running

Sat Mar 03, 2018 12:01 am

So far here is what I have:
Keypad code:

Code: Select all

import RPi.GPIO as GPIO
import time
 
GPIO.setmode (GPIO.BOARD)
 
MATRIX = [[1,2,3,'A'],
          [4,5,6,'B'],
          [7,8,9,'C'],
          [0,'F','E','D']]
 
COL = [7,11,13,15]
ROW = [12,22,29,31]
 
for j in range(4):
    GPIO.setup(COL[j], GPIO.OUT)
    GPIO.output (COL[j], 1)
 
for i in range(4):
    GPIO.setup(ROW[i], GPIO.IN, pull_up_down = GPIO.PUD_UP)
 
try:
    while(True):
        for j in range(4):
            GPIO.output(COL[j],0)
 
            for i in range(4):
                if GPIO.input(ROW[i]) == 0:
                    time.sleep(0.02)
                    print MATRIX [i][j]
                    while(GPIO.input(ROW[i]) == 0):
                        pass
                     
            GPIO.output(COL[j],1)
except KeyboardInterrupt:
    GPIO.cleanup()
    
Verification code:

Code: Select all

import time
import Keypad2
 
choice = input
choice = int(choice)
 
if choice == 1:
    User1()
 
elif choice == 2:
    User2()
 
def User1():
    time.sleep(1)
    # Password verification code goes here
    if input == "1234ABCD"
        print("Welcome User1!")
    else:
        print("Access Denied!!")
 
def User2():
    time.sleep(1)
    # Password verification code goes here
    if input == "5678EFGH"
        print("Welcome User2!")
    else:
        print("Access Denied!!")
With everything the way it currently is, i have a few things to tweak:
1-fix the keypad code so that i do not get multiple inputs when i press a key.
-Originally that is what the time.sleep(0.02) was for but it didnt work.
2-create the verification script to use input from the keypad and verify it against some pre-determined code.
-Idk if it would be best to do an array, or just have it compare the input to some string within a hidden or encrypted file.
3-Convert a button into a function instead of a value.
-Use letter 'E' as the "ENTER" function.

pcmanbob
Posts: 7255
Joined: Fri May 31, 2013 9:28 pm
Location: Mansfield UK

Re: Program not running

Sat Mar 03, 2018 11:55 am

fixing the keypad entry so that you don't get repeating entries if you keep the key pressed is easy change the pass for a time.sleep after your while line

Code: Select all

try:
    while(True):
        for j in range(4):
            GPIO.output(COL[j],0)
 
            for i in range(4):
                if GPIO.input(ROW[i]) == 0:
                    time.sleep(0.02)
                    print MATRIX [i][j]
                    while(GPIO.input(ROW[i]) == 0):
                        time.sleep(0.02)
                     
            GPIO.output(COL[j],1)
            
now it will just loop round wait 0.02 sec before checking the gpio input again.

using E for enter just needs a simple if statement so that if E is pressed you go off and do what ever it is you want to do when its entered.
We want information… information… information........................no information no help
The use of crystal balls & mind reading are not supported

StangPi
Posts: 68
Joined: Wed Feb 24, 2016 9:26 pm
Location: Indiana, USA

Re: Program not running

Sat Mar 03, 2018 3:59 pm

Code: Select all

import time
#import Keypad2
 
choice = raw_input("Make Selection: 1-2!")
	while(choice != '1') and (choice != '2'):
		choice = raw_input("Make Selection: 1-2!")
 
if choice == '1':
    User1()
 
elif choice == '2':
    User2()
 
def User1():
	print("Welcome")
	
	while True:
		PassCode == raw_input("Please Enter Code: ")
		
		if PassCode == 'A12345':
			time.sleep(1)
			print("Welcome!!")
When i make the selection i get the error:

Code: Select all

Traceback (most recent call last):
   File: "Power-On.py", line 15, in <module>
      User1()
NameError: name 'User1()' is not defined


Idk if defined function User1() correctly, if at all. Or if it is some other issue thinking the problem is the missing definition.

pcmanbob
Posts: 7255
Joined: Fri May 31, 2013 9:28 pm
Location: Mansfield UK

Re: Program not running

Sat Mar 03, 2018 7:33 pm

The error message is telling you you have not defined user1() because when you try to call it the function program has not yet reached that part of the code.

You need to put your def function at the start of your program then the main loop or main part of the code after it.
We want information… information… information........................no information no help
The use of crystal balls & mind reading are not supported

StangPi
Posts: 68
Joined: Wed Feb 24, 2016 9:26 pm
Location: Indiana, USA

Re: Program not running

Sun Mar 04, 2018 6:42 am

Sooo...in python: main function is preceded by the inner functions which make up the script?

pcmanbob
Posts: 7255
Joined: Fri May 31, 2013 9:28 pm
Location: Mansfield UK

Re: Program not running

Sun Mar 04, 2018 10:35 am

StangPi wrote:
Sun Mar 04, 2018 6:42 am
Sooo...in python: main function is preceded by the inner functions which make up the script?
Yes you have to define the function in the code before the line were you are going to call it.

So the order I would write a simple program would be.

imports
set up gpio
set variables
def functions

then main loop or main program code
We want information… information… information........................no information no help
The use of crystal balls & mind reading are not supported

StangPi
Posts: 68
Joined: Wed Feb 24, 2016 9:26 pm
Location: Indiana, USA

Re: Program not running

Sun Mar 04, 2018 3:54 pm

So the order I would write a simple program would be.

imports
set up gpio
set variables
def functions

then main loop or main program code
Thats something ill have to get used to lol. I started learning programming using C++ and its slightly different.

inclusions
variables
main loop/program
functions which make up the whole program.

I already have the Keypad GPIO script written up, and have the main script set to import it but it doesnt seem to be integrating correctly.

When i start the script, it loads up the Keypad script first but wont engage the beginning of the selection script until i press Ctrl+C to end it.

Currently working on proper integration.
Last edited by StangPi on Sun Mar 04, 2018 4:57 pm, edited 1 time in total.

StangPi
Posts: 68
Joined: Wed Feb 24, 2016 9:26 pm
Location: Indiana, USA

Re: Program not running

Sun Mar 04, 2018 4:27 pm

I think I have something which might work, but idk. The issue would be modifying it to accommodate more than 1 user. Not sure if i would write it into the different user section of the script. For now I have it written into the Keypad script for testing purposes.

Code: Select all

import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BOARD)

MATRIX = [[1,2,3,'A'],
          [4,5,6,'B'],
          [7,8,9,'C'],
          [0,'F','E','D']]

ROW = [7,11,13,15]
COL = [12,22,29,31]

for j in range(4):
    GPIO.setup(COL[j], GPIO.OUT)
    GPIO.output(COL[j], 1)

for i in range(4):
    GPIO.setup(ROW[i], GPIO.IN, pull_up_down=GPIO.PUD_UP)

passcode = 'A12345'
attempt = ' '
try:
    while (True):
        for j in range(4):
            GPIO.output(COL[j], 0)

            for i in range(4):
                if GPIO.input(ROW[i]) == 0:
                    time.sleep(0.01)
                    while (GPIO.input(ROW[i]) == 0):
                        pass
                    attempt += MATRIX[i][j]
                    if len(attempt) == len(passcode):
                        if attempt == passcode:
                            print("Welcome User")
                            print("Ta-da!!!")
                        else:
                            print("Denied!!")
                            print("Try Again!!")
                        attempt = ""
            time.sleep(0.01)
                    
            GPIO.output(COL[j], 1)
except KeyboardInterrupt:
    GPIO.cleanup()
My next attempt will be to insert:

Code: Select all

passcode = 'A12345'
attempt = ' '
attempt += MATRIX[i][j]
                    if len(attempt) == len(passcode):
                        if attempt == passcode:
                            print("Welcome User")
                            print("Ta-da!!!")
                        else:
                            print("Denied!!")
                            print("Try Again!!")
                        attempt = ""
            time.sleep(0.01)
                    
            GPIO.output(COL[j], 1)
into each user's function block and hope it works. Whether it does or doesn't ill post any results.

StangPi
Posts: 68
Joined: Wed Feb 24, 2016 9:26 pm
Location: Indiana, USA

Re: Program not running

Sun Mar 04, 2018 6:47 pm

first attempt did not work:

Code: Select all

import time
#import Keypad2
 
choice = raw_input("Make Selection: 1-2!")
	while(choice != '1') and (choice != '2'):
		choice = raw_input("Make Selection: 1-2!")
 
if choice == '1':
    User1()
 
elif choice == '2':
    User2()
 
def User1():
	print("Welcome")
	
	while True:
		PassCode = raw_input("Please Enter Code: ")
		
		if PassCode == 'A12345':
		      attempt = ' '
		      attempt += MATRIX[i][j]
		      if len(attempt) == len(PassCode):
		           if attempt == PassCode:
			          time.sleep(1)
			          print("Welcome!!")
			          
		else:
		        print("Denied!!")
		        print("Try Again!!")
		attempt == ' '
		
	time.sleep(0.02)
	
	GPIO.output(COL[j], 1)


It gives me the error:

Code: Select all

NameError: global name 'MATRIX' is not defined
Im assuming that the import keypad script isn't properly linking with the security script.

User avatar
Paeryn
Posts: 2738
Joined: Wed Nov 23, 2011 1:10 am
Location: Sheffield, England

Re: Program not running

Sun Mar 04, 2018 10:50 pm

StangPi wrote:
Sun Mar 04, 2018 6:47 pm
first attempt did not work:

Code: Select all

import time
#import Keypad2
 
choice = raw_input("Make Selection: 1-2!")
	while(choice != '1') and (choice != '2'):
		choice = raw_input("Make Selection: 1-2!")
 
if choice == '1':
    User1()
 
elif choice == '2':
    User2()
 
def User1():
	print("Welcome")
	
	while True:
		PassCode = raw_input("Please Enter Code: ")
		
		if PassCode == 'A12345':
		      attempt = ' '
		      attempt += MATRIX[i][j]
		      if len(attempt) == len(PassCode):
		           if attempt == PassCode:
			          time.sleep(1)
			          print("Welcome!!")
			          
		else:
		        print("Denied!!")
		        print("Try Again!!")
		attempt == ' '
		
	time.sleep(0.02)
	
	GPIO.output(COL[j], 1)


It gives me the error:

Code: Select all

NameError: global name 'MATRIX' is not defined
Im assuming that the import keypad script isn't properly linking with the security script.
The only reference to your keypad module is the commented out line

Code: Select all

#import Keypad2
Even if it was imported MATRIX wouldn't be valid as it would need qualifying with the module's name e.g. Keypad2.MATRIX. You have other variables in User1() which don't exist in the code you just gave, i, j & COL.

Also attempt is always either a space (see below as to why it isn't) or a space plus one element of MATRIX so can never equal the PassCode which is given as "A12345".

It looks like you meant to set attempt to a space at the end but you used == which will just compare the two values and ignore the result.
She who travels light — forgot something.

StangPi
Posts: 68
Joined: Wed Feb 24, 2016 9:26 pm
Location: Indiana, USA

Re: Program not running

Mon Mar 05, 2018 1:29 am

So then if MATRIX needs to be defined within the main function, should I just write it into the main script and not worry about importing?

User avatar
Paeryn
Posts: 2738
Joined: Wed Nov 23, 2011 1:10 am
Location: Sheffield, England

Re: Program not running

Mon Mar 05, 2018 2:47 am

It's fine to have all the keypad stuff in a separate module. What you appear to have tried to do was cut parts of the code from Keypad2.py and stick them into the function User1(), but you only copied parts missing out vital bits. Python won't guess what you meant to do, it will (try to) do exactly what you have told it to do.

Your original code had two for loops, an outer one for j and an inner one for i. You didn't have either of those for loops in your User1() function but you still tried to use those two variables in the code you moved.

When you import a module Python essentially runs that module (but only when it is first imported, subsequent imports will refer to the already loaded module) but with global names (variables, functions, etc.) defined in that module will be local to the module. I'd say put the code in your Keypad2.py into functions (otherwise the code will run when imported rather than when you want it to), then when you want to use those functions in other files you can import the module and call the relevant functions. So you could have three functions, one to initialise stuff (especially things that don't want initialising at the moment of import), one that gets input from the keypad (either returning a single key or a string of keys depending on what you want) and one that closes things down (if anything).
She who travels light — forgot something.

StangPi
Posts: 68
Joined: Wed Feb 24, 2016 9:26 pm
Location: Indiana, USA

Re: Program not running

Mon Mar 05, 2018 5:28 am

I'd say put the code in your Keypad2.py into functions (otherwise the code will run when imported rather than when you want it to), then when you want to use those functions in other files you can import the module and call the relevant functions. So you could have three functions, one to initialise stuff (especially things that don't want initialising at the moment of import), one that gets input from the keypad (either returning a single key or a string of keys depending on what you want) and one that closes things down (if anything).
What would be the best way to do so? I'm still getting accustomed to how Python works.

pcmanbob
Posts: 7255
Joined: Fri May 31, 2013 9:28 pm
Location: Mansfield UK

Re: Program not running

Mon Mar 05, 2018 10:55 am

This is my take on how to do this.

This is only example code it does run using python3 but there is no error trapping so entering user 3 will crash the program for example
and it only run through the program once, but it is a working example of how I did it.

all entries are made on the keypad.

Code: Select all

import RPi.GPIO as GPIO
import time

# GPIO setup
GPIO.setmode (GPIO.BOARD)
GPIO.setwarnings(False)
COL = [7,11,13,15]
ROW = [12,22,29,31]
 
for j in range(4):
    GPIO.setup(COL[j], GPIO.OUT)
    GPIO.output (COL[j], 1)
    GPIO.setup(ROW[j], GPIO.IN, pull_up_down = GPIO.PUD_UP)
    
# function for checking keypad input    
def check_keypad(length):

    COL = [7,11,13,15]
    ROW = [12,22,29,31]

    MATRIX = [["1","2","3","A"],
              ["4","5","6","B"],
              ["7","8","9","C"],
              ["0","F","E","D"]] 
    result = "" 
    while(True):
        for j in range(4):
            GPIO.output(COL[j],0)

            for i in range(4):
                if GPIO.input(ROW[i]) == 0:
                    time.sleep(0.02)
                    result = result + MATRIX [i][j]
                    while(GPIO.input(ROW[i]) == 0):
                        time.sleep(0.02)
                     
            GPIO.output(COL[j],1)
            if len(result) >= length:
                return result

# select user 
print ("select user number on keypad")
result = check_keypad(1)
user = "user" + result
print ("welcome ",user)

# select user password 

# user1 password
if user == "user1":
    password = "12345"
    length = len(password)
    
# user2 password
if user == "user2":
    password = "123456"
    length = len(password)

# get password from keypad    
print ("enter password on key pad")
result = check_keypad(length)

# check password

if result == password:
    print ("Password correct welcome ",user)
    
else:
    print("Error Password does not match")
    

any questions please ask and I will do my best to answer them, feel free to use or modify this code in any way you wish.
We want information… information… information........................no information no help
The use of crystal balls & mind reading are not supported

StangPi
Posts: 68
Joined: Wed Feb 24, 2016 9:26 pm
Location: Indiana, USA

Re: Program not running

Mon Mar 05, 2018 10:50 pm

I wasn't expecting a full written code, thanks you. Will definitely help me to understand python and complete my project.
A few things:
1--This code is to identify the GPIO connections and functions. What does the GPIO.setwarnings do? Im guessing what its named for, but i mean how so?
2--> result = result + MATRIX [j] <--is this checking the input and checking it against the MATRIX layout?
3--> if len(result) >= length: <--Does this determine when the password has been completely entered before checking its validity? Or is that bit within the user password input blocks?

Code: Select all

# GPIO setup
GPIO.setmode (GPIO.BOARD)
GPIO.setwarnings(False)
COL = [7,11,13,15]
ROW = [12,22,29,31]
 
for j in range(4):
    GPIO.setup(COL[j], GPIO.OUT)
    GPIO.output (COL[j], 1)
    GPIO.setup(ROW[j], GPIO.IN, pull_up_down = GPIO.PUD_UP)
    
# function for checking keypad input    
def check_keypad(length):

    COL = [7,11,13,15]
    ROW = [12,22,29,31]

    MATRIX = [["1","2","3","A"],
              ["4","5","6","B"],
              ["7","8","9","C"],
              ["0","F","E","D"]] 
    result = "" 
    while(True):
        for j in range(4):
            GPIO.output(COL[j],0)

            for i in range(4):
                if GPIO.input(ROW[i]) == 0:
                    time.sleep(0.02)
                    result = result + MATRIX [i][j]
                    while(GPIO.input(ROW[i]) == 0):
                        time.sleep(0.02)
                     
            GPIO.output(COL[j],1)
            if len(result) >= length:
                return result

User avatar
Paeryn
Posts: 2738
Joined: Wed Nov 23, 2011 1:10 am
Location: Sheffield, England

Re: Program not running

Mon Mar 05, 2018 11:30 pm

StangPi wrote:
Mon Mar 05, 2018 10:50 pm
1--This code is to identify the GPIO connections and functions. What does the GPIO.setwarnings do? Im guessing what its named for, but i mean how so?
By default the RPi.GPIO module will warn you if, when you set a GPIO's function, the GPIO in question wasn't in IN or OUT mode (or it was in OUT mode but not set to that by the current program) e.g. when another program is also using the GPIO and has changed it. GPIO.setwarnings(False) disables that warning.
StangPi wrote:
Mon Mar 05, 2018 10:50 pm
2--> result = result + MATRIX [­i][j] <--is this checking the input and checking it against the MATRIX layout?
It is doing the same as when you wrote attempt += MATRIX[­i][j], just adding the element from MATRIX[­i][j] to the end of the string result
StangPi wrote:
Mon Mar 05, 2018 10:50 pm
3--> if len(result) >= length: <--Does this determine when the password has been completely entered before checking its validity? Or is that bit within the user password input blocks?
Once the length of the code being input reaches the length that was passed in to the function it returns the whole code back to the caller, it's then up to the caller to do what they want with the code (in this case the main code goes on to check the returned value against a valid code code).
She who travels light — forgot something.

pcmanbob
Posts: 7255
Joined: Fri May 31, 2013 9:28 pm
Location: Mansfield UK

Re: Program not running

Mon Mar 05, 2018 11:44 pm

I wasn't expecting a full written code, thanks you. Will definitely help me to understand python and complete my project.
A few things:
some times its just easier to write an example so that poeple can see how to do the layout that actually trying to explain it. As the old saying goes a picture is worth a thousand words.

1--This code is to identify the GPIO connections and functions. What does the GPIO.setwarnings do? Im guessing what its named for, but i mean how so?
what GPIO.setwarnings(False) does is suppress the warning message that the GPIO is already in use on the second, third and so no runs of the program , if you just comment out the line adding # as the first character in the line in question then run the program twice on the second execution you will see the warning messages.

2--> result = result + MATRIX [ i ][ j ]<--is this checking the input and checking it against the MATRIX layout?
This line adds each key press to the variable result, so for example when entering the password result starts empty
( this line take care of that result = "" ) then as each key is pressed to enter the code the letter or number specified by MATRIX [ i ][ j ] is added to the result variable.
MATRIX [ i ][ j ] selects the letter from the MATRIX which matches your keyboard layout. [ i ] selects the line and [ j ] selects the character form that line.
so if for example we enter the code 1234 the variable result would continue the following for each key entry
""
"1"
"12"
"123"
"1234"

3--> if len(result) >= length: <--Does this determine when the password has been completely entered before checking its validity? Or is that bit within the user password input blocks?
yes that checks the length of the entered code so for user1 the length would be 5 characters but for user2 it would be 6 characters
and when we use the keypad to enter the user number its only 1 character long.
So in this example code you could only have users 0 - 9 if you wanted more than you would need to change the code to accept more more keypresses so each user number would then be 2 characters long giving you users 00 - 99

checking the code validity is handled by the code that follows the line # check password at the end of the code

Hope that has answered your questions feel free to ask any more you may have.
We want information… information… information........................no information no help
The use of crystal balls & mind reading are not supported

StangPi
Posts: 68
Joined: Wed Feb 24, 2016 9:26 pm
Location: Indiana, USA

Re: Program not running

Tue Mar 06, 2018 2:47 am

Code: Select all


MATRIX = [["1","2","3","A"],
              ["4","5","6","B"],
              ["7","8","9","C"],
              ["0","F","E","D"]]

Is there a particular difference between using apostrophes( ' ), or quotations( " " ) ?

User avatar
Paeryn
Posts: 2738
Joined: Wed Nov 23, 2011 1:10 am
Location: Sheffield, England

Re: Program not running

Tue Mar 06, 2018 3:18 am

StangPi wrote:
Tue Mar 06, 2018 2:47 am

Code: Select all


MATRIX = [["1","2","3","A"],
              ["4","5","6","B"],
              ["7","8","9","C"],
              ["0","F","E","D"]]

Is there a particular difference between using apostrophes( ' ), or quotations( " " ) ?
Not really, other than if you want to use an apostrophe or a quote in the string itself then you use the other for the delimiter. If you used an apostrophe as a delimiter and want an apostrophe in the string you would have to escape the one inside the string, and the same with a quote. E.g. these are equivalent, both giving the string You're :-

Code: Select all

"You're"
'You\'re'
She who travels light — forgot something.

StangPi
Posts: 68
Joined: Wed Feb 24, 2016 9:26 pm
Location: Indiana, USA

Re: Program not running

Tue Mar 06, 2018 3:49 am

I altered the code somewhat:
if user == "user2":
password = "123456"
length = len(password)

# get password from keypad
print ("enter password on key pad")
result = check_keypad(length)

# check password

if result == password:
print ("Password correct welcome ",user)

else:
print("Error Password does not match")

Code: Select all

if User1 == "User1":
      password = "A1234"
      length = len(password)
      if result == password:
           print("Welcome!!")
           #(Function to take User1 to whatever is being protected goes here)

      elif result != password:
           print("Denied!!")
Now since i put the password result if/else statement for each user, do I also have to put the #get password from keypad into each user?
Or does the password input indicate the user? It doesnt look like it does. If it doesn't does this mean I would have to indicate keys to Users somewhere? IE: 1=User1

Return to “Python”