如何通过WiFi/以太网将Arduino RFID考勤系统连接至MySQL数据库?
简化版Arduino RFID考勤系统连MySQL步骤
嘿,我来帮你梳理下把Arduino+RFID考勤系统连到MySQL的简化步骤,亲测靠谱!
一、先把硬件凑齐
- Arduino主板(Uno/Nano都能用,Uno稳定性更好)
- MFRC522 RFID阅读器模块(最常用的入门款,性价比拉满)
- WiFi扩展板(比如ESP8266 WiFi Shield,嫌麻烦直接用ESP32代替Arduino更省心)
- 可选:以太网扩展板(如果有有线网络环境)
- 几张RFID卡片/标签
二、MySQL数据库端配置
- 先在本地电脑或云服务器上装好MySQL,创建一个考勤专用数据库,比如叫
attendance_db - 建一张考勤记录表
records,字段不用太复杂,够用就行:
CREATE TABLE records ( id INT AUTO_INCREMENT PRIMARY KEY, rfid_uid VARCHAR(20) NOT NULL, student_name VARCHAR(50), attendance_time DATETIME DEFAULT CURRENT_TIMESTAMP );
- 别用root用户连接Arduino!专门建一个权限受限的用户,只给
INSERT和SELECT权限,安全第一:
CREATE USER 'arduino_attend'@'%' IDENTIFIED BY '你的安全密码'; GRANT INSERT, SELECT ON attendance_db.* TO 'arduino_attend'@'%'; FLUSH PRIVILEGES;
小提示:如果是本地测试,把
%换成localhost;如果是远程服务器,要确保服务器开放3306端口,并且允许该用户远程连接。
三、Arduino端代码编写
这里以ESP8266 WiFi扩展板为例(换成ESP32逻辑完全一致):
- 先在Arduino IDE里装必要的库:
MFRC522:用来读取RFID标签的UIDESP8266WiFi:处理WiFi连接MySQL_Connector_Arduino:负责和MySQL通信(或者用MySQL_MariaDB_Generic,兼容性更强)
- 核心代码框架,直接改参数就能用:
#include <SPI.h> #include <MFRC522.h> #include <ESP8266WiFi.h> #include <MySQL_Connection.h> #include <MySQL_Cursor.h> // RFID模块引脚定义(根据你的接线改) #define SS_PIN 10 #define RST_PIN 9 MFRC522 mfrc522(SS_PIN, RST_PIN); // WiFi账号密码 const char* ssid = "家里的WiFi名称"; const char* password = "WiFi密码"; // MySQL服务器信息 IPAddress server_addr(192,168,1,100); // 你的MySQL服务器IP char user[] = "arduino_attend"; char db_password[] = "刚才设置的数据库用户密码"; char db_name[] = "attendance_db"; WiFiClient client; MySQL_Connection conn((Client *)&client); MySQL_Cursor *cursor; void setup() { Serial.begin(9600); SPI.begin(); mfrc522.PCD_Init(); // 连接WiFi WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println("\nWiFi连接成功!"); // 连接MySQL数据库 if (conn.connect(server_addr, 3306, user, db_password)) { Serial.println("数据库连接成功!"); cursor = new MySQL_Cursor(&conn); } else { Serial.println("数据库连接失败!检查IP/密码/权限!"); while(1); // 卡住等你排查问题 } } void loop() { // 检查有没有RFID卡靠近 if (mfrc522.PICC_IsNewCardPresent() && mfrc522.PICC_ReadCardSerial()) { // 把UID转成字符串格式 String uidStr = ""; for (byte i = 0; i < mfrc522.uid.size; i++) { uidStr += String(mfrc522.uid.uidByte[i], HEX); } uidStr.toUpperCase(); // 统一转大写,避免大小写问题 // 插入考勤记录到数据库 char insert_sql[120]; sprintf(insert_sql, "INSERT INTO records(rfid_uid) VALUES('%s')", uidStr.c_str()); cursor->execute(insert_sql); Serial.print("已打卡:UID="); Serial.println(uidStr); // 延迟一下,避免重复读取同一张卡 delay(2000); mfrc522.PICC_HaltA(); mfrc522.PCD_StopCrypto1(); } }
补充:如果用以太网扩展板,把WiFi相关代码换成
Ethernet库的连接逻辑就行,数据库通信部分完全一样。
四、测试与调试
- 把代码上传到Arduino,打开串口监视器(波特率9600),看是否成功连接WiFi和数据库
- 拿RFID卡靠近阅读器,看串口是否输出“已打卡”的提示
- 登录MySQL,执行
SELECT * FROM records;,检查是否有新的考勤记录插入
五、可选优化建议
- 可以加一张
students表,把RFID UID和学生姓名绑定,查询时直接显示姓名 - 增加重复打卡判断,比如10分钟内同一UID不重复记录
- 用PHP写个简单的本地中转接口,让Arduino先请求接口,再由接口操作数据库,更安全也更灵活
内容的提问来源于stack exchange,提问作者DK1
相关产品推荐
相关产品推荐

