作品集之基于nodemcu的智能门禁系统(可用作毕设)

前言

智能门禁系统主要分为WIFI联网部分、刷卡部分、OLED显示部分以及报警部分。通过nodemcu连接emqx自建服务器上,将用户刷卡的时间、刷卡卡号、是否刷卡成功等信息上报至物联网服务器emqx。如果需要,可联系!

正文部分

硬件电路原理图如下所示。
在这里插入图片描述
PCB电路板如下如所示。
在这里插入图片描述

系统测试

使用 nodemcu 作为门禁管理系统的主控芯片,RC522 射频识别卡作为系统外设,LED 灯模拟门禁的开关状态,蜂鸣器作为报警工具,oled 显示屏用于显示卡号和提示卡号是否正确。提前向系统注册好一张卡片,当使用正确卡刷卡时,串口显示数据为“正确卡,卡号:2182016”,2182016 为刚刚刷卡的卡号,此时 LED 灯亮,表示门已经打开,OLED 显示屏显示卡号以及门打开的提示信息。
在这里插入图片描述
使用没有注册好的卡进行刷卡操作,串口数据显示为“错误卡,卡号:
21112103”,这里的 2112103 为刚刚刷卡的卡号,此时系统发出报警提示,蜂鸣
器响,OLED 显示屏显示卡号以及门打开的提示信息,测试结果如下图所示:
在这里插入图片描述
在这里插入图片描述

系统源码

#include <SPI.h>
#include <MFRC522.h>
#include <EEPROM.h> 
//Wire、ACROBOTIC_SSD1306为OLED库文件
#include <Wire.h>
#include <ACROBOTIC_SSD1306.h>
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <ArduinoJson.h>

#define wifi_ssid "MiJ"
#define wifi_password "123456780"
#define mqtt_server "changyuan.store"  // MQTT Cloud address
#define publish_topic "/client2/pub"

#define BODY_FORMAT     "{\"clientId\":\"%s\",\"topic\":\"%s\",\"params\":{\"UID\":\"%s\",\"status\":\"%s\"}}"

#define RST_PIN         2           // D4 2配置针脚
#define SS_PIN          0     // D3 0口
#define LED             3 //RX 高电平有效
#define BEEP            1  //tx 低电平有效


WiFiClient espClient;
PubSubClient client(espClient);
MFRC522 rfid(SS_PIN, RST_PIN); //实例化类

// 初始化数组用于存储读取到的NUID 
byte nuidPICC[4];
//存储卡序列号的变量admin
String  Str_ui_in="21182016";
//存储卡号的全局UidCard
String UidCard;
String  clientId="client2";
void setup() { 
  Serial.begin(115200);
  SPI.begin(); // 初始化SPI总线
  EEPROM.begin(1054);
  rfid.PCD_Init(); // 初始化 MFRC522 
  pinMode(LED,OUTPUT);
  pinMode(BEEP,OUTPUT);
  digitalWrite(BEEP,HIGH);
   //oled部分显示
  Wire.begin();  
  oled.init();                     
  displayMain();
  setup_wifi();
  client.setServer(mqtt_server, 1883);
}
void loop() { 
   if (!client.connected()) {
        reconnect();
    }
    else{ 
    oled.setTextXY(6,1);     
    oled.putString("WIFI Successful");          
    swipeCard();
  }
  client.loop();
  delay(1000);
}
//刷卡函数
void  swipeCard()
{
   //刷卡
  if(ReadCard())//刷卡成功
  {
    //是否可以开门
    if(checkId(UidCard))
    {
      String str1="        ";
      oled.setTextXY(2,1);     
      oled.putString("cardID:"+UidCard);
      oled.setTextXY(3,1);
      oled.putString("Door opened!");
      String stat= "true";
      char jsonBuf[128];//存放payload主题内容
      sprintf(jsonBuf,BODY_FORMAT,clientId.c_str(),publish_topic,UidCard.c_str(),stat.c_str());
      client.publish(publish_topic, jsonBuf);
      openLED(); 
      oled.setTextXY(2,1);
      oled.putString("cardID:"+str1);
      oled.setTextXY(3,1);
      oled.putString("            ");
    }
    else
    {
      String str1="        ";
      oled.setTextXY(2,1);     
      oled.putString("cardID:"+UidCard);
      oled.setTextXY(3,1);
      oled.putString("Failed to open!");
      oled.setTextXY(4,1);
      oled.putString("Card not exist!");
      String stat= "false";
      char jsonBuf[128];//存放payload主题内容
      sprintf(jsonBuf,BODY_FORMAT,clientId.c_str(),publish_topic,UidCard.c_str(),stat.c_str()); 
      client.publish(publish_topic,jsonBuf);
      digitalWrite(BEEP, LOW);
      delay(1000);
      digitalWrite(BEEP,HIGH);
      delay(1000);
      oled.setTextXY(2,1);     
      oled.putString("cardID:"+str1);
      oled.setTextXY(3,1);
      oled.putString("               ");
      oled.setTextXY(4,1);
      oled.putString("               ");
    }
  }
}

