详细!基于ESP32的智能门禁系统(华为云iot+微信小程序)

这篇具有很好参考价值的文章主要介绍了详细!基于ESP32的智能门禁系统(华为云iot+微信小程序)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

git地址:智能门禁(云IOT+微信小程序)

开关门效果

设备侧

产品创建

创建产品

创建产品协议类型选择MQTT,数据格式选择JSON,其他参数自定

详细!基于ESP32的智能门禁系统(华为云iot+微信小程序)

设备注册

找到所属产品,认证类型选择密钥,单击确定后注册成功

详细!基于ESP32的智能门禁系统(华为云iot+微信小程序)

注册成功后出现如下页面,点击保存并关闭,会自动下载好"device_id"和"secret",保存好

详细!基于ESP32的智能门禁系统(华为云iot+微信小程序)

模型定义

产品->选择你的产品->查看->模型定义->自定义模型->定义产品的服务

详细!基于ESP32的智能门禁系统(华为云iot+微信小程序)

详细!基于ESP32的智能门禁系统(华为云iot+微信小程序)

添加属性,定义好一系列参数点击确定

可参考技术文档 在线开发产品模型

详细!基于ESP32的智能门禁系统(华为云iot+微信小程序)

添加命令,添加好下发参数和响应参数

详细!基于ESP32的智能门禁系统(华为云iot+微信小程序)

详细!基于ESP32的智能门禁系统(华为云iot+微信小程序)

产品连接

头文件包含

#include<WiFiMulti.h>
#include<Arduino.h>
#include<WebServer.h>
#include<PubsubClient.h>
#include<ArduinoJson.h>

静态参数定义

const char* wifiName = "";//ESP32连接的WiFi名称
const char* wifiPwd = "";//wifi密码
const char* mqttServer = "cdee1c2246.iot-mqtts.cn-north-4.myhuaweicloud.com";//华为云MQTT接入地址
const int   mqtt = 1883;//端口
//下面三个参数为设备接入华为云iot的鉴权参数
const char* clientID = "";
const char* userName = "";
const char* passWord = "";

华为云接入地址可在总览->平台接入地址中查看

详细!基于ESP32的智能门禁系统(华为云iot+微信小程序)

鉴权参数通过参数生成工具生成 MQTT ClientId生成工具

详细!基于ESP32的智能门禁系统(华为云iot+微信小程序)

topic参数定义

topic参数在产品->选择要查看的产品->topic管理可查看

详细!基于ESP32的智能门禁系统(华为云iot+微信小程序)

{device_id}需要替换为设备ID

详细!基于ESP32的智能门禁系统(华为云iot+微信小程序)

const char* topic_report = "$oc/devices/6346a83e06cae4010b4d1387_esp32_door/sys/properties/report";//设备上报
const char* topic_command = "$oc/devices/6346a83e06cae4010b4d1387_esp32_door/sys/commands/#";//设备接收命令
const char* topic_command_response = "$oc/devices/6346a83e06cae4010b4d1387_esp32_door/sys/commands/response/request_id=";//设备发送响应

WIFI连接和MQTT连接

void WifiSetup()
{
  wifiMulti.addAP(wifiName,wifiPwd);//wifi连接
  Serial.print("connecting to:");
  Serial.println(WiFi.SSID());//打印wifi名称
  while(wifiMulti.run() != WL_CONNECTED)
  {
    delay(1000);
    Serial.print(".");
  }
  Serial.println("connection  success!");
  Serial.println("IP address:");
  Serial.println(WiFi.localIP());
}

void MQTT_Init()
{
  client.setServer(mqttServer,mqtt);//设置mqtt服务器参数
  client.setKeepAlive(60);//设置心跳时间
  while(!client.connected())
  {
    Serial.println("Connecting to MQTT...");
    if(client.connect(clientID,userName,passWord))//和华为云iot服务器建立mqtt连接
    {
      Serial.println("connected");
    }else{
      Serial.print("failed with state:");
      Serial.print(client.state());
    }
  }
  client.setCallback(callback);//监听平台下发命令
}

在callback函数定义需要的服务

属性上报和命令响应

属性上报

可参考技术文档 https://support.huaweicloud.com/api-iothub/iot_06_v5_3010.html

详细!基于ESP32的智能门禁系统(华为云iot+微信小程序)

