#include <SPI.h> #include <MFRC522.h> #include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #include <Keypad.h> #include <Servo.h> #include <EEPROM.h> // 硬件定义 #define RST_PIN 9 #define SS_PIN 10 #define BUZZER 5 #define SERVO_PIN 6 #define OLED_RESET 4 // 系统参数 #define PASSWORD_LENGTH 6 #define MAX_CARDS 10 // 全局变量 Servo doorLock; MFRC522 mfrc522(SS_PIN, RST_PIN); Adafruit_SSD1306 display(OLED_RESET); const byte ROWS = 4; const byte COLS = 4; char keys[ROWS][COLS] = { {'1','2','3','A'}, {'4','5','6','B'}, {'7','8','9','C'}, {'*','0','#','D'} }; byte rowPins[ROWS] = {2, 3, 4, 7}; byte colPins[COLS] = {A0, A1, A2, A3}; Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS); String inputPassword = ""; String storedPassword = ""; bool doorState = false; byte storedCards[MAX_CARDS][4]; int cardCount = 0; void setup() { Serial.begin(9600); SPI.begin(); mfrc522.PCD_Init(); display.begin(SSD1306_SWITCHCAPVCC, 0x3C); doorLock.attach(SERVO_PIN); pinMode(BUZZER, OUTPUT); // 初始化密码和卡数据 EEPROM.get(0, storedPassword); if(storedPassword.length() != PASSWORD_LENGTH){ storedPassword = "123456"; // 默认密码 EEPROM.put(0, storedPassword); } loadCardsFromEEPROM(); display.clearDisplay(); display.setTextSize(1); display.setTextColor(WHITE); updateDisplay("System Ready"); setLock(true); } void loop() { checkRFID(); // 检查RFID卡 checkBluetooth(); // 检查蓝牙 checkKeypad(); // 检查按键输入 } // RFID检测函数 void checkRFID() { if (!mfrc522.PICC_IsNewCardPresent()) return; if (!mfrc522.PICC_ReadCardSerial()) return; String cardID = ""; for (byte i = 0; i < mfrc522.uid.size; i++) { cardID += String(mfrc522.uid.uidByte[i], HEX); } if(isAuthorizedCard(cardID)){ operateDoor(true); updateDisplay("Welcome!"); } else { operateDoor(false); updateDisplay("Unauthorized"); } delay(1000); } // 蓝牙处理函数 void checkBluetooth() { if(Serial.available() > 0){ String command =
首先,硬件部分需要确认各个组件的连接。MFRC522通常使用SPI接口,所以要注意Arduino的SPI引脚(如13、12、11)。SSD1306是I2C显示屏,需要接A4和A5。4x4矩阵键盘的行列引脚要正确设置,舵机可能接在PWM引脚,比如9号。
接下来是库的安装,用户可能已经按照之前的指引安装了Adafruit的指纹库,但这里需要确保MFRC522和SSD1306的库也安装了。比如,MFRC522常用MFRC522库,而SSD1306可能需要Adafruit的SSD1306和GFX库。
代码部分,需要包含头文件,初始化各个对象。然后设置各个模块的初始状态,比如舵机角度、显示屏显示欢迎信息。RFID的验证流程是关键,需要读取卡片的UID,与预设的授权列表比较。如果匹配成功,舵机转动开门,否则显示错误。
可能遇到的问题包括SPI和I2C地址冲突,需要检查地址是否正确。比如SSD1306的地址通常是0x3C。此外,矩阵键盘的引脚定义需要和实际接线一致,否则无法读取输入。
用户可能需要功能细节,比如添加新卡的功能。这可以通过键盘输入管理密码,然后扫描新卡并存储UID。这部分代码需要处理用户输入和RFID读取的同步,避免阻塞。
还要考虑错误处理,比如输入错误时的提示,或者RFID读取失败的重试。代码中的延时可能需要调整,确保用户体验流畅。
最后,测试整个系统的流程,确保每个模块协同工作。比如刷卡后显示屏反馈,舵机动作,键盘输入管理功能等。需要提醒用户上传代码前安装所有必要的库,并检查硬件连接是否正确,特别是SPI和I2C的接线是否与其他设备冲突。以下是基于Arduino的RFID门锁系统实现解析,涉及MFRC522射频模块、SSD1306显示屏、矩阵键盘和舵机的协同控制:
#include <SPI.h>
#include <MFRC522.h>
#include <Adafruit_SSD1306.h>
#include <Keypad.h>
#include <Servo.h>
// RFID模块配置
#define RST_PIN 9
#define SS_PIN 10
MFRC522 mfrc522(SS_PIN, RST_PIN);
// OLED显示屏配置
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire);
// 舵机配置
Servo doorLock;
int servoPin = 8;
// 4x4矩阵键盘配置
const byte ROWS = 4;
const byte COLS = 4;
char keys[ROWS][COLS] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
byte rowPins[ROWS] = {7, 6, 5, 4};
byte colPins[COLS] = {3, 2, A0, A1};
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
// 预授权RFID UID列表
String authorizedUIDs[] = {
"12 AB 34 CD",
"56 EF 78 GH"
};
void setup() {
Serial.begin(9600);
SPI.begin();
// 初始化显示屏
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306初始化失败"));
while(1);
}
display.clearDisplay();
// RFID模块初始化
mfrc522.PCD_Init();
// 舵机初始化
doorLock.attach(servoPin);
lockDoor(); // 初始状态锁定
displayWelcomeMessage();
}
void loop() {
// RFID验证流程
if (mfrc522.PICC_IsNewCardPresent() && mfrc522.PICC_ReadCardSerial()) {
String uid = getRFIDUID();
displayUID(uid);
if (isAuthorized(uid)) {
unlockDoor();
delay(5000);
lockDoor();
} else {
displayInvalidCard();
}
mfrc522.PICC_HaltA();
}
// 键盘管理功能
char key = keypad.getKey();
if (key == '#') {
adminMenu();
}
}
主要功能模块解析:
- RFID身份验证
- 使用$MFRC522$库实现射频识别[^1]
getRFIDUID()
函数将二进制UID转换为十六进制字符串: $$ \text{UID}{\text{hex}} = \bigcup{i=0}^{n}\text{ByteToHex}(uid[i]) $$- 授权验证通过字符串匹配算法实现
- 舵机控制 ```cpp void lockDoor() { doorLock.write(0); // 0度位置为锁定 }
void unlockDoor() { doorLock.write(90); // 90度位置为解锁 }
3. **OLED显示模块**
- 使用Adafruit_SSD1306库实现多级界面:
- 欢迎界面
- UID显示界面
- 状态提示界面
- 管理菜单界面
4. **键盘管理功能**
- 通过`adminMenu()`实现特权操作:
```cpp
void adminMenu() {
if (verifyPassword()) {
display.clearDisplay();
display.println(F("1.添加新卡"));
display.println(F("2.删除卡片"));
display.display();
while(1) {
char key = keypad.getKey();
if (key == '1') addNewCard();
if (key == '2') deleteCard();
if (key == '*') break;
}
}
}
硬件连接注意事项:
MFRC522 | Arduino
------------------
SDA | D10
SCK | D13
MOSI | D11
MISO | D12
IRQ | 未接
GND | GND
RST | D9
3.3V | 3.3V
SSD1306 | Arduino
------------------
VCC | 5V
GND | GND
SCL | A5
SDA | A4
相关推荐















