#include <SPI.h>
#include <MFRC522.h>
#include <Servo.h>
// MFRC522引脚定义(接线不变)
#define SS_PIN 10
#define RST_PIN 9
MFRC522 rfid(SS_PIN, RST_PIN);
// 道闸舵机配置
Servo gateServo;
const int servoPin = 2;
const int angleClose = 0; // 道闸关闭角度
const int angleOpen = 90; // 道闸抬杆角度
bool gateOpened = false;
unsigned long openTime = 0;
const unsigned long autoCloseDelay = 2000; // 抬杆2秒自动落杆
byte carUID[4] = {0x11,0x22,0x33,0x44};
// 总通行次数统计
unsigned int totalPass = 0;
void setup() {
Serial.begin(9600); // 向上位机串口上传数据
SPI.begin();
rfid.PCD_Init();
gateServo.attach(servoPin);
gateServo.write(angleClose);
Serial.println("===== ETC车辆识别通行系统启动 =====");
Serial.println("上位机通行日志系统就绪,等待车辆标签识别...");
Serial.print("初始累计通行车辆总数:");
Serial.println(totalPass);
Serial.println("------------------------------------");
}
// 校验卡片是否为本系统合法车辆
bool checkCarID(byte *uidBuf, byte len) {
if(len != 4) return false;
for(int i=0; i<4; i++){
if(uidBuf[i] != carUID[i]){
return false;
}
}
return true;
}
void loop() {
// 检测是否读到车辆标签
if(rfid.PICC_IsNewCardPresent() && rfid.PICC_ReadCardSerial()){
unsigned long runTimeSec = millis() / 1000; // 系统运行秒数,模拟通行时间
Serial.println("\n========【向上位机上传车辆信息】========");
// 1、上传车辆卡号信息
Serial.print("本次通行ETC卡号:");
for(int i=0; i<rfid.uid.size; i++){
Serial.print(rfid.uid.uidByte[i], HEX);
Serial.print(" ");
}
Serial.println();
Serial.print("本次通行时间(系统运行秒):");
Serial.println(runTimeSec);
if(checkCarID(rfid.uid.uidByte, rfid.uid.size)){
Serial.println("身份核验结果:合法备案车辆");
Serial.println("执行动作:道闸自动抬杆放行");
gateServo.write(angleOpen);
gateOpened = true;
openTime = millis();
// 通行总次数+1
totalPass++;
// 单条完整通行日志存档
Serial.print("【通行数据存档】第");
Serial.print(totalPass);
Serial.print("条记录 | 累计通行总车辆:");
Serial.println(totalPass);
}else{
Serial.println("身份核验结果:非法车辆,禁止通行");
Serial.println("执行动作:道闸保持关闭,不生成有效通行记录");
}
Serial.println("======================================================");
rfid.PICC_HaltA();
rfid.PCD_StopCrypto1();
}
// 超时自动落杆
if(gateOpened && millis() - openTime >= autoCloseDelay){
gateServo.write(angleClose);
gateOpened = false;
Serial.println("通行超时,道闸自动落杆,等待下一辆车识别\n");
}
}