时间戳可有可无,设备上报数据不带该参数或参数格式错误时,则数据上报时间以平台时间为准

修改完成后使用ArduinoJSON官网生成代码 ArduinoJson

选择ESP32->序列化->String

详细!基于ESP32的智能门禁系统(华为云iot+微信小程序)

修改后的JSON数据如下,根据参数不同自行修改

详细!基于ESP32的智能门禁系统(华为云iot+微信小程序)

属性上报详细代码如下

void MQTT_Report()
{
  String JSONmessageBuffer;//定义字符串接收序列化好的JSON数据
//以下将生成好的JSON格式消息格式化输出到字符数组中,便于下面通过PubSubClient库发送到服务器
StaticJsonDocument<96> doc;

JsonObject services_0 = doc["services"].createNestedObject();
services_0["service_id"] = "door";
services_0["properties"]["doorState"] = doorState;//doorState为全局变量

serializeJson(doc, JSONmessageBuffer);

  Serial.println("Sending message to MQTT topic..");
  Serial.println(JSONmessageBuffer);
  
  if(client.publish(topic_report,JSONmessageBuffer.c_str())==true)//使用c_str函数将string转换为char
  {
    Serial.println("Success sending message");
  }else{
    Serial.println("Error sending message");
  }
  client.loop();//保持硬件活跃度
  Serial.println("---------------");
}

命令下发

在产品模型中定义了命令下发和响应参数,就可以通过iot平台对设备下发命令,设备接收命令后按JSON格式像平台发送响应,平台收到响应后才确认下发成功

可参考技术文档 平台命令下发

详细!基于ESP32的智能门禁系统(华为云iot+微信小程序)

const char* topic_command = "$oc/devices/6346a83e06cae4010b4d1387_esp32_door/sys/commands/#";//设备接收命令
const char* topic_command_response = "$oc/devices/6346a83e06cae4010b4d1387_esp32_door/sys/commands/response/request_id=";//设备发送响应

响应参数需要将request_id参数返回给平台,所以需要在callback函数中将平台下发的request_id提取出来

在下发命令中request_id可以使用通配符#代替,但是响应中的request_id必须与下发命令的request_id一致

上文定义的callback函数在此实现

需要提取request_id,打印JSON数据,对下发命令做出对应的硬件处理

void callback(char *topic,byte *payload,unsigned int length)
{

  char *pstr = topic; //指向topic字符串,提取request_id用
 
  /*串口打印出收到的平台消息或者命令*/
  Serial.println();
  Serial.println();
  Serial.print("Message arrived [");
  Serial.print(topic);  //将收到消息的topic展示出来
  Serial.print("] ");
  Serial.println();
 
  payload[length] = '\0'; //在收到的内容后面加上字符串结束符
  char strPayload[255] = {0}; 
  strcpy(strPayload, (const char*)payload);
  Serial.println((char *)payload);  //打印出收到的内容
  Serial.println(strPayload);
 
 
  /*request_id解析部分*///后文有详细解释为什么要提取下发命令的request_id
  char arr[100];  //存放request_id
  int flag = 0;
  char *p = arr;
  while(*pstr)  //以'='为标志,提取出request_id
  {
    if(flag) *p ++ = *pstr;
    if(*pstr == '=') flag = 1;
    pstr++;
  }
  *p = '\0';  
  Serial.println(arr);
 
 
  /*将命令响应topic与resquest_id结合起来*/
  char topicRes[200] = {0};
  strcat(topicRes, topic_command_response);
  strcat(topicRes, arr);
  Serial.println(topicRes);

 // Stream& input;

StaticJsonDocument<192> doc;

DeserializationError error = deserializeJson(doc, payload);

if (error) {
  Serial.print("deserializeJson() failed: ");
  Serial.println(error.c_str());
  return;
}

int paras_doorOpen = doc["paras"]["doorOpen"]; // 1

const char* service_id = doc["service_id"]; // "door"
const char* command_name = doc["command_name"]; // "doorControl"

if(paras_doorOpen == 1)
{
  openDoor();//对应的硬件响应函数
  delay(5000);
ledcWrite(channel, calculatePWM(0));
}if (paras_doorOpen == 0)
{
  closeDoor();
}
MQTT_response(topicRes);//发送响应参数
}

内容根据具体需求修改

MQTT.fx

