引言
在物联网和智能家居日益普及的今天,门禁系统作为安全防护的第一道关卡,有着广泛的应用需求。本文将介绍如何利用 Arduino Uno 开发板,结合 0.96 寸 OLED 显示屏、RC522 RFID 模块以及红绿 LED 灯,搭建一个简易的门禁系统,并详细阐述其硬件连接与软件编程实现过程。
硬件连接
1. OLED 显示屏(I2C 接口)与 Arduino Uno 连接
OLED 引脚 | Arduino Uno 引脚 |
---|---|
GND | GND |
VCC | 5V |
SDA | A4 |
SCL | A5 |
2. RC522 RFID 模块(SPI 接口)与 Arduino Uno 连接
RC522 引脚 | Arduino Uno 引脚 |
---|---|
SDA | D10 |
SCK | D13 |
MOSI | D11 |
MISO | D12 |
RST | D9 |
3. LED 与 Arduino Uno 连接
LED | Arduino Uno 引脚 | 连接方式 |
---|---|---|
绿色 LED(刷卡正确指示) | D2 | 通过 220Ω 电阻连接 |
红色 LED(刷卡错误指示) | D3 | 通过 220Ω 电阻连接 |
注意:RC-522的3V3和GND可接到Arduino Uno的对应引脚,使用LED模块则接IN到D2、D3!!
软件实现
完整的 Arduino 代码如下:
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <MFRC522.h>#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);#define RST_PIN 9
#define SS_PIN 10
MFRC522 mfrc522(SS_PIN, RST_PIN);#define GREEN_LED 2
#define RED_LED 3// 授权卡的UID
const byte authorizedUID[] = {0xF9, 0x05, 0x84, 0xC2};void setup() {Serial.begin(9600);// 初始化LED引脚pinMode(GREEN_LED, OUTPUT);pinMode(RED_LED, OUTPUT);digitalWrite(GREEN_LED, LOW);digitalWrite(RED_LED, LOW);// 初始化OLEDif(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {Serial.println(F("SSD1306 allocation failed"));for(;;);}display.clearDisplay();display.setTextColor(SSD1306_WHITE);display.setTextSize(1);display.setCursor(0, 0);display.println("Welcome Home!");display.setTextSize(2);display.setCursor(0, 20);display.println("Please Scan Card");display.display();// 初始化RC522SPI.begin();mfrc522.PCD_Init();Serial.println("RFID Reader initialized.");
}void loop() {// 检查是否有新卡if ( ! mfrc522.PICC_IsNewCardPresent()) {return;}// 选择一张卡if ( ! mfrc522.PICC_ReadCardSerial()) {return;}// 显示卡的UIDSerial.print("Card UID:");String uidString = "";for (byte i = 0; i < mfrc522.uid.size; i++) {Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");Serial.print(mfrc522.uid.uidByte[i], HEX);uidString += String(mfrc522.uid.uidByte[i], HEX);}Serial.println();// 验证UIDbool isAuthorized = true;if (mfrc522.uid.size != sizeof(authorizedUID)) {isAuthorized = false;} else {for (byte i = 0; i < mfrc522.uid.size; i++) {if (mfrc522.uid.uidByte[i] != authorizedUID[i]) {isAuthorized = false;break;}}}// 根据验证结果控制LED和OLED显示display.clearDisplay();display.setTextSize(2);display.setCursor(0, 20);if (isAuthorized) {Serial.println("Access Granted");display.println("Access Granted");digitalWrite(GREEN_LED, HIGH);digitalWrite(RED_LED, LOW);} else {Serial.println("Access Denied");display.println("Access Denied");digitalWrite(GREEN_LED, LOW);digitalWrite(RED_LED, HIGH);}display.display();delay(3000);// 重置显示和LEDdisplay.clearDisplay();display.setTextColor(SSD1306_WHITE);display.setTextSize(1);display.setCursor(0, 0);display.println("Welcome Home!");display.setTextSize(2);display.setCursor(0, 20);display.println("Please Scan Card");display.display();digitalWrite(GREEN_LED, LOW);digitalWrite(RED_LED, LOW);// 释放卡片mfrc522.PICC_HaltA();// 停止加密PCDmfrc522.PCD_StopCrypto1();
}
代码解析
- 头文件引入:引入了 SPI、Wire、Adafruit_GFX、Adafruit_SSD1306 和 MFRC522 相关库,用于支持 SPI 通信、I2C 通信、OLED 图形绘制以及 RC522 RFID 模块操作。
- 硬件对象与引脚定义:定义了 OLED 显示屏对象、RC522 模块对象,以及绿色和红色 LED 对应的引脚,同时声明了授权卡的 UID。
- setup 函数
- 初始化串口通信,用于调试输出信息。
- 设置 LED 引脚为输出模式,并初始化为低电平。
- 初始化 OLED 显示屏,若初始化失败则通过串口打印错误信息并进入死循环。初始化成功后,在 OLED 上显示初始提示信息。
- 初始化 RC522 RFID 模块,并通过串口打印初始化成功信息。
- loop 函数
- 持续检测是否有新的 RFID 卡出现,若没有则返回继续循环。
- 当检测到新卡后,读取卡片的序列号(UID),并将其通过串口打印输出,同时存储为字符串形式。
- 将读取到的卡片 UID 与预设的授权 UID 进行比对,判断是否为授权卡。
- 根据比对结果,控制绿色或红色 LED 的亮灭,并在 OLED 显示屏上更新显示 “Access Granted”(授权通过)或 “Access Denied”(授权失败)。
- 等待 3 秒后,重置 OLED 显示为初始提示信息,熄灭 LED 灯,并释放卡片资源,停止加密操作。
读取 RFID UID 相关
关于如何读取 RFID UID,推荐参考基于 Arduino Uno 和 RFID-RC522 的 RFID 卡号读取技术详解_arduino rfid-CSDN博客 ,该文章详细介绍了 RC522 RFID 模块读取 UID 的原理与具体代码实现步骤,有助于深入理解本门禁系统中卡片识别的关键环节。然后我们记住UID并在上述代码的20行如下的代码段,改为自己的!!
实物测试
以下是实物测试环节的相关情况。在实际测试中,当刷入授权卡时,绿色 LED 亮起,OLED 显示 “Access Granted”;刷入非授权卡时,红色 LED 亮起,OLED 显示 “Access Denied”,测试结果符合预期,验证了该简易门禁系统的功能可行性。
总结
通过本文介绍的硬件连接与软件编程方法,成功实现了一个基于 Arduino Uno 的简易门禁系统。该系统具备基本的卡片识别、权限判断以及状态指示功能,为进一步拓展门禁系统功能,如多卡授权管理、联网远程控制等,奠定了基础。同时,也希望本文能为 Arduino 爱好者以及物联网开发者在相关项目实践中提供有益的参考。