from machine import Pin, SPI, I2C, PWM
from mfrc522 import MFRC522
from pico_i2c_lcd import I2cLcd
from time import sleep
# ================== LCD I2C ==================
i2c = I2C(0, sda=Pin(0), scl=Pin(1), freq=400000)
lcd = I2cLcd(i2c, 0x27, 2, 16)
# ================== RFID (SPI) ==================
sck = Pin(18)
mosi = Pin(19)
miso = Pin(16)
spi = SPI(0, baudrate=100000, polarity=0, phase=0, sck=sck, mosi=mosi, miso=miso)
sda_pin = Pin(17) # SDA / SS
rst_pin = Pin(20) # RST
rdr = MFRC522(spi, sda_pin, rst_pin)
# ================== LEDs ==================
ledVerde = Pin(2, Pin.OUT)
ledAzul = Pin(3, Pin.OUT)
ledRojo = Pin(4, Pin.OUT)
ledVerde.value(0)
ledAzul.value(0)
ledRojo.value(0)
# ================== BUZZER ==================
buzzer = Pin(5, Pin.OUT)
buzzer.value(0)
# ================== SERVO ==================
servo = PWM(Pin(15))
servo.freq(50)
def set_servo_angle(angle):
min_duty = 1638 # ~0.5 ms
max_duty = 8192 # ~2.5 ms
duty = int(min_duty + (angle / 180) * (max_duty - min_duty))
servo.duty_u16(duty)
set_servo_angle(0)
# ================== Funcion para apagar todo ==================
def apagar_todo():
ledVerde.value(0)
ledAzul.value(0)
ledRojo.value(0)
buzzer.value(0)
# ================== UID de la tarjeta valida ==================
# Reemplaza estos valores por el UID real de tu tarjeta (verás el UID impreso en consola)
tarjetaValida = [0x01, 0x02, 0x03, 0x04]
# ================== PANTALLA INICIAL ==================
lcd.clear()
lcd.putstr("Sistema RFID\nEsperando...")
print("Lector RFID listo")
print("Acerque una tarjeta...")
# ================== LOOP PRINCIPAL ==================
while True:
rdr.init()
(stat, tag_type) = rdr.request(rdr.REQIDL)
if stat != rdr.OK:
sleep(0.2)
continue
(stat, raw_uid) = rdr.anticoll()
if stat != rdr.OK:
sleep(0.2)
continue
# Mostrar UID leido en consola (util para saber el UID real de tu tarjeta)
uid_str = "UID:"
for b in raw_uid[:4]:
uid_str += " {:02X}".format(b)
print(uid_str)
# Comparar UID con tarjeta valida
acceso = True
for i in range(4):
if raw_uid[i] != tarjetaValida[i]:
acceso = False
apagar_todo()
lcd.clear()
if acceso:
# ---- USUARIO REGISTRADO ----
lcd.putstr("Usuario\nRegistrado")
print("Usuario Registrado")
ledVerde.value(1)
ledAzul.value(1)
set_servo_angle(90)
else:
# ---- USUARIO SIN REGISTRO ----
lcd.putstr("Usuario sin\nRegistro")
print("Usuario sin Registro")
ledRojo.value(1)
set_servo_angle(0)
# Buzzer tipo alarma (beeps intermitentes)
for i in range(5):
buzzer.value(1)
sleep(0.15)
buzzer.value(0)
sleep(0.15)
sleep(3)
apagar_todo()
set_servo_angle(0)
lcd.clear()
lcd.putstr("Sistema RFID\nEsperando...")
rdr.halt()
rdr.stop_crypto1()
sleep(0.5)
Loading
mfrc522
mfrc522