下载和详细操作可以查看文档,这里只做简单使用

使用MQTT.fx调测

可以使用MQTT.fx工具查看下发命令对应的JSON数据

详细!基于ESP32的智能门禁系统(华为云iot+微信小程序)

点击apply

详细!基于ESP32的智能门禁系统(华为云iot+微信小程序)

通过iot控制台 产品->选择你的产品->命令->同步命令下发

详细!基于ESP32的智能门禁系统(华为云iot+微信小程序)

即可通过MQTT.fx工具查看到下发命令的JSON数据

详细!基于ESP32的智能门禁系统(华为云iot+微信小程序)

复制到ArduinoJSON官网解析数据 ArduinoJson

选择ESP32->反序列化->Stream

详细!基于ESP32的智能门禁系统(华为云iot+微信小程序)

命令响应

参考技术文档 平台命令下发

详细!基于ESP32的智能门禁系统(华为云iot+微信小程序)

详细!基于ESP32的智能门禁系统(华为云iot+微信小程序)

由于三个参数都是可选的,所以直接返回空JSON也是可以的

详细!基于ESP32的智能门禁系统(华为云iot+微信小程序)

void MQTT_response(char *topic)
{
String response;

StaticJsonDocument<128> doc;

JsonObject response = doc.createNestedObject("response");
doc["result_code"] = 0;
doc["response_name"] = "doorControl";
doc["paras"]["doorRes"] = "1";

serializeJson(doc, response);

client.publish(topic,response.c_str());
Serial.println(response);
}

物理层面

使用舵机拉动门把手,延迟后归为即可实现简易的智能门禁系统

舵机控制

舵机是伺服电机的一种,伺服电机就是带有反馈环节的电机,我们可以通过伺服电机进行精确的位置控制或者输出较高的扭矩;
一般舵机的旋转范围是0°~ 180°。舵机是由可变宽度的脉冲控制。脉冲的参数有最小值、最大值和频率。一般而言,舵机的基准信号周期为20ms,所以频率为50kHz。脉冲宽度和舵机的转角0°~ 180°相对应的。

详细!基于ESP32的智能门禁系统(华为云iot+微信小程序)

详细!基于ESP32的智能门禁系统(华为云iot+微信小程序)

这里使用的是180°舵机MG995,如果门把手很难拉动,需要更换扭矩更大的舵机。

PWM信号线可以连接GPIO口上,具体可查看ESP32手册,这里接的是16IO口

代码如下

int freq = 50;      // 频率(20ms周期)
int channel = 8;    // 通道(高速通道(0 ~ 7)由80MHz时钟驱动,低速通道(8 ~ 15)由 1MHz 时钟驱动。)
int resolution = 8; // 分辨率
const int led = 16;

int calculatePWM(int degree)
{ //0-180度
 //20ms周期,高电平0.5-2.5ms,对应0-180度角度
  const float deadZone = 6.4;//对应0.5ms(0.5ms/(20ms/256)) 舵机转动角度与占空比的关系:(角度/90+0.5)*1023/20
  const float max = 32;//对应2.5ms
  if (degree < 0)
    degree = 0;
  if (degree > 180)
    degree = 180;
  return (int)(((max - deadZone) / 180) * degree + deadZone);
}

void closeDoor()
{
  ledcWrite(channel, calculatePWM(0));
}
void openDoor()
{
  ledcWrite(channel, calculatePWM(180));
}

接下来只需在callback函数中增加硬件响应函数,这里是对平台下发的doorOpen做判断

if(paras_doorOpen == 1)
{
  openDoor();//对应的硬件响应函数
  delay(5000);
ledcWrite(channel, calculatePWM(0));
}else if (paras_doorOpen == 0)
{
  closeDoor();
}

应用侧

使用http请求调用API实现应用侧的开发

微信小程序

新建小程序

不使用云服务->JavaScript

删除模板文件pages->新建一个page->输入名称->回车自动生成4个配置文件

详细!基于ESP32的智能门禁系统(华为云iot+微信小程序)

获取Token

Token在计算机系统中代表令牌(临时)的意思,拥有Token就代表拥有某种权限。Token认证就是在调用API的时候将Token加到请求消息头,从而通过身份认证,获得操作API的权限。

详情可查看文档 认证鉴权

