---
title: Arduino RFID 實戰
description: 這次社課將讓我們透過 Arduino 技術,模擬和實現一個門禁卡系統。這不僅有助於提升我們的程式設計和電子工程技能,還能讓我們親身體驗如何將現代科技應用於日常生活中,解決實際問題。通過實際操作,我們將學習如何設計和實作一個簡便而有效的門禁系統,從而更好地理解科技如何影響並改善我們的生活。
tags:
- 社課
- 共筆
- 113 學年
---
:::success
# Arduino RFID 實戰
**時間:** 2024/11/21(星期四)18:00~20:00
**地點:** 挺生大樓 A3-200 教室
**簡報:** [連結](https://www.canva.com/design/DAGWtRqDzLU/Bjl3n7VdBF0slhok3gcF1g/edit?utm_content=DAGWtRqDzLU&utm_campaign=designshare&utm_medium=link2&utm_source=sharebutton)
**Slido:** [連結]()
:::
> 請從這裡開始
# UID讀取程式(程式1)
#### 輸出卡片長度及顯示卡號
```c
Serial.print("UID Size: "); // 顯示卡片的UID長度值
Serial.println(idSize);
for (byte i = 0; i < idSize; i++)
{
Serial.print("id[");
Serial.print(i);
Serial.print("]: ");
Serial.println(id[i], HEX); // 以16進位顯示UID值
}
Serial.println();
mfrc522.PICC_HaltA(); // 讓卡片進入停止模式
```
#### sak值判斷卡片種類
```c
Serial.print("PICC type: "); // 顯示卡片類型
// 根據卡片回應的SAK值(mfrc522.uid.sak)判斷卡片類型
Serial.print("SAK 值: 0x");
Serial.println(sakValue, HEX);// 以 16 進位格式顯示 SAK
MFRC522::PICC_Type piccType = mfrc522.PICC_GetType(mfrc522.uid.sak);
Serial.println(mfrc522.PICC_GetTypeName(piccType));
```
#### 前置處理器
```c
#include <SPI.h>
#include <MFRC522.h> // 引用程式庫
#define RST_PIN A0 // 讀卡機的重置腳位
#define SS_PIN 10 // 晶片選擇腳位
MFRC522 mfrc522(SS_PIN, RST_PIN); // 建立MFRC522物件
```
#### 程式初始設定
```c
void setup()
{
Serial.begin(9600);
Serial.println("RFID reader is ready!");
SPI.begin();
mfrc522.PCD_Init(); // 初始化MFRC522讀卡機模組
}
```
#### 主程式
```c
void loop()
{
// 確認是否有新卡片
if (mfrc522.PICC_IsNewCardPresent() && mfrc522.PICC_ReadCardSerial())
{
byte *id = mfrc522.uid.uidByte; // 取得卡片的UID
byte idSize = mfrc522.uid.size; // 取得UID的長度
byte sakValue = mfrc522.uid.sak;
}
}
```
#### 位元對齊程式
```c
if (id[i] < 0x10) // 如果值小於 0x10,補零
{
Serial.print("0");
}
```
# 門禁卡程式(程式2)
```c
#include <SPI.h> // 引入 SPI 庫,用於與 RFID 模組進行通信
#include <Servo.h> // 引入 Servo 庫,用於控制伺服馬達
#include <MFRC522.h> // 引入 MFRC522 庫,用於操作 RFID 模組
// 定義常數
#define SS_PIN 10 // 定義 RFID 模組的片選 (Slave Select) 腳位
#define RST_PIN 9 // 定義 RFID 模組的重置腳位
#define BUZZER_PIN 5 // 定義蜂鳴器的腳位
// 創建對象
Servo servo; // 創建伺服馬達的對象
MFRC522 mfrc522(SS_PIN, RST_PIN); // 創建 RFID 讀卡器的對象
int flag = 0; // 狀態變數,用於記錄伺服馬達當前的位置(控制開關狀態)
// 函數原型宣告
void beep(int times, int duration);
// 初始化設置
void setup()
{
Serial.begin(9600); // 初始化序列埠,用於輸出訊息到串列監視器
SPI.begin(); // 初始化 SPI 通信
mfrc522.PCD_Init(); // 初始化 RFID 讀卡器
Serial.println("Approximate your card to the reader"); // 提示訊息
pinMode(BUZZER_PIN, OUTPUT); // 設置蜂鳴器腳位為輸出
digitalWrite(5, HIGH); // 初始化蜂鳴器為關閉狀態
servo.attach(3); // 設置伺服馬達的控制腳位
servo.write(50); // 將伺服馬達設置到初始位置 (50 度)
}
// 主循環函數
void loop()
{
// 檢查是否有新卡片
if (!mfrc522.PICC_IsNewCardPresent())
{
return; // 如果沒有新卡片,返回並繼續檢查
}
// 嘗試讀取卡片序列號
if (!mfrc522.PICC_ReadCardSerial())
{
return; // 如果讀取失敗,返回並繼續檢查
}
// 讀取 UID
Serial.print("UID tag: "); // 輸出 UID 標籤提示
String content = ""; // 用於存儲卡片的 UID
for (byte i = 0; i < mfrc522.uid.size; i++)
{
if (mfrc522.uid.uidByte[i] < 0x10)
{
Serial.print("0"); // 如果是單位數,補 0
}
Serial.print(mfrc522.uid.uidByte[i], HEX); // 以十六進制輸出 UID
content += (mfrc522.uid.uidByte[i] < 0x10 ? "0" : "") + String(mfrc522.uid.uidByte[i], HEX); // 合併成字串
}
Serial.println();
Serial.print("Complete UID: "); // 提示完整的 UID
Serial.println(content);
content.toUpperCase(); // 將 UID 轉為大寫以便比較
// 如果 UID 匹配特定值
if (content == "35129B1B")
{
if (flag % 2 == 0) // 如果 flag 是偶數
{
servo.write(10); // 伺服馬達轉到 10 度
flag++; // 更新 flag 狀態
Serial.print("Flag: ");
Serial.println(flag);
Serial.print("Door Close ");
// 蜂鳴器響 3 次,每次持續 100 毫秒
beep(3, 100);
delay(1000); // 延遲 1 秒,等待伺服馬達完成動作
}
else // 如果 flag 是奇數
{
servo.write(90); // 伺服馬達轉回 50 度
flag++; // 更新 flag 狀態
Serial.print("Flag: ");
Serial.println(flag);
Serial.print("Door Open ");
// 蜂鳴器響 2 次,每次持續 150 毫秒
beep(2, 150);
delay(1000); // 延遲 1 秒,等待伺服馬達完成動作
}
}
else // 如果 UID 不匹配
{
delay(100); // 延遲 100 毫秒
beep(4, 75); // 蜂鳴器響 4 次,每次持續 75 毫秒
servo.write(30); // 無效卡片時伺服馬達轉到 30 度
Serial.print("Wrong card ");
}
mfrc522.PCD_Init();
}
// 蜂鳴器控制函數
void beep(int times, int duration)
{
for (int i = 0; i < times; i++)
{
digitalWrite(BUZZER_PIN, LOW); // 開啟蜂鳴器
delay(duration); // 蜂鳴器響的持續時間
digitalWrite(BUZZER_PIN, HIGH); // 關閉蜂鳴器
delay(duration); // 蜂鳴器停止的間隔時間
}
}
```
<br>
<br>
---
## Arduino 安裝
[Arduino 安裝連結](https://www.arduino.cc/en/software)