# keypad.py
from machine import Pin, RTC
import utime
import uio
class Keypad:
KEY_UP = const(0)
KEY_DOWN = const(1)
def __init__(self, row_pins, column_pins):
self.keys = [['1', '2', '3', 'A'], ['4', '5', '6', 'B'], ['7', '8', '9', 'C'], ['*', '0', '#', 'D']]
self.row_pins = [Pin(pin, Pin.OUT) for pin in row_pins]
self.column_pins = [Pin(pin, Pin.IN, Pin.PULL_DOWN) for pin in column_pins]
self.rtc = RTC()
self.records = {}
def initialize(self):
for row in range(len(self.row_pins)):
for col in range(len(self.column_pins)):
self.row_pins[row].value(0)
def scan(self, row, column):
self.row_pins[row].value(1)
key = None
if self.column_pins[column].value() == self.KEY_DOWN:
key = self.KEY_DOWN
if self.column_pins[column].value() == self.KEY_UP:
key = self.KEY_UP
self.row_pins[row].value(0)
return key
def save_record(self, record):
with uio.open("record.txt", "a") as file:
file.write("User: {}\n".format(record['user']))
file.write("Date: {:04d}-{:02d}-{:02d} {:02d}:{:02d}:{:02d}\n".format(*record['date']))
file.write("Entry: {:02d}:{:02d}:{:02d}\n".format(*record['entry']))
file.write("Exit: {:02d}:{:02d}:{:02d}\n".format(*record['exit']))
file.write("\n")
def log_entry_exit(self, user, save_to_file=True):
(year, month, day, hour, minute, second, weekday, yearday) = self.rtc.datetime()
user_record = self.records.get(user, {'entry': None, 'exit': None, 'date': None, 'user': user})
if user_record['date'] != day:
user_record = {'entry': None, 'exit': None, 'date': day, 'user': user}
if user_record['entry'] is None:
user_record['entry'] = (hour, minute, second)
print("Entry recorded for user {} on {:04d}-{:02d}-{:02d} at {:02d}:{:02d}:{:02d}".format(user, year, month, day, hour, minute, second))
elif user_record['exit'] is None:
user_record['exit'] = (hour, minute, second)
print("Exit recorded for user {} on {:04d}-{:02d}-{:02d} at {:02d}:{:02d}:{:02d}".format(user, year, month, day, hour, minute, second))
if save_to_file:
self.save_record(user_record)
self.records[user] = user_record
# Define the row and column pins for the keypad
row_pins = [2, 4, 5, 19]
column_pins = [12, 27, 26, 25]
# Create a Keypad object
keypad = Keypad(row_pins, column_pins)
# Initialize the keypad
keypad.initialize()
# Variable to store user input
user_input = ""
# Main loop to continuously scan the keypad and collect input
while True:
for row in range(len(row_pins)):
for col in range(len(column_pins)):
key_state = keypad.scan(row, col)
if key_state == Keypad.KEY_DOWN:
key = keypad.keys[row][col]
if key == "#": # Check if "#" key is pressed (indicating end of input)
print("\nUser input:", user_input) # Print user input
user_input = "" # Reset user input
else:
user_input += key # Add key to user input
print("User input:", user_input) # Print user input
utime.sleep_ms(300) # Add a small delay to debounce keys and prevent multiple detections