当前位置: 首页 > news >正文

返利网站怎么做网站建设与推广 范文

返利网站怎么做,网站建设与推广 范文,wordpress 制作单页,权威发布的最新通告一、项目介绍 智能门禁系统是一种应用物联网技术的智能化安防系统#xff0c;提供安全高效的门禁管理和远程监控功能。传统的门禁系统通常使用磁卡、密码或钥匙等方式进行开锁#xff0c;但存在易丢失、易复制、操作繁琐等问题。为了解决这些问题#xff0c;并提高门禁安全…一、项目介绍 智能门禁系统是一种应用物联网技术的智能化安防系统提供安全高效的门禁管理和远程监控功能。传统的门禁系统通常使用磁卡、密码或钥匙等方式进行开锁但存在易丢失、易复制、操作繁琐等问题。为了解决这些问题并提高门禁安全性和便捷性这里介绍了一款基于STM32F103和华为云IOT的智能门禁系统的设计方案。 系统的核心控制器采用了STM32F103单片机具有丰富的外设接口和强大的处理能力能够实现对门禁设备的精确控制和数据处理。为了提供多种开锁方式选择了RFID-RC522读写模块和4x4电容矩阵键盘作为输入设备用户可以通过刷卡或输入密码来开启门禁。采用了28BYJ-48步进电机作为门锁控制装置能够实现对门锁的精确控制。 为了方便用户与门禁系统进行交互使用了SPI接口的0.96寸OLED显示屏和蜂鸣器可以显示门锁状态信息和人机交互提示音。此外为了实现远程控制和消息推送功能选择了ESP8266 WiFi模块连接华为云物联网平台用户可以通过手机APP实现远程开锁并且可以随时监控门锁状态。当门锁打开或关闭成功时手机APP会收到通知提醒以增加用户的使用安全性和便捷性。 通过将STM32F103和华为云IOT相结合可以实现智能门禁系统在数据传输、远程控制和消息推送等方面的高效、稳定和安全性能。该系统不仅提供了多种开锁方式和人机交互功能还具备远程监控和消息提醒的智能化特点适用于住宅小区、学校、企事业单位等场所的门禁管理需求。 二、硬件选型 在智能门禁系统的硬件选型中选择了以下模块 【1】主控制器STM32F103单片机。它是一款高性能、低功耗的ARM Cortex-M3内核微控制器具有丰富的外设接口和强大的计算和控制能力非常适合用于门禁系统的控制和数据处理。 【2】RFID读写模块RFID-RC522。这个模块基于13.56MHz的射频识别技术可以实现对RFID卡片的读写操作通过刷卡方式进行门禁的开启和关闭。 【3】门锁控制28BYJ-48步进电机。该步进电机结构简单、体积小巧能够实现对门锁的准确控制提供开启和关闭门锁的功能。 【4】密码输入设备4x4电容矩阵键盘。这种键盘采用电容触摸技术具有防水、灵敏度高的特点用户可以通过输入密码来开启门禁。 【5】显示屏SPI接口的0.96寸OLED显示屏。该显示屏具有高亮度、高对比度和低功耗的特点可以显示门锁状态信息和人机交互提示。 【6】网络连接模块ESP8266-WIFI。这个模块支持WiFi通信标准能够实现与华为云物联网平台的连接实现远程控制和消息推送功能。 【7】门状态检测红外磁感应模块。通过红外磁感应技术可以检测门是否打开或关闭提供准确的门状态信息。 选择的这些硬件可以满足智能门禁系统的各项功能需求。主控制器STM32F103为整个系统提供了稳定可靠的控制和处理能力RFID读写模块和密码键盘提供了多种开锁方式步进电机实现了精确的门锁控制显示屏和蜂鸣器提供了人机交互功能ESP8266-WIFI模块连接华为云实现了远程控制和消息推送红外磁感应模块检测门状态使得整个智能门禁系统更加智能、安全和便捷。 三、系统设计思路 智能门禁系统的设计思路 【1】硬件连接与集成各个硬件组件如主控制器、RFID读写模块、步进电机等需要进行正确的连接和接口配置。通过连接线将各个硬件模块与主控制器相连并设置正确的引脚连接和寄存器配置以确保它们能够正常工作并实现相应的功能。 【2】数据采集与处理系统通过RFID读写模块读取用户刷卡信息或通过电容矩阵键盘获取用户输入的密码信息。主控制器接收到这些数据后进行相应的数据处理例如验证刷卡信息或密码是否正确。如果验证通过则进行下一步的门禁控制流程。 【3】门锁控制与状态检测主控制器通过控制步进电机来实现门锁的精确控制。当用户验证成功后主控制器发送指令给步进电机使其旋转相应的步数从而打开或关闭门锁。同时主控制器还使用红外磁感应模块来检测门的状态以确保门锁的准确控制。 【4】用户界面与人机交互系统配备了0.96寸OLED显示屏和蜂鸣器通过显示屏可以向用户展示门锁的状态信息和相关提示如开锁成功、密码错误等。蜂鸣器则可以发出不同的提示音提供与用户的交互反馈。 【5】远程控制与消息推送通过ESP8266-WIFI模块与华为云物联网平台连接使得用户可以通过手机APP进行远程开锁操作。用户在手机APP上输入开锁指令后APP会将指令发送到华为云平台再由云平台将指令传输给物联网设备智能门禁系统。主控制器接收到开锁指令后执行相应的控制动作并将结果通过云平台发送回手机APP实现远程控制和消息推送功能。 整个系统的设计思路是将各个硬件组件协调配合通过主控制器进行数据处理和门锁控制并提供人机交互界面和远程控制功能以实现智能门禁系统的安全、高效和便捷的门禁管理和远程监控。 四、华为云物联网平台部署 华为云官网: https://www.huaweicloud.com/ 打开官网搜索物联网就能快速找到 设备接入IoTDA。 4.1 物联网平台介绍 华为云物联网平台IoT 设备接入云服务提供海量设备的接入和管理能力将物理设备联接到云支撑设备数据采集上云和云端下发命令给设备进行远程控制配合华为云其他产品帮助我们快速构筑物联网解决方案。 使用物联网平台构建一个完整的物联网解决方案主要包括3部分物联网平台、业务应用和设备。 物联网平台作为连接业务应用和设备的中间层屏蔽了各种复杂的设备接口实现设备的快速接入同时提供强大的开放能力支撑行业用户构建各种物联网解决方案。 设备可以通过固网、2G/3G/4G/5G、NB-IoT、Wifi等多种网络接入物联网平台并使用LWM2M/CoAP、MQTT、HTTPS协议将业务数据上报到平台平台也可以将控制命令下发给设备。 业务应用通过调用物联网平台提供的API实现设备数据采集、命令下发、设备管理等业务场景。 4.2 开通物联网服务 地址 https://www.huaweicloud.com/product/iothub.html 点击总览查看接入信息。 我们当前设备准备采用MQTT协议接入华为云平台这里可以看到MQTT协议的地址和端口号等信息。 总结: 端口号 MQTT (1883)| MQTTS (8883) 接入地址 a161a58a78.iot-mqtts.cn-north-4.myhuaweicloud.com根据域名地址得到IP地址信息: Microsoft Windows [版本 10.0.19045.2965] (c) Microsoft Corporation。保留所有权利。C:\Users\11266ping a161a58a78.iot-mqtts.cn-north-4.myhuaweicloud.com正在 Ping a161a58a78.iot-mqtts.cn-north-4.myhuaweicloud.com [121.36.42.100] 具有 32 字节的数据: 来自 121.36.42.100 的回复: 字节32 时间38ms TTL94 来自 121.36.42.100 的回复: 字节32 时间37ms TTL94 来自 121.36.42.100 的回复: 字节32 时间38ms TTL94 来自 121.36.42.100 的回复: 字节32 时间36ms TTL94121.36.42.100 的 Ping 统计信息:数据包: 已发送 4已接收 4丢失 0 (0% 丢失) 往返行程的估计时间(以毫秒为单位):最短 36ms最长 38ms平均 37msC:\Users\11266 MQTT协议接入端口号有两个1883是非加密端口8883是证书加密端口单片机无法加载证书所以使用1883端口比较合适。 接下来的ESP8266就采用1883端口连接华为云物联网平台。 4.3 创建产品 1创建产品 点击产品页再点击左上角创建产品。 2填写产品信息 根据自己产品名字填写。 3产品创建成功 4添加自定义模型 产品创建完成之后点击进入产品详情页面翻到最下面可以看到模型定义。 这个模型就是定义自己设备接下来需要向服务器上传那些数据类型。根据自己的数据类型进行编写。 先点击自定义模型。 再创建一个服务ID。 接着点击新增属性。 4.4 添加设备 产品是属于上层的抽象模型接下来在产品模型下添加实际的设备。添加的设备最终需要与真实的设备关联在一起完成数据交互。 1注册设备 2根据自己的设备填写 3保存设备信息 创建完毕之后点击保存并关闭得到创建的设备密匙信息。该信息在后续生成MQTT三元组的时候需要使用。 4设备创建完成 可以点击设备进入到设备详情页面。 4.5 MQTT协议主题订阅与发布 1MQTT协议介绍 当前的设备是采用MQTT协议与华为云平台进行通信。 MQTT是一个物联网传输协议它被设计用于轻量级的发布/订阅式消息传输旨在为低带宽和不稳定的网络环境中的物联网设备提供可靠的网络服务。MQTT是专门针对物联网开发的轻量级传输协议。MQTT协议针对低带宽网络低计算能力的设备做了特殊的优化使得其能适应各种物联网应用场景。目前MQTT拥有各种平台和设备上的客户端已经形成了初步的生态系统。 MQTT是一种消息队列协议使用发布/订阅消息模式提供一对多的消息发布解除应用程序耦合相对于其他协议开发更简单MQTT协议是工作在TCP/IP协议上由TCP/IP协议提供稳定的网络连接所以只要具备TCP协议栈的网络设备都可以使用MQTT协议。 本次设备采用的ESP8266就具备TCP协议栈能够建立TCP连接所以配合STM32代码里封装的MQTT协议就可以与华为云平台完成通信。 华为云的MQTT协议接入帮助文档在这里: https://support.huaweicloud.com/devg-iothub/iot_02_2200.html 业务流程 2华为云平台MQTT协议使用限制 描述限制支持的MQTT协议版本3.1.1与标准MQTT协议的区别支持Qos 0和Qos 1支持Topic自定义不支持QoS2不支持will、retain msgMQTTS支持的安全等级采用TCP通道基础 TLS协议最高TLSv1.3版本单帐号每秒最大MQTT连接请求数无限制单个设备每分钟支持的最大MQTT连接数1单个MQTT连接每秒的吞吐量即带宽包含直连设备和网关3KB/sMQTT单个发布消息最大长度超过此大小的发布请求将被直接拒绝1MBMQTT连接心跳时间建议值心跳时间限定为30至1200秒推荐设置为120秒产品是否支持自定义Topic支持消息发布与订阅设备只能对自己的Topic进行消息发布与订阅每个订阅请求的最大订阅数无限制 3主题订阅格式 帮助文档地址https://support.huaweicloud.com/devg-iothub/iot_02_2200.html 对于设备而言一般会订阅平台下发消息给设备 这个主题。 设备想接收平台下发的消息就需要订阅平台下发消息给设备 的主题订阅后平台下发消息给设备设备就会收到消息。 如果设备想要知道平台下发的消息需要订阅上面图片里标注的主题。 以当前设备为例最终订阅主题的格式如下: $oc/devices/{device_id}/sys/messages/down最终的格式: $oc/devices/6419627e40773741f9fbdac7_dev1/sys/messages/down​ 4主题发布格式 对于设备来说主题发布表示向云平台上传数据将最新的传感器数据设备状态上传到云平台。 这个操作称为属性上报。 帮助文档地址https://support.huaweicloud.com/usermanual-iothub/iot_06_v5_3010.html 根据帮助文档的介绍 当前设备发布主题上报属性的格式总结如下 发布的主题格式: $oc/devices/{device_id}/sys/properties/report最终的格式: $oc/devices/6419627e40773741f9fbdac7_dev1/sys/properties/report 发布主题时需要上传数据这个数据格式是JSON格式。上传的JSON数据格式如下:{services: [{service_id: 填服务ID,properties: {填属性名称1: 填属性值,填属性名称2: 填属性值,..........}}] } 根据JSON格式一次可以上传多个属性字段。 这个JSON格式里的服务ID属性字段名称属性值类型在前面创建产品的时候就已经介绍了不记得可以翻到前面去查看。根据这个格式组合一次上传的属性数据: {services: [{service_id: stm32,properties:{DS18B20:18,motor_water:1,motor_oxygen:1,temp_max:10,water_hp:130,motor_food:0,time_food:0,oxygen_food:3}}]}4.6 MQTT三元组 MQTT协议登录需要填用户ID设备ID设备密码等信息就像我们平时登录QQ微信一样要输入账号密码才能登录。MQTT协议登录的这3个参数一般称为MQTT三元组。 接下来介绍华为云平台的MQTT三元组参数如何得到。 1MQTT服务器地址 要登录MQTT服务器首先记得先知道服务器的地址是多少端口是多少。 帮助文档地址https://console.huaweicloud.com/iotdm/?regioncn-north-4#/dm-portal/home MQTT协议的端口支持1883和8883它们的区别是8883 是加密端口更加安全。但是单片机上使用比较困难所以当前的设备是采用1883端口进连接的。 根据上面的域名和端口号得到下面的IP地址和端口号信息 如果设备支持填写域名可以直接填域名不支持就直接填写IP地址。 IP地址就是域名解析得到的 华为云的MQTT服务器地址114.116.232.138 域名7445c6bcd3.st1.iotda-device.cn-north-4.myhuaweicloud.com 华为云的MQTT端口号1883注意 具体要看这里 2生成MQTT三元组 华为云提供了一个在线工具用来生成MQTT鉴权三元组 https://iot-tool.obs-website.cn-north-4.myhuaweicloud.com/ 打开这个工具填入设备的信息也就是刚才创建完设备之后保存的信息点击生成就可以得到MQTT的登录信息了。 下面是打开的页面 填入设备的信息 上面两行就是设备创建完成之后保存得到的 得到三元组之后设备端通过MQTT协议登录鉴权的时候填入参数即可。 ClientId 6419627e40773741f9fbdac7_dev1_0_0_2023032108 Username 6419627e40773741f9fbdac7_dev1 Password 861ac9e6a579d36888b2aaf97714be7af6c77017b017162884592bd68b086a6e4.7 模拟设备登录测试 经过上面的步骤介绍已经创建了产品设备数据模型得到MQTT登录信息。 接下来就用MQTT客户端软件模拟真实的设备来登录平台。测试与服务器通信是否正常。 1填入登录信息 打开MQTT客户端软件对号填入相关信息就是上面的文本介绍。然后点击登录订阅主题发布主题。 2打开网页查看 完成上面的操作之后打开华为云网页后台可以看到设备已经在线了。 点击详情页面可以看到上传的数据。 到此云平台的部署已经完成设备已经可以正常上传数据了。 4.8 获取设备影子数据API接口 帮助文档https://support.huaweicloud.com/api-iothub/iot_06_v5_0079.html 设备影子介绍 设备影子是一个用于存储和检索设备当前状态信息的JSON文档。 每个设备有且只有一个设备影子由设备ID唯一标识 设备影子仅保存最近一次设备的上报数据和预期数据 无论该设备是否在线都可以通过该影子获取和设置设备的属性简单来说设备影子就是保存设备最新上传的一次数据。 我们设计的软件里如果想要获取设备的最新状态信息就采用设备影子接口。 如果对接口不熟悉可以先进行在线调试https://apiexplorer.developer.huaweicloud.com/apiexplorer/doc?productIoTDAapiShowDeviceShadow 在线调试接口可以请求影子接口了解请求与返回的数据格式。 设备影子接口返回的数据如下 {device_id: 6419627e40773741f9fbdac7_dev1,shadow: [{service_id: stm32,desired: {properties: null,event_time: null},reported: {properties: {DS18B20: 18,motor_water: 1,motor_oxygen: 1,temp_max: 10,water_hp: 130,motor_food: 0,time_food: 0,oxygen_food: 3},event_time: 20230321T081126Z},version: 0}] }4.9 修改设备属性API接口 地址: https://support.huaweicloud.com/api-iothub/iot_06_v5_0034.html 接口说明 设备的产品模型中定义了物联网平台可向设备下发的属性应用服务器可调用此接口向指定设备下发属性。平台负责将属性以同步方式发送给设备并将设备执行属性结果同步返回。修改设备属性的接口可以让服务器给设备下发指令如果需要控制设备。 在线调试地址 https://apiexplorer.developer.huaweicloud.com/apiexplorer/doc?productIoTDAapiUpdateProperties 修改设备属性是属于同步命令需要设备在线才可以进行调试先使用MQTT客户端登录服务器模拟设备上线。 然后进行调试测试数据远程下发给设备。 【1】利用MQTT客户端先登录设备 (这是同步命令必须在线才能调试) 【2】点击调试 {services:{temp_max:100}}【4】可以看到MQTT客户端软件上已经收到了服务器下发的消息 由于是同步命令服务器必须要收到设备的响应才能顺利完成一个流程设备响应了服务器才能确定数据下发成功。 五、代码设计 5.1 ESP8266模块介绍 ESP8266-WIFI是一款由乐鑫科技开发的低成本Wi-Fi芯片可与其他微控制器或单片机配合使用实现无线通讯功能。该芯片集成了一个高性能的32位Tensilica L106 RISC处理器以及一组内置的WIFI模块和电源管理模块能够在低功耗下提供稳定的无线网络连接。 以下是ESP8266与MQTT协议相关常用的AT指令介绍 【1】ATCIPSTART建立TCP连接。 在使用MQTT协议时需要先建立TCP连接。ATCIPSTART可以实现与MQTT服务器的TCP连接格式如下 ATCIPSTARTTCP,MQTT服务器地址,MQTT服务器端口号【2】ATCIPSEND发送数据。 在建立TCP连接之后可以使用ATCIPSEND发送数据包括MQTT协议的各种命令。格式如下 ATCIPSENDlength MQTT命令其中表示数据长度MQTT命令表示MQTT协议的命令例如CONNECT、PUBLISH、SUBSCRIBE等。 【3】ATCIPCLOSE关闭TCP连接。在使用完MQTT协议之后可以使用ATCIPCLOSE关闭TCP连接格式如下 ATCIPCLOSE【4】ATCIPSTATUS查询TCP连接状态。使用ATCIPSTATUS可以查询当前TCP连接的状态格式如下 ATCIPSTATUS返回值包括STATUS、TCP连接状态LINK ID、TCP连接IDIP、TCP连接的IP地址PORT、TCP连接端口号。 【5】ATMQTTCONN连接MQTT服务器。使用ATMQTTCONN可以连接MQTT服务器格式如下 ATMQTTCONNclientID,user,password,keepalive,clean,willTopic,willMessage,willQoS,willRetain其中表示客户端ID表示用户名表示密码表示心跳包间隔时间表示清除会话标志表示遗言主题表示遗言消息表示遗言QoS等级表示遗言消息是否保留。 【6】ATMQTTPUB发布消息。使用ATMQTTPUB可以发布MQTT消息格式如下 ATMQTTPUBtopic,payload,QoS,retain其中表示MQTT主题表示消息负载表示消息QoS等级表示消息是否保留。 【7】ATMQTTSUB订阅主题。使用ATMQTTSUB可以订阅MQTT主题格式如下 ATMQTTSUBtopic,QoS其中表示MQTT主题表示消息QoS等级。 5.2 连接云端代码 以下是STM32F103ESP8266通过MQTT协议登录MQTT物联网服务器实现主题订阅、发布的示例代码其中利用了ESP8266-WIFI的AT指令实现与MQTT服务器的通信。 需要在STM32F103上配置UART串口以实现与ESP8266的通信。在STM32F103上编写AT指令的发送和接收函数将其集成到工程中。 代码如下 #include stm32f1xx_hal.h #include string.h #include stdio.h/* 定义ESP8266的UART串口 */ UART_HandleTypeDef huart1;/* 定义MQTT服务器地址、端口号、用户名和密码等信息 */ const char* mqtt_server mqtt.example.com; const int mqtt_port 1883; const char* mqtt_username username; const char* mqtt_password password;/* 定义MQTT主题 */ const char* mqtt_topic test/topic;/* 定义回调函数处理MQTT消息 */ void messageArrived(MessageData* data) {printf(Message arrived: topic%.*s, payload%.*s\n, data-topicName-lenstring.len, data-topicName-lenstring.data, data-message-payloadlen, data-message-payload); }/* 发送AT指令并等待响应 */ int ESP8266_SendATCommand(char* cmd, char* response, int timeout) {HAL_UART_Transmit(huart1, (uint8_t*)cmd, strlen(cmd), timeout);int len 0;int len_read 0;HAL_Delay(100);while (1) {if (HAL_UART_Receive(huart1, (uint8_t*)response len, 1, timeout) HAL_OK) {len;if (strstr(response, OK) ! NULL) {return len;}if (strstr(response, ERROR) ! NULL) {return -1;}if (len 1024) {return -1;}}} }/* 连接MQTT服务器 */ int MQTT_Connect(void) {char cmd[1024];char response[1024];/* 设置ESP8266为透传模式 */ESP8266_SendATCommand(ATCIPMODE1\r\n, response, 1000);ESP8266_SendATCommand(ATCIPMUX0\r\n, response, 1000);/* 建立TCP连接 */sprintf(cmd, ATCIPSTART\TCP\,\%s\,%d\r\n, mqtt_server, mqtt_port);ESP8266_SendATCommand(cmd, response, 5000);/* 连接MQTT服务器 */sprintf(cmd, ATCIPSEND%d\r\n, 33 strlen(mqtt_username) strlen(mqtt_password));ESP8266_SendATCommand(cmd, response, 1000);sprintf(cmd, CONNECT\n\rclient_id:ESP8266\n\ruser:%s\n\rpassword:%s\n\r\n\r, mqtt_username, mqtt_password);ESP8266_SendATCommand(cmd, response, 5000);/* 订阅MQTT主题 */sprintf(cmd, ATCIPSEND%d\r\n, 10 strlen(mqtt_topic));ESP8266_SendATCommand(cmd, response, 1000);sprintf(cmd, SUBSCRIBE\n\r%d\n\r0\n\r\n\r, strlen(mqtt_topic));ESP8266_SendATCommand(cmd, response, 5000);return 0; }/* 发布MQTT消息 */ void MQTT_Publish(const char* message) {char cmd[1024];char response[1024];sprintf(cmd, ATCIPSEND%d\r\n, 8 strlen(mqtt_topic) strlen(message));ESP8266_SendATCommand(cmd, response, 1000);sprintf(cmd, PUBLISH\n\r%d\n\r%s\n\r\n\r%s\n\r, strlen(mqtt_topic), mqtt_topic, message);ESP8266_SendATCommand(cmd, response, 5000); }/* 主程序 */ int main(void) {/* 连接MQTT服务器 */if (MQTT_Connect() ! 0) {while (1) {/* 连接失败进入死循环 */}}/* 发布MQTT消息 */MQTT_Publish(Hello, MQTT!);/* 等待接收MQTT消息 */while (1) {/* 读取ESP8266接收缓冲区中的数据 */char response[1024];int len ESP8266_SendATCommand(ATCIPRXGET2,1024\r\n, response, 1000);if (len 0) {printf(Received data: %.*s\n, len, response);/* TODO: 解析并处理MQTT消息 */}/* 延时一段时间 */HAL_Delay(100);}return 0; }代码实现了连接MQTT服务器、订阅主题、发布消息等功能。 5.3 OLED显示屏代码 以下是使用STM32F103ZET6控制0.96寸SPI接口的OLED显示屏的代码 cCopy Code#include stm32f10x.h #include spi.h // SPI库头文件// OLED相关定义 #define OLED_CMD 0 // 命令模式 #define OLED_DATA 1 // 数据模式#define OLED_ADDR_START 0xB0 // OLED起始地址 #define OLED_PAGE_START 0x00 // 第一个页的地址 #define OLED_COLUMN_START 0x10 // 列起始地址// 初始化OLED显示屏 void OLED_Init(void) {// 初始化SPI接口SPI_Init();Delay(100);// 向OLED发送初始化命令和数据// 模式设置设置4位数据线扩展指令集OLED_WriteCmd(OLED_CMD, 0x21);// 对比度设置默认为0x7FOLED_WriteCmd(OLED_CMD, 0x81);OLED_WriteCmd(OLED_CMD, 0x7F);// 设置显示模式正常显示OLED_WriteCmd(OLED_CMD, 0xA4);// 设置偏置电压OLED_WriteCmd(OLED_CMD, 0xA8);OLED_WriteCmd(OLED_CMD, 0x3F);// 设置显示方向从左到右从上到下OLED_WriteCmd(OLED_CMD, 0xC8);// 设置扫描地段从COM0到COM[N-1]OLED_WriteCmd(OLED_CMD, 0xDA);OLED_WriteCmd(OLED_CMD, 0x12);// 设置时钟分频因子OLED_WriteCmd(OLED_CMD, 0xD5);OLED_WriteCmd(OLED_CMD, 0x80);// 设置显示开启OLED_WriteCmd(OLED_CMD, 0xAF); }// 写入命令或数据到OLED显示屏 void OLED_WriteCmd(uint8_t mode, uint8_t cmd) {if (mode OLED_CMD) {GPIO_ResetBits(GPIOA, GPIO_Pin_4); // 将DC引脚置低进入命令模式} else {GPIO_SetBits(GPIOA, GPIO_Pin_4); // 将DC引脚置高进入数据模式}GPIO_ResetBits(GPIOA, GPIO_Pin_3); // 将CS引脚置低选中OLEDSPI_SendData(cmd); // 发送命令或数据while (SPI_GetFlagStatus(SPI1, SPI_FLAG_TXE) RESET);GPIO_SetBits(GPIOA, GPIO_Pin_3); // 将CS引脚置高释放OLED }// 在指定位置显示一个数字 void OLED_ShowNumber(uint8_t x, uint8_t y, uint32_t number) {char str[11]; // 最大显示10位数字sprintf(str, %lu, number); // 将数字转换为字符串OLED_ShowString(x, y, str); // 在指定位置显示字符串 }// 在指定位置显示一个字符串 void OLED_ShowString(uint8_t x, uint8_t y, char *str) {uint8_t i 0;while (str[i] ! \0) {OLED_ShowChar(x, y, str[i]); // 在指定位置显示一个字符x 6; // 移动到下一列i;} }// 在指定位置显示一个字符 void OLED_ShowChar(uint8_t x, uint8_t y, char ch) {uint8_t i, j;for (i 0; i 8; i) { // 8行OLED_WriteCmd(OLED_CMD, OLED_ADDR_START y); // 指定页OLED_WriteCmd(OLED_CMD, OLED_COLUMN_START x); // 指定列for (j 0; j 6; j) { // 6列OLED_WriteCmd(OLED_DATA, ASCII[ch - 32][j]);}y;} }在这段代码中定义了OLED相关的常量和函数包括OLED命令模式和数据模式、OLED起始地址、页起始地址、列起始地址等。在OLED_Init()函数中进行了OLED的初始化过程包括发送相应的初始化命令和数据给OLED显示屏。在OLED_WriteCmd()函数中根据传入的命令模式OLED_CMD或数据模式OLED_DATA将DC引脚设置为相应的状态并通过SPI接口将命令或数据发送给OLED显示屏。在OLED_ShowNumber()、OLED_ShowString()和OLED_ShowChar()函数中通过调用OLED_WriteCmd()发送相应的指令和数据实现在指定位置显示数字、字符串和字符。 5.4 步进电机控制代码 以下是STM32F10328BYJ40步进电机实现角度控制和正反转控制的代码使用了STM32F1xx_HAL库来控制GPIO口和定时器实现精准的角度控制和正反转控制。 #include stm32f1xx_hal.h #include stdio.h/* 定义步进电机的4个控制引脚 */ #define IN1_Pin GPIO_PIN_0 #define IN1_GPIO_Port GPIOA #define IN2_Pin GPIO_PIN_1 #define IN2_GPIO_Port GPIOA #define IN3_Pin GPIO_PIN_2 #define IN3_GPIO_Port GPIOA #define IN4_Pin GPIO_PIN_3 #define IN4_GPIO_Port GPIOA/* 定义步进电机的步数数组 */ uint8_t step_sequence[8] {0b0001, 0b0011, 0b0010, 0b0110, 0b0100, 0b1100, 0b1000, 0b1001};/* 定义当前步进电机的位置和方向 */ int current_step 0; // 当前步数 int direction 1; // 1为顺时针-1为逆时针/* 定义角度控制参数 */ float angle_per_step 1.8; // 每步角度 int total_steps 2048; // 总步数/* 定义定时器中断处理函数控制步进电机的运动 */ void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) {/* 更新步进电机的位置 */current_step direction;if (current_step total_steps) {current_step 0;} else if (current_step 0) {current_step total_steps - 1;}/* 控制步进电机的旋转方向 */int sequence_index current_step % 8;GPIO_PinState in1_state (step_sequence[sequence_index] 0b0001) ? GPIO_PIN_SET : GPIO_PIN_RESET;GPIO_PinState in2_state (step_sequence[sequence_index] 0b0010) ? GPIO_PIN_SET : GPIO_PIN_RESET;GPIO_PinState in3_state (step_sequence[sequence_index] 0b0100) ? GPIO_PIN_SET : GPIO_PIN_RESET;GPIO_PinState in4_state (step_sequence[sequence_index] 0b1000) ? GPIO_PIN_SET : GPIO_PIN_RESET;HAL_GPIO_WritePin(IN1_GPIO_Port, IN1_Pin, in1_state);HAL_GPIO_WritePin(IN2_GPIO_Port, IN2_Pin, in2_state);HAL_GPIO_WritePin(IN3_GPIO_Port, IN3_Pin, in3_state);HAL_GPIO_WritePin(IN4_GPIO_Port, IN4_Pin, in4_state); }/* 初始化定时器 */ void TIM_Init(void) {TIM_HandleTypeDef htim;/* 使能定时器时钟 */__HAL_RCC_TIM2_CLK_ENABLE();/* 配置定时器 */htim.Instance TIM2;htim.Init.Prescaler 7199; // 72MHz / 7200 10kHzhtim.Init.CounterMode TIM_COUNTERMODE_UP;htim.Init.Period 99; // 10kHz / 100 100Hzhtim.Init.ClockDivision TIM_CLOCKDIVISION_DIV1;HAL_TIM_Base_Init(htim);/* 启动定时器 */HAL_TIM_Base_Start_IT(htim); }/* 控制步进电机旋转 */ void StepMotor_Rotate(int angle, int clockwise) {/* 计算需要旋转的步数和方向 */int steps angle / angle_per_step;direction clockwise ? 1 : -1;/* 控制步进电机旋转 */for (int i 0; i steps; i) {HAL_Delay(1);} }/* 主程序 */ int main(void) {/* 初始化定时器 */TIM_Init();/* 控制步进电机旋转 */StepMotor_Rotate(90, 1); // 顺时针旋转90度StepMotor_Rotate(180, 0); // 逆时针旋转180度while (1) {/* 循环等待 */}return 0; }IN1_Pin到IN4_Pin为步进电机的控制引脚step_sequence为步进电机的步数数组current_step为当前步数direction为旋转方向angle_per_step为每步的角度total_steps为总步数。在HAL_TIM_PeriodElapsedCallback函数中根据当前步数和旋转方向控制步进电机的旋转方向使用HAL_GPIO_WritePin函数控制引脚输出状态。在StepMotor_Rotate函数中根据传入的角度和旋转方向计算需要旋转的步数和方向然后循环延时控制步进电机旋转。通过调用StepMotor_Rotate函数可以实现步进电机的角度控制和正反转控制。 六、总结 智能门禁系统是一种基于STM32F103主控制器和华为云物联网平台的安全、便捷的门禁控制方案。通过整合多种硬件模块和网络通信技术该系统实现了多种开锁方式密码输入、RFID刷卡、手机APP远程开锁并且具备远程监控和消息推送功能。 在硬件选型上刷卡模块选择了RFID-RC522采用28BYJ-48步进电机作为门锁控制器4x4电容矩阵键盘用于密码输入SPI接口的0.96寸OLED显示屏用于门锁状态信息显示而ESP8266-WIFI模块则实现了联网功能。此外红外磁感应模块用于检测门的状态。 整个系统的设计使得门禁更加安全可靠用户可以通过多种方式进行开锁操作包括输入密码、刷卡以及远程开锁。同时系统可以实时监控门锁状态并在门锁打开或关闭时通过手机APP向用户发送通知提醒提高了使用者的安全性和便利性。 基于STM32F103和华为云物联网平台的智能门禁系统充分利用了现代科技的优势提供了安全、便捷的门禁控制解决方案。除了基本的门禁功能外该系统还具备远程控制和实时监控的能力为用户带来更加智能化的门禁体验并满足了现代人们对于安全、便捷生活的需求。
http://www.pierceye.com/news/327221/

