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

2023-11-25 23:59

本文主要是介绍作品集之基于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 reconnectedwhile (!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   ");   }}
}

这篇关于作品集之基于nodemcu的智能门禁系统(可用作毕设)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/424820

相关文章

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

让树莓派智能语音助手实现定时提醒功能

最初的时候是想直接在rasa 的chatbot上实现,因为rasa本身是带有remindschedule模块的。不过经过一番折腾后,忽然发现,chatbot上实现的定时,语音助手不一定会有响应。因为,我目前语音助手的代码设置了长时间无应答会结束对话,这样一来,chatbot定时提醒的触发就不会被语音助手获悉。那怎么让语音助手也具有定时提醒功能呢? 我最后选择的方法是用threading.Time

智能交通(二)——Spinger特刊推荐

特刊征稿 01  期刊名称: Autonomous Intelligent Systems  特刊名称: Understanding the Policy Shift  with the Digital Twins in Smart  Transportation and Mobility 截止时间: 开放提交:2024年1月20日 提交截止日

基于 YOLOv5 的积水检测系统:打造高效智能的智慧城市应用

在城市发展中,积水问题日益严重,特别是在大雨过后,积水往往会影响交通甚至威胁人们的安全。通过现代计算机视觉技术,我们能够智能化地检测和识别积水区域,减少潜在危险。本文将介绍如何使用 YOLOv5 和 PyQt5 搭建一个积水检测系统,结合深度学习和直观的图形界面,为用户提供高效的解决方案。 源码地址: PyQt5+YoloV5 实现积水检测系统 预览: 项目背景

【C++学习笔记 20】C++中的智能指针

智能指针的功能 在上一篇笔记提到了在栈和堆上创建变量的区别,使用new关键字创建变量时,需要搭配delete关键字销毁变量。而智能指针的作用就是调用new分配内存时,不必自己去调用delete,甚至不用调用new。 智能指针实际上就是对原始指针的包装。 unique_ptr 最简单的智能指针,是一种作用域指针,意思是当指针超出该作用域时,会自动调用delete。它名为unique的原因是这个

单片机毕业设计基于单片机的智能门禁系统的设计与实现

文章目录 前言资料获取设计介绍功能介绍程序代码部分参考 设计清单具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订

java计算机毕设课设—停车管理信息系统(附源码、文章、相关截图、部署视频)

这是什么系统? 资源获取方式在最下方 java计算机毕设课设—停车管理信息系统(附源码、文章、相关截图、部署视频) 停车管理信息系统是为了提升停车场的运营效率和管理水平而设计的综合性平台。系统涵盖用户信息管理、车位管理、收费管理、违规车辆处理等多个功能模块,旨在实现对停车场资源的高效配置和实时监控。此外,系统还提供了资讯管理和统计查询功能,帮助管理者及时发布信息并进行数据分析,为停车场的科学

【C++】作用域指针、智能指针、共享指针、弱指针

十、智能指针、共享指针 从上篇文章 【C++】如何用C++创建对象,理解作用域、堆栈、内存分配-CSDN博客 中我们知道,你的对象是创建在栈上还是在堆上,最大的区别就是对象的作用域不一样。所以在C++中,一旦程序进入另外一个作用域,那其他作用域的对象就自动销毁了。这种机制有好有坏。我们可以利用这个机制,比如可以自动化我们的代码,像智能指针、作用域锁(scoped_lock)等都是利用了这种机制。

什么是LED智能会议一体机?COB超微小间距LED会议一体机大势所趋

LED智能会议一体机,作为现代会议室革新的核心装备,正逐步颠覆传统会议模式的界限。它不仅仅是一台集成了高清显示、触控互动、音视频处理及远程协作等功能于一体的智能设备,更是推动会议效率与体验双重飞跃的关键力量。随着技术的不断进步,特别是COB(Chip On Board)超微小间距LED技术的引入,LED智能会议一体机正迎来前所未有的发展机遇,成为大势所趋。 COB技术通过将LED芯片直接封装在基

基于微信小程序与嵌入式系统的智能小车开发(详细流程)

一、项目概述 本项目旨在开发一款智能小车,结合微信小程序与嵌入式系统,提供实时图像处理与控制功能。用户可以通过微信小程序远程操控小车,并实时接收摄像头采集的图像。该项目解决了传统遥控小车在图像反馈和控制延迟方面的问题,提升了小车的智能化水平,适用于教育、科研和娱乐等多个领域。 二、系统架构 1. 系统架构设计 本项目的系统架构主要分为以下几个部分: 微信小程序:负责用户界面、控制指令的