import rp2
from rp2 import PIO
import machine
from machine import Pin, I2C, PWM
from time import sleep
from pico_i2c_lcd import I2cLcd
admin_password = "6892ACDB"
def max_ds(freq):
return round(163.05*freq + 0.6)-1
def min_ds(freq):
return round(29.872*freq + 1.4)+1
def pc2ds(pc):
return round((pc - 0) * (max_ds(PWM_freq) - min_ds(PWM_freq)) / (255 - 0) + min_ds(PWM_freq))
def locking_deq(i):
global input_text
global input_code
global pause_input
servo_list[i].duty_u16(pc2ds(0))
show_code()
while len(input_text) < 4:
scankeys()
sleep(0.01)
mdp_text[str(i+1)] = input_text
show_ok()
print(mdp_text)
show_num()
def unlocking_deq():
global input_text
global input_code
global pause_input
global mdp_text
if input_text == admin_password:
for i in range(len(servo_list)):
servo_list[i].duty_u16(pc2ds(255))
mdp_text = {}
show_ok()
show_num()
sleep(0.5)
return
if not test_number(input_text):
show_error()
show_num()
return
valide_adress = False
for i in mdp_text:
if int(input_text) == int(i):valide_adress = True
input_adress = input_text
if not valide_adress:
show_error()
show_num()
return None
show_code()
while len(input_text) < 4:
scankeys()
sleep(0.01)
if input_text == admin_password[:4]:
while len(input_text) < 8:
scankeys()
sleep(0.01)
if input_text == admin_password:
for i in range(len(servo_list)):
servo_list[i].duty_u16(pc2ds(255))
mdp_text = {}
show_ok()
show_num()
sleep(0.5)
return
if mdp_text[input_adress] == input_text:
servo_list[int(input_adress)-1].duty_u16(pc2ds(255))
mdp_text.pop(input_adress)
show_ok()
show_num()
sleep(0.5)
def show_error():
global pause_input
pause_input = True
lcd.clear()
lcd.hide_cursor()
for _ in range(3):
lcd.move_to(5, 0)
lcd.putstr("Error")
sleep(0.1)
lcd.clear()
sleep(0.1)
lcd.move_to(0, 1)
pause_input = False
def show_ok():
global pause_input
pause_input = True
lcd.clear()
lcd.hide_cursor()
for _ in range(3):
lcd.move_to(6, 0)
lcd.putstr("OK")
sleep(0.1)
lcd.clear()
sleep(0.1)
lcd.move_to(0, 1)
pause_input = False
def alarm():
print("alarm")
buzzer.value(1)
sleep(0.5)
buzzer.value(0)
sleep(0.5)
buzzer.value(1)
sleep(0.5)
buzzer.value(0)
sleep(0.5)
buzzer.value(1)
sleep(0.5)
buzzer.value(0)
sleep(0.5)
def show_num():
global input_text
global input_code
global pause_input
pause_input = True
input_text = ""
input_code = False
lcd.clear()
lcd.move_to(0, 0)
lcd.putstr("Numero casier:")
lcd.move_to(0, 1)
lcd.show_cursor()
pause_input = False
def show_code():
global input_text
global input_code
global pause_input
pause_input = True
input_text = ""
input_code = True
lcd.clear()
lcd.move_to(0, 0)
lcd.putstr("Code:")
lcd.show_cursor()
pause_input = False
input_text = ""
input_code = False
pause_input = False
validate = True
buzzer = Pin(18, Pin.OUT)
matrix_keys = [['1', '2', '3', 'A'],
['4', '5', '6', 'B'],
['7', '8', '9', 'C'],
['*', '0', '#', 'D']]
bitmap_pressed_keys = [[False, False, False, False],
[False, False, False, False],
[False, False, False, False],
[False, False, False, False]]
keypad_rows = [13,12,11,10]
keypad_columns = [9,8,7,6]
col_pins = []
row_pins = []
for x in range(0,4):
row_pins.append(Pin(keypad_rows[x], Pin.OUT))
row_pins[x].value(1)
col_pins.append(Pin(keypad_columns[x], Pin.IN, Pin.PULL_DOWN))
col_pins[x].value(0)
def test_valide(string):
if string in "0123456789ABCD":
return True
return False
def test_number(string):
try:
float(string)
return True
except ValueError:
return False
def scankeys():
global input_text
global bitmap_pressed_keys
key_pressed = ""
key_changed = False
for row in range(4):
for col in range(4):
row_pins[row].high()
key = None
if col_pins[col].value() == 1:
if not bitmap_pressed_keys[row][col]:
key_changed = True
bitmap_pressed_keys[row][col] = True
key_press = matrix_keys[row][col]
key_pressed = key_press
if test_valide(key_press):
input_text += key_press
else:
bitmap_pressed_keys[row][col] = False
row_pins[row].low()
if key_changed:
buzzer.value(1)
sleep(0.01)
buzzer.value(0)
if key_pressed == "#":
unlocking_deq()
if key_pressed == "*":
input_text = input_text[:-1]
if input_code and not pause_input:
lcd.hide_cursor()
lcd.move_to(5, 0)
lcd.putstr(" ")
lcd.move_to(5, 0)
lcd.putstr(input_text)
lcd.show_cursor()
elif not pause_input:
lcd.hide_cursor()
lcd.move_to(0, 1)
lcd.putstr(" ")
lcd.move_to(0, 1)
lcd.putstr(input_text)
lcd.show_cursor()
mdp_text = {}
gpio_button_list = ["GP2", "GP3", "GP4"]
button_list = []
for gpio_pin in gpio_button_list:
pin_value = int(gpio_pin[2:])
print(pin_value)
button_list.append(Pin(pin_value, Pin.IN, Pin.PULL_DOWN))
PWM_freq = 100
gpio_servo_list = ["GP19", "GP20", "GP21"]
servo_list = []
for gpio_pin in gpio_servo_list:
pin_value = int(gpio_pin[2:])
print(pin_value)
servo_list.append(PWM(pin_value, freq=PWM_freq, duty_u16=pc2ds(0)))
servo_list[-1].duty_u16(0)
i2c = I2C(0, sda=Pin(0), scl=Pin(1), freq=400000)
I2C_ADDR = i2c.scan()[0]
lcd = I2cLcd(i2c, I2C_ADDR, 2, 16)
lcd.putstr("Numero casier:")
lcd.show_cursor()
lcd.move_to(0, 1)
for i in range(len(servo_list)):
servo_list[i].duty_u16(pc2ds(255))
while True:
scankeys()
for i in range(3):
if button_list[i].value() == 1:
if str(i+1) not in mdp_text:
#print(i+1, mdp_text)
locking_deq(i)
else:
if str(i+1) in mdp_text:
alarm()
sleep(0.01)