相关文章:

  • 婚恋网站上认识人 带你做原油交易怎么用手机创造网站
  • 网站建设投标书服务方案范本天津北京网站建设公司
  • 网站建设好评公司微企点建站怎么样
  • 某网站开发项目成本估计推广普通话作文500字
  • 制作网站需要哪些工作网站建设佰金手指科杰十三
  • 外贸哪家做网站wordpress excel搜索
  • 苏州做网站推广的英文搜索网站
  • 政务微网站建设方案深圳市易捷网络科技有限公司
  • 云南网站建设哪家好长沙网站建设营销
  • 四川省建设厅注册中心网站网站管理内容
  • 百度提交网站wordpress广告设置
  • 余姚市城乡建设局网站石家庄上门足疗
  • 深圳工程造价建设信息网站php网站建设题目
  • 龙岗网站制作织梦整合wordpress
  • 代做效果图网站哪家好汉中市建设局网站
  • 东阳海天建设集团网站网站蜘蛛爬行统计
  • asp企业网站cms北京大型网站建设公司
  • 网站要多钱杭州排名优化公司电话
  • 怎么在网站中添加百度商桥南京营销网站建设
  • 沈阳火车站wordpress的vieu主题破解版
  • 食品网站建设 网站定制开发微网站建设的第一步是进行首页的设置
  • 一站式装修公司有哪些500人在线网站建设配置
  • 郴州网站制作哪个网站可以做市场调研报告
  • 劲松网站建设公司做运营需要具备什么能力
  • 企业建设网站是网络营销吗17网站一起做网店新塘
  • 电子书籍网站开发重庆网站建设快速建站
  • 广州 企业网站建设公司网页设计模板
  • 长安网站建设制作价格乐清网站
  • 小游戏网站怎么做建站徐州seo代理计费
  • 苏州网站建设数据网络淘宝网店怎么运营起来