• [技术干货] 基于STM32设计的智能门锁2(采用华为云IOT平台)
    1. 前言随着智能家居的快速发展,智能门锁作为家庭安全的重要组成部分,受到了越来越多用户的关注和需求。为了满足用户对安全和便捷的需求,决定设计一款基于STM32的智能门锁,并将其与华为云IOT平台相结合。传统的门锁存在一些弊端,比如使用钥匙容易丢失、开锁过程繁琐等。而智能门锁的出现,有效地解决了这些问题。我选择使用STM32作为智能门锁的核心控制器,因为STM32系列具有低功耗、高性能和丰富的外设接口等优点,非常适合嵌入式应用。华为云IOT平台作为一个强大的云服务平台,提供了丰富的物联网解决方案和强大的数据处理能力。将智能门锁与华为云IOT平台相结合,可以实现远程控制、数据监测和智能化的功能,为用户带来更加便捷和安全的居家体验。智能门锁设计具有以下主要特点和功能:安全可靠:采用先进的加密算法和身份验证机制,确保门锁的安全性。用户可以通过手机APP、指纹识别或密码等方式进行开锁,有效防止非法入侵。远程控制:通过与华为云IOT平台的连接,用户可以通过手机APP在任何地方实现对门锁的远程控制。比如,可以远程开关门锁、查看开锁记录等。多种开锁方式:除了传统的钥匙开锁方式外,我们的智能门锁还支持多种开锁方式,如指纹识别、密码输入、手机APP控制等。用户可以根据自己的需求选择最方便的开锁方式。实时监测:智能门锁可以实时监测门锁状态、开锁记录等信息,并将这些数据上传到华为云IOT平台进行存储和分析。用户可以通过手机APP查看相关数据,了解家庭安全状况。智能化功能:基于华为云IOT平台的数据处理能力,我们的智能门锁还可以实现一些智能化的功能。比如,可以设置自动开锁时间、远程授权开锁等。2. 设备硬件与功能介绍这篇文章就介绍如何使用华为物联网云平台实现智能锁的应用场景构建,硬件采用STM32F103ZET6 + ESP8266+步进电机实现。在华为云IOT物联网平台构建智能锁项目,配置好云端,设备端通过ESP8266连接华为物联网平台,实现数据上报,交互,实现远程开锁、关锁、获取锁的状态等功能,不用担心忘记出门关锁,也不用担心忘记带钥匙无法开门的情况。ESP8266是物联网解决方案里比较热门的WIFI设备,支持串口+AT指令控制,任意支持串口的单片机都可以使用ESP8266快速实现联网。步进电机采用常规28BYJ-48来模拟当做门锁的电机,驱动板采用ULN2003。3. 创建云端设备登录官网: cid:link_3直接搜索物联网,打开页面。选择设备接入:选择免费试用:在产品页面,点击右上角创建产品:填上产品信息:得到产品ID,保存好ID,点击查看详情:产品ID为:61b9ba3a2b2aa20288c1e7f1.点击设备页面,注册设备:填充信息进行注册:保存设备密匙和设备ID,点击保存关闭会自动下载文件保存,后面生成密码和登录账号需要使用关闭后就看到创建好的设备了:点击产品页面,选择刚才创建的产品:选择自定义模型---创建数据模型服务:选择新增属性,创建设备的属性4. 创建MQTT登录账号和密匙设备创建完成接来下生成MQTT登录账号、密匙,方便设备登录云端平台。官网工具地址: cid:link_1打开刚才创建设备时,下载的密匙文件,把内容复制出来对应的填进去,生成即可。5. 拼接主题订阅与发布的格式官方文档介绍: cid:link_0在产品页面可以,看到主题的全部格式:总结的格式如下: 格式: $oc/devices/{device_id}/sys/messages/down //订阅主题: 平台下发消息给设备 $oc/devices/61b9ba3a2b2aa20288c1e7f1_QQ1126626497_0_0_2021121510/sys/messages/down ​ ​ 格式: $oc/devices/{device_id}/sys/properties/report //设备上报数据 $oc/devices/61b9ba3a2b2aa20288c1e7f1_QQ1126626497_0_0_2021121510/sys/properties/report ​ 上属性的数据格式: //上报的属性消息 (一次可以上报多个属性,在json里增加就行了) {"services": [{"service_id": "lock","properties":{"门锁":1}}]}上面属性里的服务ID和属性里的名称,在设备页面,影子设备页面查看。6. MQTT客户端模拟设备登录云端下面使用MQTT客户端模拟设备登录服务器测试,看设备创建的是否OK。服务器的IP地址是: 121.36.42.100端口号是: 1883打开MQTT客户端软件,按照提示,输入相关参数后,点击连接,然后再点击订阅主题,发布主题即可:查看云端服务器的情况: 可以看到设备已经在线了,并且收到上传的数据。修改一下锁的状态,上报属性再查看:发现云端的状态也已经改变,现在设备上报已经OK。接下来测试命令下发,实现远程开锁关锁的功能:打开产品页面,新增加命令:命令添加成功:在设备页面,选择同步命令下发:点击确定后,查看MQTT客户端,发现已经收到数据了:$oc/devices/61b9ba3a2b2aa20288c1e7f1_QQ1126626497/sys/commands/request_id=88e2626f-290d-405e-962d-51554445a8fd{"paras":{"lock":1},"service_id":"lock","command_name":"lock"}设备端解析收到的数据,就可以完成多步进电机的控制,完成开锁关锁。7. STM32+ESP8266连接云端工程是keil5工程项目源码与视频演示:cid:link_2main函数代码如下: #include "stm32f10x.h" #include "led.h" #include "delay.h" #include "key.h" #include "usart.h" #include < string.h > #include "timer.h" #include "bluetooth.h" #include "esp8266.h" #include "mqtt.h" ​ //华为物联网服务器的设备信息 #define MQTT_ClientID "61b9ba3a2b2aa20288c1e7f1_QQ1126626497_0_0_2021121510" #define MQTT_UserName "61b9ba3a2b2aa20288c1e7f1_QQ1126626497" #define MQTT_PassWord "385ce91dfe7da5b7431868d5d87e7998163c493344040935d5a00024d6324242" ​ //订阅与发布的主题 #define SET_TOPIC "$oc/devices/61b9ba3a2b2aa20288c1e7f1_QQ1126626497_0_0_2021121510/sys/messages/down" //订阅 #define POST_TOPIC "$oc/devices/61b9ba3a2b2aa20288c1e7f1_QQ1126626497_0_0_2021121510/sys/properties/report" //发布 ​ char mqtt_message[200];//上报数据缓存区 ​ int main() { u32 time_cnt=0; u32 i; u8 key; LED_Init(); BEEP_Init(); KEY_Init(); USART1_Init(115200); TIMER1_Init(72,20000); //超时时间20ms USART2_Init(9600);//串口-蓝牙 TIMER2_Init(72,20000); //超时时间20ms USART3_Init(115200);//串口-WIFI TIMER3_Init(72,20000); //超时时间20ms USART1_Printf("正在初始化WIFI请稍等.\\n"); if(ESP8266_Init()) { USART1_Printf("ESP8266硬件检测错误.\\n"); } else { //非加密端口 USART1_Printf("WIFI:%d\\n",ESP8266_STA_TCP_Client_Mode("CMCC-Cqvn","99pu58cb","121.36.42.100",1883,1)); } //2. MQTT协议初始化 MQTT_Init(); //3. 连接华为服务器 while(MQTT_Connect(MQTT_ClientID,MQTT_UserName,MQTT_PassWord)) { USART1_Printf("服务器连接失败,正在重试...\\n"); delay_ms(500); } USART1_Printf("服务器连接成功.\\n"); //3. 订阅主题 if(MQTT_SubscribeTopic(SET_TOPIC,0,1)) { USART1_Printf("主题订阅失败.\\n"); } else { USART1_Printf("主题订阅成功.\\n"); } while(1) { key=KEY_Scan(0); if(key==2) { time_cnt=0; sprintf(mqtt_message,"{"services": [{"service_id": "lock","properties":{"门锁":1}}]}"); MQTT_PublishData(POST_TOPIC,mqtt_message,0); USART1_Printf("发送状态1\\r\\n"); } else if(key==3) { time_cnt=0; sprintf(mqtt_message,"{"services": [{"service_id": "lock","properties":{"门锁":0}}]}"); MQTT_PublishData(POST_TOPIC,mqtt_message,0); USART1_Printf("发送状态0\\r\\n"); } ​ if(USART3_RX_FLAG) { USART3_RX_BUFFER[USART3_RX_CNT]='\\0'; for(i=0;i< USART3_RX_CNT;i++) { USART1_Printf("%c",USART3_RX_BUFFER[i]); } USART3_RX_CNT=0; USART3_RX_FLAG=0; } ​ //定时发送心跳包,保持连接 delay_ms(10); time_cnt++; if(time_cnt==500) { MQTT_SentHeart();//发送心跳包 time_cnt=0; } } }
  • 【资源】物联网鸿蒙应用入门级开发者认证(HCCDA–IoT HarmonyOS Apps)实验资源
    物联网鸿蒙应用入门级开发者认证(HCCDA–IoT HarmonyOS Apps)实验资源,详见附件;请登录个人华为帐号,然后下载附件。
  • [技术干货] 基于STM32+华为云IOT设计的智能窗帘控制系统
    一、项目背景随着智能家居技术的不断发展,人们对于家居生活的需求也越来越高。智能窗帘作为智能家居领域的重要组成部分,为用户提供了更便捷、舒适的生活体验。本项目基于STM32主控芯片和华为云物联网平台,设计一款智能窗帘控制系统,以满足家庭和商业场所的需求。在本项目中,选择了STM32F103ZET6作为主控芯片具有强大的处理能力和丰富的外设接口,适合用于物联网设备的控制和通信。通过与ESP8266-WIFI模块的连接,可以实现智能窗帘与华为云物联网平台的互联互通,实现远程控制和监测。为了方便用户的操作和控制,使用Qt开发了Android手机APP和Windows上位机软件,用户可以通过这些应用程序进行窗帘的远程控制。同时,本地窗帘也支持手动控制,用户可以通过物理按钮或开关来操作窗帘的开关、升降等功能。在智能化方面,引入了语音识别技术(LD3320模块),用户可以通过语音指令来控制窗帘的运行。这为用户提供了更加便捷、智能的控制方式,使得窗帘的操作更加自然和智能化。除了远程控制和智能化功能,还引入了自动模式。在自动模式下,系统会根据环境条件进行智能判断和控制。例如,当检测到阳光强度超过设定阈值时,系统会自动关闭窗帘,以避免阳光直射室内;在晚上时,系统也会自动拉上窗帘,提供更好的隐私和安全性。本智能窗帘控制系统基于STM32主控芯片和华为云物联网平台,结合语音识别、智能家居控制等功能,为家庭和1商业场所提供便捷、舒适的智能化服务。通过远程控制、自动模式和智能化功能,用户可以实现对窗帘的灵活、智能的控制,提升生活质量和用户体验。二、硬件选型在设计智能窗帘控制系统的硬件方案时,需要考虑主控芯片、通信模块和传感器等关键组件的选型。以下是当前系统的具体硬件选型:【1】主控芯片:采用STM32F103ZET6作为主控芯片。具备强大的处理能力和丰富的外设接口,适合用于物联网设备的控制和通信。可以驱动各种传感器和执行器,并与ESP8266-WIFI模块和LD3320语音识别模块进行通信。【2】通信模块:选择了ESP8266-WIFI模块作为通信模块,用于连接华为云物联网平台。ESP8266-WIFI模块具有低功耗、高集成度和稳定的无线连接能力,能够实现智能窗帘与互联网的互联互通。【3】光照传感器:采用BH1750光照传感器来检测光照强度。BH1750是一种数字式光强度传感器,能够准确测量环境光的强度。通过获取光照强度数据,系统可以根据设定的阈值来判断是否需要自动拉窗帘。【4】语音识别模块:选择了LD3320语音识别模块,用于实现语音控制功能。LD3320是一种高性能语音识别芯片,能够实现对语音指令的识别和解析。通过语音识别模块,用户可以通过语音指令来控制窗帘的开合和模式切换。【5】电机和驱动模块:选择了28BYJ40步进电机作为窗帘控制的电机,并使用ULN2003驱动模块来驱动电机。28BYJ40步进电机具有较高的精度和稳定性,适合用于窗帘的控制。ULN2003是一种高电压、高电流驱动芯片,能够提供足够的电流和电压来驱动步进电机。【6】用户界面设备:采用Qt开发Android手机APP和Windows上位机来实现用户界面。通过这两个界面,用户可以进行远程控制窗帘的操作,包括开关窗帘、调整窗帘的开合程度和切换窗帘的工作模式。三、系统设计智能窗帘控制系统的软件设计主要包括主控程序、通信模块驱动、传感器驱动和用户界面等部分。以下是系统软件设计的思路:【1】主控程序:主控程序是系统的核心,负责控制窗帘的运行、处理传感器数据、与通信模块进行通信等。主控程序需要实现以下功能:初始化各个硬件模块,包括通信模块、传感器和电机驱动等。循环读取传感器数据,根据数据进行窗帘的控制和判断。处理用户的控制指令,包括远程控制指令和本地控制指令。与通信模块进行通信,实现与华为云物联网平台的互联互通。实现自动模式下的智能判断和控制逻辑。【2】通信模块驱动:通信模块驱动负责与华为云物联网平台进行通信,实现远程控制和数据传输。通信模块驱动需要实现以下功能:初始化通信模块,建立与华为云物联网平台的连接。接收来自云平台的控制指令,解析指令内容。将传感器数据和窗帘状态等信息上传到云平台,实现实时监测和数据传输。【3】传感器驱动:传感器驱动负责与光敏传感器、时间传感器等传感器进行交互,获取环境数据。传感器驱动需要实现以下功能:初始化传感器,配置传感器的工作模式和参数。定期读取传感器数据,包括光敏传感器的光强度和时间传感器的时间信息。将传感器数据传递给主控程序,供其进行判断和控制。【4】用户界面:用户界面是用户与系统进行交互的界面,可以通过Android手机APP或Windows上位机软件实现。用户界面需要实现以下功能:显示窗帘的状态和实时数据,如光强度、时间。提供远程控制窗帘的功能,包括开关、升降和自动模式的切换。接收用户的控制指令,将指令传递给主控程序进行处理。三、部署华为云物联网平台华为云官网: cid:link_12打开官网,搜索物联网,就能快速找到 设备接入IoTDA。3.1 物联网平台介绍华为云物联网平台(IoT 设备接入云服务)提供海量设备的接入和管理能力,将物理设备联接到云,支撑设备数据采集上云和云端下发命令给设备进行远程控制,配合华为云其他产品,帮助我们快速构筑物联网解决方案。使用物联网平台构建一个完整的物联网解决方案主要包括3部分:物联网平台、业务应用和设备。物联网平台作为连接业务应用和设备的中间层,屏蔽了各种复杂的设备接口,实现设备的快速接入;同时提供强大的开放能力,支撑行业用户构建各种物联网解决方案。设备可以通过固网、2G/3G/4G/5G、NB-IoT、Wifi等多种网络接入物联网平台,并使用LWM2M/CoAP、MQTT、HTTPS协议将业务数据上报到平台,平台也可以将控制命令下发给设备。业务应用通过调用物联网平台提供的API,实现设备数据采集、命令下发、设备管理等业务场景。3.2 开通物联网服务地址: cid:link_10进来默认会提示开通标准版,在2023的1月1号年之后没有基础版了。开通之后,点击总览,查看接入信息。 我们当前设备准备采用MQTT协议接入华为云平台,这里可以看到MQTT协议的地址和端口号等信息。总结:端口号: MQTT (1883)| MQTTS (8883) 接入地址: 7445c6bcd3.st1.iotda-app.cn-north-4.myhuaweicloud.com根据域名地址得到IP地址信息:Microsoft Windows [版本 10.0.19044.2728](c) Microsoft Corporation。保留所有权利。​C:\Users\11266>ping 7445c6bcd3.st1.iotda-device.cn-north-4.myhuaweicloud.com​正在 Ping 7445c6bcd3.st1.iotda-device.cn-north-4.myhuaweicloud.com [117.78.5.125] 具有 32 字节的数据:来自 117.78.5.125 的回复: 字节=32 时间=42ms TTL=30来自 117.78.5.125 的回复: 字节=32 时间=35ms TTL=30来自 117.78.5.125 的回复: 字节=32 时间=36ms TTL=30来自 117.78.5.125 的回复: 字节=32 时间=36ms TTL=30​117.78.5.125 的 Ping 统计信息: 数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),往返行程的估计时间(以毫秒为单位): 最短 = 35ms,最长 = 42ms,平均 = 37ms​C:\Users\11266>MQTT协议接入端口号有两个,1883是非加密端口,8883是证书加密端口,单片机无法加载证书,所以使用1883端口比较合适。 接下来的ESP8266就采用1883端口连接华为云物联网平台。3.3 创建产品(1)创建产品点击产品页,再点击左上角创建产品。(2)填写产品信息根据自己产品名字填写。(3)产品创建成功(4)添加自定义模型产品创建完成之后,点击进入产品详情页面,翻到最下面可以看到模型定义。先点击自定义模型。再创建一个服务ID。接着点击新增属性。3.4 添加设备产品是属于上层的抽象模型,接下来在产品模型下添加实际的设备。添加的设备最终需要与真实的设备关联在一起,完成数据交互。(1)注册设备(2)根据自己的设备填写(3)保存设备信息创建完毕之后,点击保存并关闭,得到创建的设备密匙信息。该信息在后续生成MQTT三元组的时候需要使用。(4) 设备创建完成3.5 MQTT协议主题订阅与发布(1)MQTT协议介绍当前的设备是采用MQTT协议与华为云平台进行通信。MQTT是一个物联网传输协议,它被设计用于轻量级的发布/订阅式消息传输,旨在为低带宽和不稳定的网络环境中的物联网设备提供可靠的网络服务。MQTT是专门针对物联网开发的轻量级传输协议。MQTT协议针对低带宽网络,低计算能力的设备,做了特殊的优化,使得其能适应各种物联网应用场景。目前MQTT拥有各种平台和设备上的客户端,已经形成了初步的生态系统。MQTT是一种消息队列协议,使用发布/订阅消息模式,提供一对多的消息发布,解除应用程序耦合,相对于其他协议,开发更简单;MQTT协议是工作在TCP/IP协议上;由TCP/IP协议提供稳定的网络连接;所以,只要具备TCP协议栈的网络设备都可以使用MQTT协议。 本次设备采用的ESP8266就具备TCP协议栈,能够建立TCP连接,所以,配合STM32代码里封装的MQTT协议,就可以与华为云平台完成通信。华为云的MQTT协议接入帮助文档在这里: cid:link_8业务流程:(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)主题订阅格式帮助文档地址:cid:link_8对于设备而言,一般会订阅平台下发消息给设备 这个主题。设备想接收平台下发的消息,就需要订阅平台下发消息给设备 的主题,订阅后,平台下发消息给设备,设备就会收到消息。如果设备想要知道平台下发的消息,需要订阅上面图片里标注的主题。以当前设备为例,最终订阅主题的格式如下:$oc/devices/{device_id}/sys/messages/down​最终的格式:$oc/devices/6419627e40773741f9fbdac7_dev1/sys/messages/down(4)主题发布格式对于设备来说,主题发布表示向云平台上传数据,将最新的传感器数据,设备状态上传到云平台。这个操作称为:属性上报。帮助文档地址:cid:link_3根据帮助文档的介绍, 当前设备发布主题,上报属性的格式总结如下:发布的主题格式:$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}}]}3.6 MQTT三元组MQTT协议登录需要填用户ID,设备ID,设备密码等信息,就像我们平时登录QQ,微信一样要输入账号密码才能登录。MQTT协议登录的这3个参数,一般称为MQTT三元组。接下来介绍,华为云平台的MQTT三元组参数如何得到。(1)MQTT服务器地址要登录MQTT服务器,首先记得先知道服务器的地址是多少,端口是多少。帮助文档地址:cid:link_2MQTT协议的端口支持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鉴权三元组: cid:link_9打开这个工具,填入设备的信息(也就是刚才创建完设备之后保存的信息),点击生成,就可以得到MQTT的登录信息了。下面是打开的页面:填入设备的信息: (上面两行就是设备创建完成之后保存得到的)直接得到三元组信息。得到三元组之后,设备端通过MQTT协议登录鉴权的时候,填入参数即可。ClientId 6419627e40773741f9fbdac7_dev1_0_0_2023032108Username 6419627e40773741f9fbdac7_dev1Password 861ac9e6a579d36888b2aaf97714be7af6c77017b017162884592bd68b086a6e3.7 模拟设备登录测试经过上面的步骤介绍,已经创建了产品,设备,数据模型,得到MQTT登录信息。 接下来就用MQTT客户端软件模拟真实的设备来登录平台。测试与服务器通信是否正常。(1)填入登录信息打开MQTT客户端软件,对号填入相关信息(就是上面的文本介绍)。然后,点击登录,订阅主题,发布主题。(2)打开网页查看完成上面的操作之后,打开华为云网页后台,可以看到设备已经在线了。点击详情页面,可以看到上传的数据。到此,云平台的部署已经完成,设备已经可以正常上传数据了。四、上位机开发为了方便查看设备上传的数据,对设备进行远程控制,接下来利用Qt开发一款Android和windows系统的上位机。使用华为云平台提供的API接口获取设备上传的数据,也可以给设备下发指令,控制设备。为了方便查看设备上传的数据,对设备进行远程控制,接下来利用Qt开发一款Android和windows系统的上位机。使用华为云平台提供的API接口获取设备上传的数据,也可以给设备下发指令,控制设备。4.1 Qt开发环境安装Qt的中文官网: cid:link_13QT5.12.6的下载地址:cid:link_11打开下载链接后选择下面的版本进行下载:qt-opensource-windows-x86-5.12.6.exe 13-Nov-2019 07:28 3.7G Details软件安装时断网安装,否则会提示输入账户。安装的时候,第一个复选框里勾选一个mingw 32编译器即可,其他的不管默认就行,直接点击下一步继续安装。说明: 我这里只是介绍PC端的环境搭建(这个比较简单)。 Android的开发环境比较麻烦,可以去我的博客里看详细文章。选择MinGW 32-bit 编译器:4.2 创建IAM账户创建一个IAM账户,因为接下来开发上位机,需要使用云平台的API接口,这些接口都需要token进行鉴权。简单来说,就是身份的认证。 调用接口获取Token时,就需要填写IAM账号信息。所以,接下来演示一下过程。地址: cid:link_4获取Token时,除了AIM账号外,还需要项目凭证:faa0973835ab409ab48182e2590f4ad3鼠标点击自己昵称,点击统一身份认证。点击左上角创建用户。创建成功:4.3 获取影子数据帮助文档:cid:link_5设备影子介绍:设备影子是一个用于存储和检索设备当前状态信息的JSON文档。每个设备有且只有一个设备影子,由设备ID唯一标识设备影子仅保存最近一次设备的上报数据和预期数据无论该设备是否在线,都可以通过该影子获取和设置设备的属性简单来说:设备影子就是保存,设备最新上传的一次数据。我们设计的软件里,如果想要获取设备的最新状态信息,就采用设备影子接口。如果对接口不熟悉,可以先进行在线调试:https://apiexplorer.developer.huaweicloud.com/apiexplorer/doc?product=IoTDA&api=ShowDeviceShadow在线调试接口,可以请求影子接口,了解请求,与返回的数据格式。设备影子接口返回的数据如下:{ "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.4 修改设备属性地址: cid:link_6接口说明设备的产品模型中定义了物联网平台可向设备下发的属性,应用服务器可调用此接口向指定设备下发属性。平台负责将属性以同步方式发送给设备,并将设备执行属性结果同步返回。修改设备属性的接口,可以让服务器给设备下发指令,如果需要控制设备。在线调试地址:https://apiexplorer.developer.huaweicloud.com/apiexplorer/doc?product=IoTDA&api=UpdateProperties修改设备属性是属于同步命令,需要设备在线才可以进行调试,先使用MQTT客户端登录服务器,模拟设备上线。然后进行调试,测试数据远程下发给设备。【1】利用MQTT客户端先登录设备 (这是同步命令,必须在线才能调试)【2】点击调试{"services":{"temp_max":100}}【4】可以看到,MQTT客户端软件上已经收到了服务器下发的消息由于是同步命令,服务器必须要收到设备的响应才能顺利完成一个流程,设备响应了服务器才能确定数据下发成功。MQTT设备端如何响应呢?设备响应格式说明:cid:link_7下面进行实操:当服务器通过在线调试,发送指令下来之后,客户端将请求ID复制下来,添加到发布主题的格式里,再回复回去,服务器收到了响应,一次属性修改就完美完成了。就是成功的状态:下面是请求的总结: (响应服务器的修改设备属性请求)上报主题的格式:$oc/devices/{device_id}/sys/properties/set/response/request_id=$oc/devices/6419627e40773741f9fbdac7_dev1/sys/properties/set/response/request_id=响应的数据:{"result_code": 0,"result_desc": "success"}4.5 设计上位机前面2讲解了需要用的API接口,接下来就使用Qt设计上位机,设计界面,完成整体上位机的逻辑设计。【1】新建Qt工程选择工程路径,放在英文路径下。创建完毕。新建Android的模板:【2】界面设计【4】代码设计:配置参数读取与保存/*功能: 保存数据到文件*/void Widget::SaveDataToFile(QString text){ /*保存数据到文件,方便下次加载*/ QString file; file=QCoreApplication::applicationDirPath()+"/"+ConfigFile; QFile filesrc(file); filesrc.open(QIODevice::WriteOnly); QDataStream out(&filesrc); out << text; //序列化写字符串 filesrc.flush(); filesrc.close();}/*功能: 从文件读取数据*/QString Widget::ReadDataFile(void){ //读取配置文件 QString text,data; text=QCoreApplication::applicationDirPath()+"/"+ConfigFile; //判断文件是否存在 if(QFile::exists(text)) { QFile filenew(text); filenew.open(QIODevice::ReadOnly); QDataStream in(&filenew); // 从文件读取序列化数据 in >> data; //提取写入的数据 filenew.close(); } return data; //返回值读取的值}【3】代码设计:云端数据解析//解析反馈结果void Widget::replyFinished(QNetworkReply *reply){ QString displayInfo; int statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); //读取所有数据 QByteArray replyData = reply->readAll(); qDebug()<<"状态码:"<<statusCode; qDebug()<<"反馈的数据:"<<QString(replyData); //更新token if(function_select==3) { displayInfo="token 更新失败."; //读取HTTP响应头的数据 QList<QNetworkReply::RawHeaderPair> RawHeader=reply->rawHeaderPairs(); qDebug()<<"HTTP响应头数量:"<<RawHeader.size(); for(int i=0;i<RawHeader.size();i++) { QString first=RawHeader.at(i).first; QString second=RawHeader.at(i).second; if(first=="X-Subject-Token") { Token=second.toUtf8(); displayInfo="token 更新成功."; //保存到文件 SaveDataToFile(Token); break; } } QMessageBox::information(this,"提示",displayInfo,QMessageBox::Ok,QMessageBox::Ok); return; } //判断状态码 if(200 != statusCode) { //解析数据 QJsonParseError json_error; QJsonDocument document = QJsonDocument::fromJson(replyData, &json_error); if(json_error.error == QJsonParseError::NoError) { //判断是否是对象,然后开始解析数据 if(document.isObject()) { QString error_str=""; QJsonObject obj = document.object(); QString error_code; //解析错误代码 if(obj.contains("error_code")) { error_code=obj.take("error_code").toString(); error_str+="错误代码:"; error_str+=error_code; error_str+="\n"; } if(obj.contains("error_msg")) { error_str+="错误消息:"; error_str+=obj.take("error_msg").toString(); error_str+="\n"; } //显示错误代码 QMessageBox::information(this,"提示",error_str,QMessageBox::Ok,QMessageBox::Ok); } } return; } //设置属性 if(function_select==12 || function_select==13) { //解析数据 QJsonParseError json_error; QJsonDocument document = QJsonDocument::fromJson(replyData, &json_error); if(json_error.error == QJsonParseError::NoError) { //判断是否是对象,然后开始解析数据 if(document.isObject()) { QJsonObject obj = document.object(); if(obj.contains("response")) { QJsonObject obj1=obj.take("response").toObject(); int val=0; QString success; if(obj1.contains("result_code")) { val=obj1.take("result_code").toInt(); } if(obj1.contains("result_desc")) { success=obj1.take("result_desc").toString(); } if(val==0 && success =="success") { //显示状态 QMessageBox::information(this,"提示","远程命令操作完成.",QMessageBox::Ok,QMessageBox::Ok); return; } else { //显示状态 QMessageBox::information(this,"提示","设备未正确回应.请检查设备网络.",QMessageBox::Ok,QMessageBox::Ok); return; } } } } } //查询设备属性 if(function_select==0) { //解析数据 QJsonParseError json_error; QJsonDocument document = QJsonDocument::fromJson(replyData, &json_error); if(json_error.error == QJsonParseError::NoError) { //判断是否是对象,然后开始解析数据 if(document.isObject()) { QJsonObject obj = document.object(); if(obj.contains("shadow")) { QJsonArray array=obj.take("shadow").toArray(); for(int i=0;i<array.size();i++) { QJsonObject obj2=array.at(i).toObject(); if(obj2.contains("reported")) { QJsonObject obj3=obj2.take("reported").toObject(); if(obj3.contains("properties")) { QJsonObject properties=obj3.take("properties").toObject(); qDebug()<<"开始解析数据...."; } } } } } } return; }}五、代码实现5.1 ESP8266连接云平台实现代码以下是使用STM32F103ZET6和ESP8266连接华为云物联网平台,通过MQTT协议实现设备登录、主题订阅和主题发布的实现代码:#include "stm32f10x.h"#include "stdio.h"#include "string.h"// 定义ESP8266的串口USART_TypeDef* ESP_USARTx = USART1;// 定义MQTT服务器的地址和端口const char* MQTT_SERVER = "mqtt.eclipse.org";const int MQTT_PORT = 1883;// 定义设备ID和设备密码const char* DEVICE_ID = "your_device_id";const char* DEVICE_PASSWORD = "your_device_password";// 定义订阅的主题const char* SUBSCRIBE_TOPIC = "your_subscribe_topic";// 定义发布的主题const char* PUBLISH_TOPIC = "your_publish_topic";// 定义接收缓冲区和发送缓冲区的大小#define RX_BUFFER_SIZE 1024#define TX_BUFFER_SIZE 1024// 定义接收缓冲区和发送缓冲区char rxBuffer[RX_BUFFER_SIZE];char txBuffer[TX_BUFFER_SIZE];// 定义接收缓冲区的索引和标志位volatile uint16_t rxIndex = 0;volatile uint8_t rxComplete = 0;// 发送数据到ESP8266void ESP8266_SendData(const char* data) { sprintf(txBuffer, "%s\r\n", data); USART_SendData(ESP_USARTx, (uint16_t)'\r'); USART_SendData(ESP_USARTx, (uint16_t)'\n'); USART_SendData(ESP_USARTx, (uint16_t)'\r'); USART_SendData(ESP_USARTx, (uint16_t)'\n'); USART_SendData(ESP_USARTx, (uint16_t)'\r'); USART_SendData(ESP_USARTx, (uint16_t)'\n'); USART_SendData(ESP_USARTx, (uint16_t)'\r'); USART_SendData(ESP_USARTx, (uint16_t)'\n'); USART_SendData(ESP_USARTx, (uint16_t)'\r'); USART_SendData(ESP_USARTx, (uint16_t)'\n'); USART_SendData(ESP_USARTx, (uint16_t)'\r'); USART_SendData(ESP_USARTx, (uint16_t)'\n'); USART_SendData(ESP_USARTx, (uint16_t)'\r'); USART_SendData(ESP_USARTx, (uint16_t)'\n'); USART_SendData(ESP_USARTx, (uint16_t)'\r'); USART_SendData(ESP_USARTx, (uint16_t)'\n');}// 从ESP8266接收数据void ESP8266_ReceiveData(uint16_t size) { while (size--) { rxBuffer[rxIndex++] = USART_ReceiveData(ESP_USARTx); } if (rxIndex >= RX_BUFFER_SIZE) { rxComplete = 1; rxIndex = 0; }}// 处理接收到的数据void ProcessReceivedData() { // TODO: 根据接收到的数据进行处理}// ESP8266串口中断处理函数void USART1_IRQHandler(void) { if (USART_GetITStatus(ESP_USARTx, USART_IT_RXNE) != RESET) { ESP8266_ReceiveData(1); }}// 连接到MQTT服务器void MQTT_Connect() { // 发送连接请求 sprintf(txBuffer, "AT+CIPSTART="TCP","%s",%d\r\n", MQTT_SERVER, MQTT_PORT); ESP8266_SendData(txBuffer); // 等待连接成功 while (!strstr(rxBuffer, "CONNECTED")) { if (rxComplete) { ProcessReceivedData(); rxComplete = 0; } } // 发送MQTT连接请求 sprintf(txBuffer, "AT+MQTTCONNECT="%s","%s"\r\n", DEVICE_ID, DEVICE_PASSWORD); ESP8266_SendData(txBuffer); // 等待连接成功 while (!strstr(rxBuffer, "CONNECTED")) { if (rxComplete) { ProcessReceivedData(); rxComplete = 0; } }}// 订阅主题void MQTT_Subscribe() { sprintf(txBuffer, "AT+MQTTSUBSCRIBE="%s"\r\n", SUBSCRIBE_TOPIC); ESP8266_SendData(txBuffer);}// 发布消息void MQTT_Publish(const char* message) { sprintf(txBuffer, "AT+MQTTPUBLISH="%s","%s"\r\n", PUBLISH_TOPIC, message); ESP8266_SendData(txBuffer);}int main(void) { // 初始化ESP8266的串口 USART_InitTypeDef USART_InitStructure; USART_InitStructure.USART_BaudRate = 115200; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init(ESP_USARTx, &USART_InitStructure); USART_Cmd(ESP_USARTx, ENABLE); USART_ITConfig(ESP_USARTx, USART_IT_RXNE, ENABLE); NVIC_EnableIRQ(USART1_IRQn); // 连接到MQTT服务器 MQTT_Connect(); // 订阅主题 MQTT_Subscribe(); while (1) { if (rxComplete) { ProcessReceivedData(); rxComplete = 0; } // TODO: 处理其他业务逻辑 // 发布消息 MQTT_Publish("Hello, MQTT!"); // 延时一段时间 delay_ms(1000); }}以上代码用于演示使用STM32F103ZET6和ESP8266连接华为云物联网平台,通过MQTT协议实现设备登录、主题订阅和主题发布的基本功能。5.2 ESP8266的MQTT协议指令ESP8266通过MQTT协议连接到服务器的相关AT指令主要有以下几个:【1】AT+CIPSTART:建立TCP连接功能:使用TCP协议连接到远程服务器用法:AT+CIPSTART="TCP","<服务器地址>",<服务器端口>示例:AT+CIPSTART="TCP","mqtt.eclipse.org",1883【2】AT+MQTTCONNECT:连接到MQTT服务器功能:使用MQTT协议连接到MQTT服务器用法:AT+MQTTCONNECT="<设备ID>","<设备密码>"示例:AT+MQTTCONNECT="your_device_id","your_device_password"【3】AT+MQTTPUBLISH:发布消息功能:向指定主题发布消息用法:AT+MQTTPUBLISH="<主题>","<消息内容>"示例:AT+MQTTPUBLISH="your_publish_topic","Hello, MQTT!"【4】AT+MQTTSUBSCRIBE:订阅主题功能:订阅指定的主题用法:AT+MQTTSUBSCRIBE="<主题>"示例:AT+MQTTSUBSCRIBE="your_subscribe_topic"【5】AT+CIPCLOSE:关闭TCP连接功能:关闭当前的TCP连接用法:AT+CIPCLOSE这些AT指令可以通过串口与ESP8266进行通信,实现与MQTT服务器的连接、消息发布和订阅等功能。通过这些指令,可以在嵌入式设备上实现与云端的通信和数据交换,从而实现物联网应用。5.2 步进电机控制代码以下是使用STM32F103ZET6单片机通过ULN2003驱动芯片控制28BYJ-48步进电机实现角度控制和速度控制的实现代码:#include "stm32f10x.h"#include "delay.h"// 定义步进电机控制引脚#define IN1_PIN GPIO_Pin_0#define IN2_PIN GPIO_Pin_1#define IN3_PIN GPIO_Pin_2#define IN4_PIN GPIO_Pin_3#define IN_PORT GPIOA// 定义步进电机角度和速度参数#define ANGLE_1 512 // 控制步进电机转动一圈的步数#define SPEED_1 5 // 控制步进电机转动的速度// 步进电机转动顺序const uint8_t stepSequence[8] = {0x01, 0x03, 0x02, 0x06, 0x04, 0x0C, 0x08, 0x09};// 步进电机当前角度和速度volatile uint16_t currentAngle = 0;volatile uint8_t currentSpeed = 0;// 初始化步进电机控制引脚void StepperMotor_Init() { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin = IN1_PIN | IN2_PIN | IN3_PIN | IN4_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(IN_PORT, &GPIO_InitStructure);}// 控制步进电机转动一步void StepperMotor_Step() { static uint8_t stepIndex = 0; GPIO_Write(IN_PORT, stepSequence[stepIndex]); stepIndex = (stepIndex + 1) % 8;}// 控制步进电机转动到指定角度void StepperMotor_MoveToAngle(uint16_t targetAngle) { uint16_t steps = targetAngle - currentAngle; uint16_t absSteps = steps > 0 ? steps : -steps; uint8_t direction = steps > 0 ? 1 : -1; for (uint16_t i = 0; i < absSteps; i++) { StepperMotor_Step(); delay_ms(2); // 控制步进电机转动的速度 } currentAngle = targetAngle;}// 控制步进电机以指定速度连续转动void StepperMotor_MoveWithSpeed(uint8_t speed) { currentSpeed = speed; while (1) { StepperMotor_Step(); delay_ms(20 - currentSpeed); // 控制步进电机转动的速度 }}int main(void) { // 初始化步进电机控制引脚 StepperMotor_Init(); // 控制步进电机转动到指定角度 StepperMotor_MoveToAngle(ANGLE_1); // 控制步进电机以指定速度连续转动 StepperMotor_MoveWithSpeed(SPEED_1); while (1) { // 主循环中可以添加其他逻辑代码 }}5.3 LD3320识别代码以下是使用STM32F103的串口2接收LD3320语音识别结果并进行判断控制的代码:#include "stm32f10x.h"#include <stdio.h>// 定义LD3320串口通信引脚#define LD3320_RX_PIN GPIO_Pin_2#define LD3320_RX_PORT GPIOA#define LD3320_USART USART2// 定义接收缓冲区大小#define BUFFER_SIZE 128// 接收缓冲区volatile char rxBuffer[BUFFER_SIZE];volatile uint8_t rxIndex = 0;volatile uint8_t rxComplete = 0;// 初始化LD3320串口通信引脚void LD3320_UART_Init() { GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); GPIO_InitStructure.GPIO_Pin = LD3320_RX_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(LD3320_RX_PORT, &GPIO_InitStructure); USART_InitStructure.USART_BaudRate = 9600; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx; USART_Init(LD3320_USART, &USART_InitStructure); USART_ITConfig(LD3320_USART, USART_IT_RXNE, ENABLE); NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); USART_Cmd(LD3320_USART, ENABLE);}// 串口2中断处理函数void USART2_IRQHandler() { if (USART_GetITStatus(LD3320_USART, USART_IT_RXNE) != RESET) { char data = USART_ReceiveData(LD3320_USART); if (rxIndex < BUFFER_SIZE - 1) { rxBuffer[rxIndex++] = data; } if (data == '\n') { rxComplete = 1; } }}// 处理接收到的LD3320识别结果void ProcessLD3320Result() { // 在这里进行LD3320识别结果的判断和控制逻辑 // 可以根据接收到的字符串进行判断,例如使用strcmp()函数进行比较 // 示例:if (strcmp(rxBuffer, "ON") == 0) { // 执行打开操作 } // 清空接收缓冲区 rxIndex = 0; rxComplete = 0;}int main(void) { // 初始化LD3320串口通信引脚 LD3320_UART_Init(); while (1) { if (rxComplete) { ProcessLD3320Result(); } }}以上代码使用STM32F103的串口2接收LD3320语音识别结果并进行判断控制。代码中使用了串口2的接收中断来接收LD3320的识别结果。在中断处理函数USART2_IRQHandler()中,将接收到的数据存储到接收缓冲区rxBuffer中,并通过检测换行符\n来判断一条完整的识别结果是否接收完成。当识别结果接收完成时,调用ProcessLD3320Result()函数进行识别结果的判断和控制逻辑处理。在ProcessLD3320Result()函数中,可以根据接收到的字符串进行判断和控制逻辑的实现。例如,使用字符串比较函数strcmp()来比较接收到的字符串与预设的控制命令是否匹配,从而执行相应的操作。在这个函数中,可以添加你需要的控制逻辑,例如打开或关闭某个设备,执行特定的动作等。
  • [技术干货] 15条电子元器件检测技巧
    1.单向晶闸管检测可用万用表的R×1k或R×100挡测量任意两极之问的正、反向电阻,如果找到一对极的电阻为低阻值(100Ω~lkΩ),则此时黑表笔所接的为控制极,红表笔所接为阴极,另一个极为阳极。晶闸管共有3个PN结,我们可以通过测量PN结正、反向电阻的大小来判别它的好坏。测量控制极(G)与阴极[C)之间的电阻时,如果正、反向电阻均为零或无穷大,表明控制极短路或断路;测量控制极(G)与阳极(A)之间的电阻时,正、反向电阻读数均应很大;测量阳极(A)与阴极(C)之间的电阻时,正、反向电阻都应很大。2.检查发光数码管的好坏先将万用表置R×10k或R×l00k挡,然后将红表笔与数码管(以共阴数码管为例)的“地”引出端相连,黑表笔依次接数码管其他引出端,七段均应分别发光,否则说明数码管损坏。3.测整流电桥各脚的极性万用表置R×1k挡,黑表笔接桥堆的任意引脚,红表笔先后测其余三只脚,如果读数均为无穷大,则黑表笔所接为桥堆的输出正极,如果读数为4~10kΩ,则黑表笔所接引脚为桥堆的输出负极,其余的两引脚为桥堆的交流输入端。4.双向晶闸管的极性识别双向晶闸管有主电极1、主电极2和控制极,如果用万用表R×1k挡测量两个主电极之间的电阻,读数应近似无穷大,而控制极与任一个主电极之间的正、反向电阻读数只有几十欧。根据这一特性,我们很容易通过测量电极之间电阻大小,识别出双向晶闸管的控制极。而当黑表笔接主电极1。红表笔接控制极时所测得的正向电阻总是要比反向电阻小一些,据此我们也很容易通过测量电阻大小来识别主电极1和主电极2。5.判断晶振的好坏先用万用表(R×10k挡)测晶振两端的电阻值,若为无穷大,说明晶振无短路或漏电;再将试电笔插入市电插孔内,用手指捏住晶振的任一引脚,将另一引脚碰触试电笔顶端的金属部分,若试电笔氖泡发红,说明晶振是好的;若氖泡不亮,则说明晶振损坏。6.判别结型场效应管的电极将万用表置于R×1k挡,用黑表笔接触假定为栅极G的管脚,然后用红表笔分别接触另外两个管脚,若阻值均比较小(5~10 Ω),再将红、黑表笔交换测量一次。如阻值均大(∞),说明都是反向电阻(PN结反向),属N沟道管,且黑表笔接触的管脚为栅极G,并说明原先假定是正确的。若再次测量的阻值均很小,说明是正向电阻,属于P沟道场效应管,黑表笔所接的也是栅极G。若不出现上述情况,可以调换红、黑表笔,按上述方法进行测试,直至判断出栅极为止。一般结型场效应管的源极与漏极在制造时是对称的,所以,当栅极G确定以后,对于源极S、漏极D不一定要判别,因为这两个极可以互换使用。源极与漏极之间的电阻为几千欧。7.三极管电极的判别对于一只型号标示不清或无标志的三极管,要想分辨出它们的三个电极,也可用万用表测试。先将万用表量程开关拨在R×100或R×1k电阻挡上。红表笔任意接触三极管的一个电极,黑表笔依次接触另外两个电极,分别测量它们之间的电阻值,若测出均为几百欧低电阻时,则红表笔接触的电极为基极b,此管为PNP管。若测出均为几十至上百千欧的高电阻时,则红表笔接触的电极也为基极b,此管为NPN管。在判别出管型和基极b的基础上,利用三极管正向电流放大系数比反向电流放大系数大的原理确定集电极。任意假定一个电极为c极,另一个电极为e极。将万用表量程开关拨在R×1k电阻挡上。对于:PNP管,令红表笔接c极,黑表笔接e极,再用手同时捏一下管子的b、c极,但不能使b、c两极直接相碰,测出某一阻值。然后两表笔对调进行第二次测量,将两次测的电阻相比较,对于:PNP型管,阻值小的一次,红表笔所接的电极为集电极。对于NPN型管阻值小的一次,黑表笔所接的电极为集电极。8.电位器的好坏判别先测电位器的标称阻值。用万用表的欧姆挡测“1”、“3”两端(设“2”端为活动触点),其读数应为电位器的标称值,如万用表的指针不动、阻值不动或阻值相差很多,则表明该电位器已损坏。再检查电位器的活动臂与电阻片的接触是否良好。用万用表的欧姆挡测“1”、“2”或“2”、“3”两端,将电位器的转轴按逆时针方向旋至接近“关”的位置,此时电阻应越小越好,再徐徐顺时钟旋转轴柄,电阻应逐渐增大,旋至极端位置时,阻值应接近电位器的标称值。如在电位器的轴柄转动过程中万用表指针有跳动瑚象,描踢活动触』点接触不良。9.激光二极管损坏判别拆下激光二极管,测量其阻值,正常情况下反向阻值应为无穷大,正向阻值在20kΩ~40kΩ。如果所测的正向阻值已超过50kΩ,说明激光二极管性能已下降;如果其正向阻值已超过90kΩ,说明该管已损坏,不能再使用了10.判别红外接收头引脚万用表置R×1k挡,先假设接收头的某脚为接地端,将其与黑表笔相接,用红表笔分别测量另两脚电阻,对比两次所测阻值(一般在4~7k Q范围),电阻较小的一次其红表笔所接为+5V电源引脚,另一阻值较大的则为信号引脚。反之,若用红表笔接已知地脚,黑表笔分别测已知电源脚及信号脚,则阻值都在15kΩ以上,阻值小的引脚为+5V端,阻值偏大的引脚为信号端。如果测量结果符合上述阻值则可判断该接收头完好。11.判断无符号电解电容极性先将电容短路放电,再将两引线做好A、B标记,万用表置R×100或R×1k挡,黑表笔接A引线,红表笔接B引线,待指针静止不动后读数,测完后短路放电;再将黑表笔接B引线,红表笔接A引线,比较两次读数,阻值较大的一次黑表笔所接为正极,红表笔所接为负极。12.测发光二极管取一个容量大于100“F的电解电容器(容量越大,现象越明显),先用万用表R×100挡对其充电,黑表笔接电容正极,红表笔接负极,充电完毕后,黑表笔改接电容负极,将被测发光二极管接于红表笔和电容正极之间。如果发光二极管亮后逐渐熄灭,表明它是好的。此时红表笔接的是发光二极管的负极,电容正极接的是发光二极管的正极。如果发光二极管不亮,将其两端对调重新接上测试,还不亮,表明发光二极管已损坏。13. 光电耦合器检测万用表选用电阻R×100挡,不得选R×10k挡,以防电池电压过高击穿发光二极管。红、黑表笔接输入端,测正、反向电阻,正常时正向电阻为数十欧姆,反向电阻几千欧至几十千欧。若正、反向电阻相近,表明发光二极管已损坏。万用表选电阻R×1挡。红、黑表笔接输出端,测正、反向电阻,正常时均接近于∞,否则受光管损坏。万用表选电阻R×10挡,红、黑表笔分别接输入、输出端测发光管与受光管之间的绝缘电阻(有条件应用兆欧表测其绝缘电阻,此时兆欧表输出额定电压应略低于被测光电耦合器所允许的耐压值),发光管与受光管问绝缘电阻正常应为∞。14.光敏电阻的检测检测时将万用表拨到R×1kΩ挡,把光敏电阻的受光面与入射光线保持垂直,于是在万用表上直接测得的电阻就是亮阻。再把光敏电阻置于完全黑暗的场所,这时万用表所测出的电阻就是暗阻。如果亮阻为几千欧至几十干欧,暗阻为几至几十兆欧,说明光敏电阻是好的。15.测量大容量电容的漏电电阻用500型万用表置于R×10或R×100挡,待指针指向最大值时,再立即改用R×1k挡测量,指针会在较短时间内稳定,从而读出漏电电阻阻值。
  • [热门活动] 【IoT专题直播有奖提问】DTSE Tech Talk 技术直播 NO.37:看直播提问题赢华为云定制长袖卫衣、华为云定制Polo衫等好礼!
    中奖结果公示感谢各位小伙伴参与本次活动,本次活动获奖名单如下:请各位获奖的伙伴在7月31日之前点击此处填写收货地址,如逾期未填写视为弃奖。再次感谢各位小伙伴参与本次活动,欢迎关注华为云DTSE Tech Talk 技术直播更多活动~直播简介【直播主题】如何为物联网设备注入“华为云+鸿蒙DNA”?【直播时间】2023年7月26日 16:30-18:00【直播专家】陈星利  华为云IoT DTSE技术布道师、华为云IoT 高级工程师【直播简介】本期直播由华为云IoT技术布道师陈星利讲解华为云IoT+OpenHarmony深入协同为开发者提供开放能力,指导参与华为开发者大赛的选手们如何通过集成OpenHomony或鸿蒙模组即可实现无缝对接华为云IoT平台,实现“哑” 设备“无屏变有屏”,技术加持提升作品创新度。直播链接:cid:link_2活动介绍【互动方式】直播前您可以在本帖留下您疑惑的问题,专家会在直播时为您解答。直播后您可以继续在本帖留言,与专家互动交流。我们会在全部活动结束后对参与互动的用户进行评选。【活动时间】即日起—2023年7月27日【奖励说明】评奖规则:活动1:直播期间在直播间提出与直播内容相关的问题,对专家评选为优质问题的开发者进行奖励。奖品:华为云定制卫衣活动2:在本帖提出与直播内容相关的问题,由专家在所有互动贴中选出最优问题贴的开发者进行奖励。奖品:华为云定制Polo衫更多直播活动直播互动有礼:官网直播间发口令“华为云 DTSE”抽华为云定制棒球帽、填写问卷抽华为云定制鼠标垫等好礼;直播过程中提问,评选优质问题送华为云定制长袖卫衣。分享问卷有礼 :邀请5位朋友以上完成问卷即可获得华为云定制帆布袋。戳我填问卷》》老观众专属福利:连续报名并观看DTT直播3期以上抽送华为云DTT定制T恤。【注意事项】1、所有参与活动的问题,如发现为复用他人内容,则取消获奖资格。2、为保证您顺利领取活动奖品,请您在活动公示奖项后2个工作日内私信提前填写奖品收货信息,如您没有填写,视为自动放弃奖励。3、活动奖项公示时间截止2023年7月27日,如未反馈邮寄信息视为弃奖。本次活动奖品将于奖项公示后30个工作日内统一发出,请您耐心等待。4、活动期间同类子活动每个ID(同一姓名/电话/收货地址)只能获奖一次,若重复则中奖资格顺延至下一位合格开发者,仅一次顺延。5、如活动奖品出现没有库存的情况,华为云工作人员将会替换等价值的奖品,获奖者不同意此规则视为放弃奖品。6、其他事宜请参考【华为云社区常规活动规则】。
  • [问题求助] 编译失败
    明明有头文件,并且代码里面那个头文件没有报错,但编译的时候却报错找不到cJson文件是为什么
  • [问题求助] 小熊派wifi模块使用LWM2M协议如何激活华为云平台设备
    这是实验手册上的这是我的我也试过将Lwm2m协议改为MQTT协议,但是编译会报错fatal error: cjson/cJSON.h: No such file or directory。相关参数也不会调就放弃了实验手册上开始使用的NB-IoT模组进行实验后改为WiFI模组,所以有IMEI号,但是我只有wifi模组,没有IMEi号。参数该如何选择才可以连上平台上的设备?
  • [问题求助] openocd一直烧录失败
    失败消息如下:Open On-Chip Debugger 0.10.0 Licensed under GNU GPL v2 For bug reports, read         http://openocd.org/doc/doxygen/bugs.html Info : auto-selecting first available session transport "hla_swd". To override use 'transport select <transport>'. Info : The selected transport took over low-level target control. The results might differ compared to plain JTAG/SWD adapter speed: 500 kHz adapter_nsrst_delay: 100 none separate Info : Unable to match requested speed 500 kHz, using 480 kHz Info : Unable to match requested speed 500 kHz, using 480 kHz Info : clock speed 480 kHz Info : STLINK v2 JTAG v32 API v2 SWIM v22 VID 0x0483 PID 0x374B Info : using stlink api v2 Info : Target voltage: 3.275502 Info : stm32l4x.cpu: hardware has 6 breakpoints, 4 watchpoints     TargetName         Type       Endian TapName            State        --  ------------------ ---------- ------ ------------------ ------------  0* stm32l4x.cpu       hla_target little stm32l4x.cpu       running Info : Unable to match requested speed 500 kHz, using 480 kHz Info : Unable to match requested speed 500 kHz, using 480 kHz adapter speed: 480 kHz target halted due to debug-request, current mode: Thread  xPSR: 0x01000000 pc: 0x08000440 msp: 00000000 auto erase enabled Info : device id = 0x10016435 Info : flash size = 256kbytes target halted due to breakpoint, current mode: Thread  xPSR: 0x61000000 pc: 0x20000050 msp: 00000000 Warn : block write succeeded wrote 196608 bytes from file E:/HUAWEI/LiteOS_Lab_HCIP/targets/STM32L431_BearPi/GCC/build/Huawei_LiteOS.bin in 9.477680s (20.258 KiB/s) Info : Unable to match requested speed 500 kHz, using 480 kHz Info : Unable to match requested speed 500 kHz, using 480 kHz adapter speed: 480 kHz shutdown command invoked看见前几年也有人有类似的问题,但都没有有用解决方法,有真正解决了的人帮忙吗
  • [问题求助] 应用模拟器可以成功下发命令,设备模拟器插件解码失败怎么解决??
    应用模拟器可以成功下发命令,但设备模拟器的命令下发失败消息警告如下
  • [问题求助] modelbox 与 华为云IOT平台结合
    modelbox与华为云IOT结合,用MQTT协议数据属性上报,触发告警,能够实现吗?
  • [问题求助] 如何将IoTDA物联网的数据实时上传到Astro?
    物联网设备的数据已通过MQTT协议上传到【华为云 设备接入 IoTDA】,如何将其实时上传到Astro并通过AstroCANVAS的数据中心调用以搭建物联网业务大屏。
  • [问题求助] IAM Token所在用户怎么订阅设备接入服务
    请问IAM Token所在用户怎么订阅设备接入服务??
  • [问题求助] axios状态码500
    我是复制的api Explorer的axios的代码,结果返回状态码500,这是后端服务器错了吗
  • 挑战5分钟调用IoT API,实现人体红外感应-005
    实验介绍:本实验模拟红外感应场景,通过API Explorer调用IoT接口,实现产品创建/设备注册/命令下发,快速实现人体红外感应;前提条件1)已注册华为帐号。未注册可点击注册页面完成注册。2)已完成实名制认证。未完成可在华为云上点击实名认证完成认证,否则无法使用设备接入功能。开通设备接入服务1)访问设备接入服务产品首页,单击“免费试用”。链接地址:https://www.huaweicloud.com/product/iothub.htm2)根据界面提示,单击“确定”,即可开通标准版免费实例。开始红外感应设备控制PK访问API Explorer工具:cid:link_11、创建产品1)选择“产品管理 > CreateProduct”;2)(可选)新用户直接跳过此步骤,如果是基础版存量用户,请下拉选择标准版实例;3) 为了方便填写参数,将body切换为文本输入,将产品代码复制粘贴进去;4)参数填写完成,单击【调试】发送请求;查看调试结果,确认请求成功,方可进入下一步。{ "product_id": "Infrared-Product-005", "name": "红外感应产品", "device_type": "红外感应设备", "protocol_type": "MQTT", "data_format": "json", "service_capabilities": [ { "service_id": "Infrared", "service_type": "Infrared", "properties": [ { "property_name": "Status", "data_type": "string", "max_length": 4, "method": "RW" } ], "commands": [ { "command_name": "Set_Beep", "paras": [ { "para_name": "Beep", "data_type": "enum", "required": true, "enum_list": [ "ON","OFF" ] } ], "responses": [ { "response_name": "ACK", "paras": [ { "para_name": "result", "data_type": "int", "required": true, "min": "0", "max": "1" } ] } ] } ] } ] }2、注册设备1)选择“设备管理 > AddDevice”;2)(可选)新用户直接跳过此步骤,如果是基础版存量用户,请下拉选择标准版实例;3)为了方便填写参数,将body切换为文本输入,将设备代码复制粘贴进去;4)参数填写完成,单击【调试】发送请求;查看调试结果,确认请求成功,方可进入下一步。{ "device_id": "Infrared-Device005", "node_id": "Infrared-Device005", "device_name": "红外感应设备", "product_id": "Infrared-Product-005", "auth_info": { "secret": "12345678" } }3、命令下发1)选择“设备命令 > CreateCommand”;2)(可选)新用户直接跳过此步骤,如果是基础版存量用户,请下拉选择标准版实例;3)手动填写device_id: Infrared-Device005;4)为了方便填写参数,将body切换为文本输入,将命令代码复制粘贴进去;参数填写完成,单击【调试】发送请求;并请查看调试结果,确认请求成功。注:命令下发成功,红外感应设备沙盘中对应编号的蜂鸣器会发出蜂鸣报警声,请等待现场活动小助手记录PK结果后,进入下一步删除设备。{ "service_id": "Infrared", "command_name": "Set_Beep", "paras": {"Beep": "ON"} }4、删除设备1)选择“设备管理 > DeleteDevice”;2)(可选)新用户直接跳过此步骤,如果是基础版存量用户,请下拉选择标准版实例;3)手动填写device_id: Infrared-Device005;4)参数填写完成,单击【调试】发送请求;并请查看调试结果,确认请求成功。注:请务必查看调试结果,确认设备删除成功,并将结果展示给现场活动小助手进行确认。感谢~
  • 挑战5分钟调用IoT API,实现人体红外感应-004
    实验介绍:本实验模拟红外感应场景,通过API Explorer调用IoT接口,实现产品创建/设备注册/命令下发,快速实现人体红外感应;前提条件1)已注册华为帐号。未注册可点击注册页面完成注册。2)已完成实名制认证。未完成可在华为云上点击实名认证完成认证,否则无法使用设备接入功能。开通设备接入服务1)访问设备接入服务产品首页,单击“免费试用”。链接地址:https://www.huaweicloud.com/product/iothub.htm2)根据界面提示,单击“确定”,即可开通标准版免费实例。开始红外感应设备控制PK访问API Explorer工具:cid:link_11、创建产品1)选择“产品管理 > CreateProduct”;2)(可选)新用户直接跳过此步骤,如果是基础版存量用户,请下拉选择标准版实例;3) 为了方便填写参数,将body切换为文本输入,将产品代码复制粘贴进去;4)参数填写完成,单击【调试】发送请求;查看调试结果,确认请求成功,方可进入下一步。{ "product_id": "Infrared-Product-004", "name": "红外感应产品", "device_type": "红外感应设备", "protocol_type": "MQTT", "data_format": "json", "service_capabilities": [ { "service_id": "Infrared", "service_type": "Infrared", "properties": [ { "property_name": "Status", "data_type": "string", "max_length": 4, "method": "RW" } ], "commands": [ { "command_name": "Set_Beep", "paras": [ { "para_name": "Beep", "data_type": "enum", "required": true, "enum_list": [ "ON","OFF" ] } ], "responses": [ { "response_name": "ACK", "paras": [ { "para_name": "result", "data_type": "int", "required": true, "min": "0", "max": "1" } ] } ] } ] } ] }2、注册设备1)选择“设备管理 > AddDevice”;2)(可选)新用户直接跳过此步骤,如果是基础版存量用户,请下拉选择标准版实例;3)为了方便填写参数,将body切换为文本输入,将设备代码复制粘贴进去;4)参数填写完成,单击【调试】发送请求;查看调试结果,确认请求成功,方可进入下一步。{ "device_id": "Infrared-Device004", "node_id": "Infrared-Device004", "device_name": "红外感应设备", "product_id": "Infrared-Product-004", "auth_info": { "secret": "12345678" } }3、命令下发1)选择“设备命令 > CreateCommand”;2)(可选)新用户直接跳过此步骤,如果是基础版存量用户,请下拉选择标准版实例;3)手动填写device_id: Infrared-Device001;4)为了方便填写参数,将body切换为文本输入,将命令代码复制粘贴进去;参数填写完成,单击【调试】发送请求;并请查看调试结果,确认请求成功。注:命令下发成功,红外感应设备沙盘中对应编号的蜂鸣器会发出蜂鸣报警声,请等待现场活动小助手记录PK结果后,进入下一步删除设备。{ "service_id": "Infrared", "command_name": "Set_Beep", "paras": {"Beep": "ON"} }4、删除设备1)选择“设备管理 > DeleteDevice”;2)(可选)新用户直接跳过此步骤,如果是基础版存量用户,请下拉选择标准版实例;3)手动填写device_id: Infrared-Device004;4)参数填写完成,单击【调试】发送请求;并请查看调试结果,确认请求成功。注:请务必查看调试结果,确认设备删除成功,并将结果展示给现场活动小助手进行确认。感谢~