Arduino门禁系统:RFID-RC522卡验证与LED、0.96OLED(IIC)的门禁场景

article/2025/8/22 22:22:26

引言

在物联网和智能家居日益普及的今天,门禁系统作为安全防护的第一道关卡,有着广泛的应用需求。本文将介绍如何利用 Arduino Uno 开发板,结合 0.96 寸 OLED 显示屏、RC522 RFID 模块以及红绿 LED 灯,搭建一个简易的门禁系统,并详细阐述其硬件连接与软件编程实现过程。

硬件连接

1. OLED 显示屏(I2C 接口)与 Arduino Uno 连接

OLED 引脚Arduino Uno 引脚
GNDGND
VCC5V
SDAA4
SCLA5

2. RC522 RFID 模块(SPI 接口)与 Arduino Uno 连接

RC522 引脚Arduino Uno 引脚
SDAD10
SCKD13
MOSID11
MISOD12
RSTD9

3. LED 与 Arduino Uno 连接

LEDArduino 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();
}

代码解析

  1. 头文件引入:引入了 SPI、Wire、Adafruit_GFX、Adafruit_SSD1306 和 MFRC522 相关库,用于支持 SPI 通信、I2C 通信、OLED 图形绘制以及 RC522 RFID 模块操作。
  2. 硬件对象与引脚定义:定义了 OLED 显示屏对象、RC522 模块对象,以及绿色和红色 LED 对应的引脚,同时声明了授权卡的 UID。
  3. setup 函数
    • 初始化串口通信,用于调试输出信息。
    • 设置 LED 引脚为输出模式,并初始化为低电平。
    • 初始化 OLED 显示屏,若初始化失败则通过串口打印错误信息并进入死循环。初始化成功后,在 OLED 上显示初始提示信息。
    • 初始化 RC522 RFID 模块,并通过串口打印初始化成功信息。
  4. 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 爱好者以及物联网开发者在相关项目实践中提供有益的参考。


http://www.hkcw.cn/article/dxTNoGcjFY.shtml

相关文章

各地狂建学职业本科成香饽饽,职业本科怎么就成了香饽饽?

各地狂建学职业本科成香饽饽。毕业季,当许多高校学生还在忙着找工作时,西安汽车职业大学2023届智能制造工程学院的毕业生乔延哲,在6月离校前就拿到了10余个Offer,被多家企业争抢,而类似的例子还有许多。大众在不解的同时也感叹,职业本科怎么就成了香饽饽?2025年了,各地…

【电路笔记 TMS320F28335DSP】McBSP 从源时钟得到 生成时钟 CLKG 帧同步信号 FSG

对应于原文 Multichannel Buffered Serial Port (McBSP)的 2.5.3 Data Clock Generation。 CLKG Figure 2-4. Sample Rate Generator Block Diagram CLKG 是采样率发生器输出的数据位时钟&#xff08;Data Bit Clock&#xff09;&#xff0c;它被用来控制&#xff1a; 数据发…

校园演出该不该“外包”,节目竞演变花钱比拼?

校园演出该不该“外包”。学校艺术汇演、节目表演本是展示学生风采、锻炼孩子能力的重要契机。然而当下,节目编排“外包”现象却开始冒头,有的班级“高价请老师”“花钱买节目”,引发家长质疑。半月谈记者调查了解到,当前部分校园艺术节目排练评比压力大、艺术教育依赖外包…

寄存器模型2

6.MCDF寄存器设计代码 &#xff08;1&#xff09;示意图 &#xff08;2&#xff09;代码 verilog中数组操作&#xff1a;regs[SLV0_RW_REG][0:5]指的是32bit数据下的0:5位。 7.adapter &#xff08;1&#xff09;adapter的位置 &#xff08;2&#xff09;adapter实现 &#…

胡塞武装称过去一周对以色列多地目标实施打击

当地时间5月29日晚,也门胡塞武装领导人阿卜杜勒马利克胡塞在其每周讲话中表示,在本周内,该组织对以色列多地目标实施了军事打击。在打击过程中,该组织使用了14枚高超音速导弹、弹道导弹以及无人机,打击目标包括以色列特拉维夫以北的雅法、海法、南部城市阿什凯隆以及红海沿…

女子向丈夫要5元遭拒轻生?假 网传信息不实

近日,网上流传一则消息称山东一名女子因向丈夫索要5元钱买煎饼果子当早餐被拒后选择喝药轻生。经省内各地和有关部门核实,该信息并不属实。希望广大网友保持理性和冷静,不轻易相信和传播未经证实的信息,共同维护健康有序的网络环境。责任编辑:zx0176

【C++】“多态”特性

文章目录 一、多态的概念二、多态的定义实现1. 多态的构成条件1.1 虚函数1.2 虚函数的重写 2. 多态的调用3. 虚函数重写的其他问题3.1 协变3.2 析构函数的重写 三、override和final关键字四、重载/重写/隐藏的对比五、纯虚函数和抽象类六、多态的原理 C的三大主要特性&#xff…

SmolDocling-256M:极小参数量的视觉语言模型|端到端文档解析方案的另一种思路

