from machine import Pin, SPI, PWM, I2C
from time import sleep, sleep_ms
from mfrc522 import MFRC522
import ssd1306
# تهيئة الشاشة (I2C)
i2c = I2C(0, scl=Pin(22), sda=Pin(21))
oled = ssd1306.SSD1306_I2C(128, 64, i2c)
# تهيئة قارئ الـ RFID (SPI)
spi = SPI(2, baudrate=100000, polarity=0, phase=0, sck=Pin(18), mosi=Pin(23), miso=Pin(19))
cs = Pin(5, Pin.OUT)
# تهيئة محرك السيرفو للبوابة
servo = PWM(Pin(32), freq=50)
# تهيئة المكونات التفاعلية
green_led = Pin(4, Pin.OUT)
buzzer_pin = Pin(15, Pin.OUT)
# تهيئة المتغيرات الأساسية للمشروع
authorized_uid = "11:22:33:44" # الكود التعريفي للبطاقة المصرح لها
occupied = False # متغير تتبع حالة إشغال منطقة النوم
# تحريك السيرفو بدقة
def move_servo(angle):
pulse = int(500000 + (angle / 180) * 2000000)
servo.duty_ns(pulse)
# توليد النغمات الصوتية الموسيقية
def play_tone(frequency, duration_ms):
if frequency == 0:
buzzer_pin.off()
sleep_ms(duration_ms)
return
try:
bz_pwm = PWM(Pin(15), freq=frequency, duty=512)
sleep_ms(duration_ms)
bz_pwm.deinit()
except:
pass
buzzer_pin.init(Pin.OUT)
buzzer_pin.off()
# نغمات ترحيبية وتنبيهية مبدعة
def play_welcome_melody():
# نغمة صاعدة سعيدة ومبهجة ترحب بدخول الأليف
notes = [523, 659, 784, 988, 1047] # C5, E5, G5, B5, C6
for note in notes:
play_tone(note, 100)
sleep_ms(10)
def play_goodbye_melody():
# نغمة تنازلية هادئة لوداع الأليف عند الخروج
notes = [1047, 784, 659, 523] # C6, G5, E5, C5
for note in notes:
play_tone(note, 120)
sleep_ms(15)
def play_intruder_siren():
# صافرة إنذار شرطة متأرجحة قوية لإخافة الدخلاء والبطاقات غير المصرح بها!
for _ in range(2):
for freq in range(600, 1200, 40): # ارتفاع تدريجي للتردد
play_tone(freq, 15)
for freq in range(1200, 600, -40): # انخفاض تدريجي للتردد
play_tone(freq, 15)
# ميزة إبداعية: رسم وجه الأليف بالفن النصي (ASCII) حسب الحالة
def draw_pet_ascii(is_occupied):
if is_occupied:
oled.text(" ( ^_^)zzz ", 10, 48) # الأليف نائم بسلام
else:
oled.text(" ( ._.)? ", 10, 48) # يبحث عن الأليف
# تحديث شاشة OLED بلمسات جمالية وإطارات
def show_oled(access, gate_state):
oled.fill(0)
# رسم إطار خارجي حول الشاشة كعنصر جمالي ومحترف
oled.rect(0, 0, 128, 64, 1)
# عنوان الشاشة
oled.text("=== PET GATE ===", 4, 4)
# حالة الدخول
if access == "READY":
oled.text("Access: READY", 8, 18)
elif access == "ACCESS GRANTED":
oled.text("Access: GRANTED", 8, 18)
elif access == "ACCESS DENIED":
oled.text("Access: DENIED", 8, 18)
# حالة البوابة الميكانيكية
oled.text(f"Gate: {gate_state}", 8, 30)
# حالة إشغال الغرفة الذكية
if occupied:
oled.text("Room: OCCUPIED", 8, 42)
else:
oled.text("Room: EMPTY", 8, 42)
# رسم الفيس النصي اللطيف
draw_pet_ascii(occupied)
oled.show()
# تهيئة الحالة الافتراضية للبدء
move_servo(0) # البوابة مغلقة
green_led.off()
buzzer_pin.off()
show_oled("READY", "CLOSED")
print("RFID Ready")
# تهيئة كائن مكتبة الـ RFID-RC522
rfid = MFRC522(spi, cs)
# حلقة المسح الضوئي اللانهائية المستمرة
while True:
status, tag_type = rfid.request(rfid.REQIDL)
if status == rfid.OK:
print("CARD FOUND")
status, uid = rfid.anticoll()
if status == rfid.OK and len(uid) >= 4:
# صياغة المعرف الفريد UID كنص ست عشري منسق
scanned_uid = "%02X:%02X:%02X:%02X" % (uid[0], uid[1], uid[2], uid[3])
print("TAG:", scanned_uid)
if scanned_uid == authorized_uid:
# الكرت مصرح به: دخول آمن (ACCESS GRANTED)
print("ACCESS GRANTED")
# تبديل ذكي لحالة الإشغال (دخول وخروج متعاقب)
occupied = not occupied
# إظهار حالة الموافقة وتفعيل الضوء الأخضر
show_oled("ACCESS GRANTED", "OPEN")
green_led.on()
# ميزة إبداعية: عزف لحن خاص بحالة الدخول أو الخروج
if occupied:
play_welcome_melody() # معزوفة الدخول والترحيب
else:
play_goodbye_melody() # معزوفة الخروج والوداع
# فتح البوابة الميكانيكية
move_servo(90)
sleep(3) # الانتظار لمدة 3 ثوانٍ كاملة
# إغلاق البوابة تلقائياً وإعادة الضبط لحالة الجاهزية
move_servo(0)
show_oled("READY", "CLOSED")
green_led.off()
sleep(2) # تأخير لمنع تكرار القراءة المباشرة لنفس الكرت
else:
# الكرت غير مصرح به: رفض الدخول (ACCESS DENIED)
print("ACCESS DENIED")
show_oled("ACCESS DENIED", "CLOSED")
# تفعيل الميزة الإبداعية: صافرة إنذار الدخلاء القوية لمنع التطفل
play_intruder_siren()
sleep(1)
show_oled("READY", "CLOSED")
sleep_ms(300)