#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);
}
留言
張貼留言