wx.request方法
wx.request({
       url: '',
       data:'',
       method: '', // OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, CONNECT
       header: {}, // 设置请求的 header 
       success: function(res){// success
       // success
       },
        fail:function(){
        // fail
       },
        complete: function() {
       // complete
       } 
 });
包装request方法为gettoken方法
  gettoken:function(){
    var that=this;
    wx.request({
      url: '',
      data:'',
      method: '', // OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, CONNECT
      header: {}, // 设置请求的 header 
      success: function(res){// success
      // success
      },
       fail:function(){
       // fail
      },
       complete: function() {
      // complete
      } 
    });
    },
补全请求体

详细!基于ESP32的智能门禁系统(华为云iot+微信小程序)

详细!基于ESP32的智能门禁系统(华为云iot+微信小程序)

  gettoken:function(){
    var that=this;
    wx.request({
      url: 'https://iam.cn-north-4.myhuaweicloud.com/v3/auth/tokens',
      data:'{ "auth": { "identity": { "methods":[  "password" ], "password": {  "user": {  "name": "hw82982217", "password": "",  "domain": { "name": "hw82982217"  } } } },  "scope": { "project": {  "name": "cn-north-4" } } }  }',
      method: 'POST', // OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, CONNECT
      header: {'Content-Type': 'application/json'}, // 设置请求的 header 
      success: function(res){// success
      // success
      var token='';
      console.log(res);
      token=JSON.stringify(res.header['X-Subject-Token']);//解析Token
      token=token.replaceAll("\"","");
      console.log("获取token=\n"+token);
      that.settoken(token);
      },
       fail:function(){
       // fail
      },
       complete: function() {
      // complete
      } 
    });
    },
API Explorer调试

获取IAM用户Token(使用密码)
设置好参数->点击调试->可以看到响应头的Token

详细!基于ESP32的智能门禁系统(华为云iot+微信小程序)

传出Token

    settoken:function(_token){
      this.data.token=_token;
      wx.setStorageSync('token', _token);//将Token保存到缓存中
      console.log('外部获取到token:'+this.data.token);
      this.setData({result:"token认证成功"});
    },

命令下发

    issuecom1:function(){
      var that=this;
      var token=wx.getStorageSync('token');
      wx.request({
        url: 'https://cdee1c2246.iotda.cn-north-4.myhuaweicloud.com:443/v5/iot/0ab004b22500f4b72fa3c00977112a06/devices/6346a83e06cae4010b4d1387_esp32_door/commands',
        data:'{"service_id": "door","command_name": "doorControl","paras": {"doorOpen": "1"} }',
        method:'POST',
        header:{"X-Auth-Token": token,"Content-Type": "application/json"},
        success:function(res){
          console.log("成功\n");
          console.log(res);
        },
        fail:function(){
          console.log("失败");
        },
      })
    },
    //关门
    issuecom0:function(){
      var that=this;
      var token=wx.getStorageSync('token');
      wx.request({
        url: 'https://cdee1c2246.iotda.cn-north-4.myhuaweicloud.com:443/v5/iot/0ab004b22500f4b72fa3c00977112a06/devices/6346a83e06cae4010b4d1387_esp32_door/commands',
        data:'{"service_id": "door","command_name": "doorControl","paras": {"doorOpen": "0"} }',
        method:'POST',
        header:{"X-Auth-Token": token,"Content-Type": "application/json"},
        success:function(res){
          console.log("成功\n");
          console.log(res);
        },
        fail:function(){
          console.log("失败");
        },
      })
    },

页面设计

为界面添加两个按钮

详细!基于ESP32的智能门禁系统(华为云iot+微信小程序)

设置相应的响应函数

详细!基于ESP32的智能门禁系统(华为云iot+微信小程序)文章来源地址https://www.toymoban.com/news/detail-425739.html

