RFID 保險箱(RFID+RGB LED+SG90)






 #include <SPI.h>

#include <MFRC522.h>

#include <Servo.h>


#define RST_PIN 9

#define SS_PIN 10

#define SERVO_PIN 7


// 共陽極 RGB LED 腳位

#define RED_LED 3

#define GREEN_LED 4

#define BLUE_LED 5  // 如果不用藍燈,可以忽略


MFRC522 mfrc522(SS_PIN, RST_PIN);

Servo doorServo;


// 多張授權卡片 UID

byte authorizedUIDs[][4] = {

  {20, 36, 153, 114},   // 卡片 A

  {90, 193, 207, 128}   // 卡片 B

};


const char* cardNames[] = {

  "卡片 A",

  "卡片 B"

};


// 狀態變數:false = 關門(紅燈),true = 開門(綠燈)

bool doorOpen = false;


void setup() {

  Serial.begin(9600);

  SPI.begin();

  mfrc522.PCD_Init();

  doorServo.attach(SERVO_PIN);

  doorServo.write(0); // 初始關門


  pinMode(RED_LED, OUTPUT);

  pinMode(GREEN_LED, OUTPUT);

  pinMode(BLUE_LED, OUTPUT);


  setLED(true, false, false); // 初始紅燈

  Serial.println("請將卡片靠近讀卡器...");

}


void loop() {

  if (!mfrc522.PICC_IsNewCardPresent()) return;

  if (!mfrc522.PICC_ReadCardSerial()) return;


  int cardIndex = checkAuthorized(mfrc522.uid.uidByte);

  if (cardIndex >= 0) {

    Serial.print("授權卡片 → ");

    Serial.println(cardNames[cardIndex]);


    if (!doorOpen) {

      // 如果目前是關門 → 開門 + 紅燈

      doorServo.write(90);

      doorOpen = true;

      setLED(true, false, false); // 紅燈

      Serial.println("門已開 → 紅燈");

    } else {

      // 如果目前是開門 → 關門 + 綠燈

      doorServo.write(0);

      doorOpen = false;

      setLED(false, true, false); // 綠燈

      Serial.println("門已關 → 綠燈");

    }

  } else {

    Serial.println("非授權卡片 → 不動作");

  }


  mfrc522.PICC_HaltA();

}


// 比對多張 UID

int checkAuthorized(byte *uid) {

  int totalCards = sizeof(authorizedUIDs) / sizeof(authorizedUIDs[0]);

  for (int i = 0; i < totalCards; i++) {

    bool match = true;

    for (int j = 0; j < 4; j++) {

      if (uid[j] != authorizedUIDs[i][j]) {

        match = false;

        break;

      }

    }

    if (match) return i;

  }

  return -1;

}


// 控制共陽極 LED (true=亮, false=滅)

void setLED(bool red, bool green, bool blue) {

  digitalWrite(RED_LED, red ? LOW : HIGH);

  digitalWrite(GREEN_LED, green ? LOW : HIGH);

  digitalWrite(BLUE_LED, blue ? LOW : HIGH);

}







留言