背景问题 传统的一站式文档解析工具&#xff0c;包含布局分析、OCR和表格识别等&#xff0c;往往需要结合多个独立的模型&#xff0c;同时根据处理任务的不同调用不同的模型&#xff0c;增加了处理流程的复杂度&#xff0c;并且难以泛化到不同的文档类型。大型视觉语言模型&am…

SUV行驶中被巨石砸下路面,目击者:SUV司机自己爬上来,没受伤!

SUV行驶中被巨石砸下路面。5月28日贵州毕节,SUV行驶中被巨石砸下路面,摩托车司机弃车避险后又赶来查看,目击者:SUV司机自己爬上来,没受伤!SUV行驶中被巨石砸下路面SUV行驶中被巨石砸下路面SUV行驶中被巨石砸下路面SUV行驶中被巨石砸下路面SUV行驶中被巨石砸下路面责任编辑…

一文了解半导体封装测试

1.半导体后端工艺 制作半导体产品的第一步&#xff0c;就是根据所需功能设计芯片&#xff08;Chip&#xff09;。然后&#xff0c;再将芯片制作成晶圆&#xff08;Wafer&#xff09;。由于晶圆由芯片反复排列而成&#xff0c;当我们细看已完成的晶圆时&#xff0c;可以看到上面…

leetcode hot100刷题日记——28.环形链表2

解答&#xff1a; 方法一&#xff1a;哈希表 class Solution { public:ListNode *detectCycle(ListNode *head) {//哈希表unordered_set<ListNode *>visited;while(head!nullptr){if(visited.count(head)){return head;}visited.insert(head);headhead->next;}return…

NW907NW918美光固态闪存NW920NW930

NW907NW918美光固态闪存NW920NW930 技术解析&#xff1a;美光NW系列固态闪存的核心突破 美光NW907、NW918、NW920、NW930四款固态闪存产品&#xff0c;代表了当前存储技术的顶尖水平。其核心创新在于G9 NAND架构的深度优化&#xff0c;采用更先进的5纳米制程工艺&#xff0c;…

前人栽树,后人乘凉——AdaBoost

一、AdaBoost介绍 AdaBoost的全称是ADAPTIVE BOOSTING&#xff08;自适应增强算法&#xff09;&#xff0c;是一种经典的集成学习算法&#xff0c;它通过组合多个弱学习器来构建一个强学习器。 从表意上看&#xff0c;AdaBoost就是在不断对于错误的知识点进行加深印象&#x…

【深度学习:进阶篇】--2.3.深度学习正则化

学习目标 目标 了解偏差与方差的意义知道L2正则化与L1正则化的数学意义知道Droupout正则化的方法了解早停止法、数据增强法的其它正则化方式 应用 无 目录 学习目标 1 偏差与方差 1.1 数据集划分 1.2 偏差与方差 1.3 解决方法&#xff08;过拟合&#xff09; 2 正则化(…

解决报错error: ‘void_t’ is not a member of ‘std’

解决报错error: ‘void_t’ is not a member of ‘std’ 博主是在编译ceres库时遇到的此报错。 解决方式很简单&#xff0c;将编译使用的c标准设定为c17即可。 例如&#xff0c;在VS2022中&#xff0c;右键单击项目-属性&#xff1a;

【达梦数据库】会话sp_close关闭不掉

背景 一个纯查询的语句&#xff0c;执行了很久&#xff0c;sp_close关闭不掉 排查方法 1、会话sp_close关闭不掉&#xff0c;sp_cance后再执行sp_close依旧关闭不了&#xff1b; sp_close_session(sess_id)sp_cancel_session_operation(sess_id)2、通过分析事务视图v$trx的…

澳门向永久居民每人发1万澳门元 新计划细节公布

澳门特区行政会今日完成讨论《2025年度现金分享计划》行政法规草案。该法规对2025年度的现金分享发放资格及申请手续进行了规范。根据规定,符合身份条件和在澳条件的居民可获得现金分享,其中永久性居民每人一万澳门元,非永久性居民每人六千澳门元。身份条件是指在2024年12月…

接口测试之文件上传(全)

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 在日常工作中&#xff0c;经常有上传文件功能的测试场景&#xff0c;因此&#xff0c;本文介绍两种主流编写上传文件接口测试脚本的方法。 首先&#xff0c;要知道…

数十家超市曝出食品安全问题 供应链隐患凸显

近日,全国多地超市接连曝出食品安全问题,涉及蔬菜、肉类、包装食品等多个品类。永辉、麦德龙、山姆会员店、小象超市、盒马、中百、朴朴、沃尔玛、奥乐齐和大润发等多家超市被点名。在12315、黑猫和消费保等投诉平台上,可以看到山姆永辉等超市因食品安全问题遭到消费者投诉。…

canvas 实现全屏倾斜重复水印

​ 参考&#xff1a; html、js、canvas实现水印_html页面使用canvas绘制重复水印-CSDN博客 效果 ​​​​ 不求水印显示完全。 实现代码 <template><div class"watermark" ref"waterMark"></div></template><script lang&q…