import machine
import time
from mfrc522 import MFRC522
# ==========================================
# RFID MFRC522
# ==========================================
reader = MFRC522(spi_id=0, sck=6, miso=4, mosi=7, cs=5, rst=22)
# ==========================================
# SERVO
# ==========================================
servo = machine.PWM(machine.Pin(15))
servo.freq(50)
def set_servo_angle(angle):
min_duty = 1638
max_duty = 8192
duty = min_duty + int((angle / 180.0) * (max_duty - min_duty))
servo.duty_u16(duty)
# ==========================================
# LED + BUZZER
# ==========================================
led_verte = machine.Pin(13, machine.Pin.OUT)
led_rouge = machine.Pin(14, machine.Pin.OUT)
buzzer = machine.Pin(18, machine.Pin.OUT)
# ==========================================
# URGENCE BUTTON
# ==========================================
urgence = machine.Pin(17, machine.Pin.IN, machine.Pin.PULL_UP)
# ==========================================
# LCD I2C
# ==========================================
I2C_ADDR = 0x27
i2c = machine.I2C(0, sda=machine.Pin(20), scl=machine.Pin(21), freq=400000)
LCD_CHR = 1
LCD_CMD = 0
LCD_LINE_1 = 0x80
LCD_LINE_2 = 0xC0
LCD_BACKLIGHT = 0x08
ENABLE = 0b00000100
def lcd_toggle_enable(bits):
time.sleep_us(500)
i2c.writeto(I2C_ADDR, bytes([bits | ENABLE]))
time.sleep_us(500)
i2c.writeto(I2C_ADDR, bytes([bits & ~ENABLE]))
time.sleep_us(500)
def lcd_byte(bits, mode):
bits_high = mode | (bits & 0xF0) | LCD_BACKLIGHT
bits_low = mode | ((bits << 4) & 0xF0) | LCD_BACKLIGHT
i2c.writeto(I2C_ADDR, bytes([bits_high]))
lcd_toggle_enable(bits_high)
i2c.writeto(I2C_ADDR, bytes([bits_low]))
lcd_toggle_enable(bits_low)
def lcd_init():
lcd_byte(0x33, LCD_CMD)
lcd_byte(0x32, LCD_CMD)
lcd_byte(0x06, LCD_CMD)
lcd_byte(0x0C, LCD_CMD)
lcd_byte(0x28, LCD_CMD)
lcd_byte(0x01, LCD_CMD)
time.sleep_ms(5)
def lcd_string(msg, line):
msg = str(msg)[:16]
msg += " " * (16 - len(msg))
lcd_byte(line, LCD_CMD)
for c in msg:
lcd_byte(ord(c), LCD_CHR)
# ==========================================
# SYSTEM VARIABLES
# ==========================================
acces_en_cours = False
temps_ouverture = 0
TIMEOUT = 5 # seconds
# ==========================================
# AUTHORIZED CARDS
# ==========================================
BADGES_OK = [
"0x01 0x02 0x03 0x04",
"0x11 0x22 0x33 0x44"
]
# ==========================================
# FUNCTIONS
# ==========================================
def buzzer_on():
buzzer.value(1)
def buzzer_off():
buzzer.value(0)
def verifier_badge(uid):
return uid in BADGES_OK
def ouvrir_tourniquet():
global acces_en_cours, temps_ouverture
if acces_en_cours:
return
acces_en_cours = True
led_verte.value(1)
led_rouge.value(0)
set_servo_angle(90)
temps_ouverture = time.ticks_ms()
lcd_string("ACCES AUTORISE", LCD_LINE_1)
lcd_string("BIENVENUE", LCD_LINE_2)
def fermer_tourniquet():
global acces_en_cours
set_servo_angle(0)
time.sleep(0.5)
servo.duty_u16(0)
led_verte.value(0)
led_rouge.value(1)
lcd_string("ACCES FERME", LCD_LINE_1)
lcd_string("BADGE SVP", LCD_LINE_2)
acces_en_cours = False
# ==========================================
# INIT
# ==========================================
print("Systeme Demarre")
lcd_init()
time.sleep(1)
led_verte.value(0)
led_rouge.value(1)
fermer_tourniquet()
buzzer_off()
lcd_string("SYSTEM READY", LCD_LINE_1)
# ==========================================
# LOOP
# ==========================================
while True:
# AUTO CLOSE
if acces_en_cours and time.ticks_diff(time.ticks_ms(), temps_ouverture) > TIMEOUT * 1000:
fermer_tourniquet()
# URGENCE
if urgence.value() == 0:
lcd_string("URGENCE", LCD_LINE_1)
ouvrir_tourniquet()
buzzer_on()
time.sleep(1)
buzzer_off()
# RFID READ
reader.init()
(stat, tag_type) = reader.request(reader.REQIDL)
if stat == reader.OK:
(stat, uid) = reader.SelectTagSN()
if stat == reader.OK:
badge_id = "0x%02X 0x%02X 0x%02X 0x%02X" % (
uid[0], uid[1], uid[2], uid[3]
)
print("Badge:", badge_id)
if verifier_badge(badge_id):
print("ACCES OK")
if not acces_en_cours:
ouvrir_tourniquet()
else:
print("ACCES REFUSE")
lcd_string("ACCES REFUSE", LCD_LINE_1)
buzzer_on()
time.sleep(1)
buzzer_off()
time.sleep(0.1)