到了这里,关于详细!基于ESP32的智能门禁系统(华为云iot+微信小程序)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • RFID课程设计--基于STM32F103RCT6的智能门禁系统,STM32RCT6+RC522+OLED+DHT11+4*4矩阵键盘

      本次课程设计要求如下,我们团队两人完成了90%的功能。   其中我们设置的是刷卡错误3次不报警,密码输入错3次报警(原理相同,大家根据需要自行修改)   然后暂时只能显示卡号和卡是第几个录入到系统中的,想到身份证号和电话(身份信息)输进去有点长就没

    2024年01月16日
    浏览(81)
  • 元宇宙场景下基于区块链人脸识别门禁系统-摘自宣科智能

    如今随着社会经济发展水平的提升,市场对于人脸识别技术的需求扩大。如刷脸门禁、上下班打卡、访客来访等都可能扫一扫脸。基于人脸识别的技术迭代更新,人脸识别技术在安防领域也有了更加开阔的发展空间,现有技术的人脸识别门禁系统存在诸多问题,例如:信息的

    2024年02月11日
    浏览(46)
  • FreeRTOS小项目实战------基于FreeRTOS和stm32的门禁系统

    目录 收获 系统总体框架 程序框架 具体程序实现 工程文件网盘链接 收获 学习 freertos的移植与裁剪 ,对任务间通信的认识更加深刻,加深了实时操作系统的理解,学习了as608指纹模块,rc522刷卡模块等模块的简单使用。 系统总体框架 该系统采用STM32F407ZGT6为主控芯片,在Fre

    2024年02月02日
    浏览(47)
  • 【毕业设计】基于RFID的门禁系统 - 单片机 物联网 嵌入式 stm32

    Hi,大家好,这里是丹成学长,今天向大家介绍一个 如何使用RFID技术构建一个单片机门禁系统 基于RFID的门禁系统 大家可用于 课程设计 或 毕业设计 单片机-嵌入式毕设选题大全及项目分享: https://blog.csdn.net/m0_71572576/article/details/125409052 本篇博客,学长先向大家介绍射频识别

    2024年02月03日
    浏览(53)
  • 基于STM32的多功能门禁系统(AS608指纹识别、密码解锁、刷卡解锁)

    目录 一、项目功能 二、视频 三、原理图 4、材料选择 5、部分程序 1、AS608指纹解锁;可以录入、删除、验证指纹; 2、密码解锁;可以密码验证、修改密码和保存密码; 3、刷卡解锁; 4、OLED液晶显示; 基于STM32的多功能门禁系统(AS608指纹识别、密码解锁、刷卡解锁) AS608指纹

    2024年02月12日
    浏览(55)
  • 基于51单片机的FRID智能门禁系统(RFID,12864,AT24C02,步进电机......)

    目录 门禁系统 需要的器件 设计思路 流程图实现 技术实现 实物接线图 实物接线图  函数设计 部分主程序代码,截取片段 12864显示模块 步进电机模块以及蜂鸣器 FRID射频模块 AT24C02模块 功能实现及其源代码 完整文件         STC89C52,MFRC-522 RFID射频模块,AT24C02存储电路,

    2024年02月07日
    浏览(54)
  • 【单片机毕业设计】【mcuclub-dz-032】基于单片机的智能门禁控制系统设计

    项目名:基于单片机的门禁的设计 单片机:STM32F103C8T6 mcuclub-dz-032 功能简介: 1、通过扫码枪进行扫描二维码,当二维码识别成功,10s内需触发红外避障管,并通过红外测温模块进行测温,如果温度正常,则自动开锁,如果温度异常,则声光报警3次,锁不打开 2、通过RFID进行

    2024年01月18日
    浏览(73)
  • 物联网毕业设计 RFID智能门禁系统

    Hi,大家好,学长今天向大家介绍一个 如何使用RFID技术构建一个单片机门禁系统 基于RFID的门禁系统 大家可用于 课程设计 或 毕业设计 本篇博客,学长先向大家介绍射频识别技术的概念、 分类及工作原。然后介绍 本次使用的射频芯片 MFRC522。 RFID 系统设计可分为硬件部分和

    2024年02月07日
    浏览(44)
  • 毕业设计 RFID 单片机智能门禁系统

    Hi,大家好,学长今天向大家介绍一个 如何使用RFID技术构建一个单片机门禁系统 基于RFID的门禁系统 大家可用于 课程设计 或 毕业设计 本篇博客,学长先向大家介绍射频识别技术的概念、 分类及工作原。然后介绍 本次使用的射频芯片 MFRC522。 RFID 系统设计可分为硬件部分和

    2024年02月04日
    浏览(48)
  • stm32毕设 stm32 RFID员工打卡门禁系统(源码+硬件+论文)

    🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。 为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天

    2024年02月20日
    浏览(63)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包