//读卡函数
boolean  ReadCard()
{
   // 找卡
  if ( ! rfid.PICC_IsNewCardPresent())
    return false;
  // 验证NUID是否可读
  if ( ! rfid.PICC_ReadCardSerial())
    return false;
  MFRC522::PICC_Type piccType = rfid.PICC_GetType(rfid.uid.sak);
  // 检查是否MIFARE卡类型
  if (piccType != MFRC522::PICC_TYPE_MIFARE_MINI &&  
    piccType != MFRC522::PICC_TYPE_MIFARE_1K &&
    piccType != MFRC522::PICC_TYPE_MIFARE_4K) {
    Serial.println("不支持读取此卡类型");
    return false;
  }
  // 将NUID保存到nuidPICC数组
  for (byte i = 0; i < 4; i++) {
    nuidPICC[i] = rfid.uid.uidByte[i];
  }   
  Serial.println("十进制UID:");
  UidCard = printDec(rfid.uid.uidByte, rfid.uid.size);
  // 使放置在读卡区的IC卡进入休眠状态,不再重复读卡
  rfid.PICC_HaltA();
  // 停止读卡模块编码
  rfid.PCD_StopCrypto1();  
  return true;
}
//将卡号转化成String类型
String printDec(byte *buffer, byte bufferSize) {
   String s;
   int bai,shi;
  for (byte i = 0; i < bufferSize; i++) {
     bai=buffer[i]/100;
     shi=buffer[i]/10%10;
     s = s+bai+shi;
  }
  return s;
}
//开灯模拟开门
void  openLED()
{
       digitalWrite(LED, HIGH);
       delay(1000);
       digitalWrite(LED,LOW);
       delay(800);
}
//检查卡号是否存入存储器
boolean  checkId(String Str_id)
{
   boolean isCheck=false;
   for(int i = 0; i<6;i++)
   {
      String idStr =get_String(8,1+8*i);
      if(Str_id==idStr)
       isCheck=true;
   }
  return isCheck;
}
void  displayMain()
{
  oled.clearDisplay();         
  oled.setTextXY(0,4);     
  oled.putString("Welcome");
  oled.setTextXY(2,1);     
  oled.putString("cardID:");
}
//拿到存储器中数据
//a位是字符串长度,b是起始位
String get_String(int a, int b){ 
  String data = "";
  //从EEPROM中逐个取出每一位的值,并链接
  for (int i = 0; i < a; i++){
    data += char(EEPROM.read(b + i));
  }
  return data;
}

void setup_wifi() {
    delay(10);
    WiFi.begin(wifi_ssid, wifi_password);
    while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print("."); 
        oled.setTextXY(6,1);     
        oled.putString("Connecting WIFI");   
    }
}

void reconnect() {
    // Loop until we're reconnected
    while (!client.connected()) {
        Serial.print("Attempting MQTT connection...");
        if (client.connect("nodeMcuRFID")) {
            Serial.println("connected");
        } else {
            Serial.print("failed, rc=");
            Serial.print(client.state());
            Serial.println(" try again in 5 seconds");
            delay(5000);
            oled.setTextXY(6,1);     
            oled.putString("Reconnecting   ");   
        }
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

姜大大的博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值