-
如题,想问一下大佬们,如何将树莓派-CSI摄像头获取到的实时视频传输到IoT云平台
-
中奖结果公示感谢各位小伙伴参与本次活动,本次活动获奖名单如下:请各位获奖的伙伴在6月16日之前点击此处填写收货地址,如逾期未填写视为弃奖。再次感谢各位小伙伴参与本次活动,欢迎关注华为云DTSE Tech Talk 技术直播更多活动~直播简介【直播主题】让设备数据说“实”话!IT 老手带你实战搭建IoT动态实时大屏【直播时间】2023年6月14日 16:30-18:00【直播专家】李小龙 华为云IoT DTSE技术布道师【直播简介】物联网解决方案中,如何分析与利用庞大的设备数据是一个新的挑战。华为云物联网平台提供规则引擎能力,支持将设备上报的数据转发至华为云其他云服务,并结合可视化组件进行呈现,实现数据的一站式采集、处理和分析。本场直播将手把手带你实战搭建IoT动态实时大屏!直播链接:cid:link_2活动介绍【互动方式】直播前您可以在本帖留下您疑惑的问题,专家会在直播时为您解答。直播后您可以继续在本帖留言,与专家互动交流。我们会在全部活动结束后对参与互动的用户进行评选。【活动时间】即日起—2023年6月14日【奖励说明】评奖规则:活动1:直播期间在直播间提出与直播内容相关的问题,对专家评选为优质问题的开发者进行奖励。奖品:华为云定制长袖卫衣活动2:在本帖提出与直播内容相关的问题,由专家在所有互动贴中选出最优问题贴的开发者进行奖励。奖品:华为云定制Polo衫更多直播活动直播互动有礼:官网直播间发口令“华为云 DTSE”抽华为云定制棒球帽、填写问卷抽华为云定制无线鼠标等好礼。分享问卷有礼 :邀请5位朋友以上完成问卷即可获得华为云定制帆布袋。戳我填问卷》》老观众专属福利:连续报名并观看DTT直播3期以上抽送华为云DTT定制T恤。【注意事项】1、所有参与活动的问题,如发现为复用他人内容,则取消获奖资格。2、为保证您顺利领取活动奖品,请您在活动公示奖项后2个工作日内私信提前填写奖品收货信息,如您没有填写,视为自动放弃奖励。3、活动奖项公示时间截止2023年6月15日,如未反馈邮寄信息视为弃奖。本次活动奖品将于奖项公示后30个工作日内统一发出,请您耐心等待。4、活动期间同类子活动每个ID(同一姓名/电话/收货地址)只能获奖一次,若重复则中奖资格顺延至下一位合格开发者,仅一次顺延。5、如活动奖品出现没有库存的情况,华为云工作人员将会替换等价值的奖品,获奖者不同意此规则视为放弃奖品。6、其他事宜请参考【华为云社区常规活动规则】。
-
-
1、使用esp8266上传数据时,前面连接都是可以的,但是上传数据就会出错,具体如下:at指令发送都是正常的连接的ip地址为:183.230.40.33,端口号为80 at指令为AT+CIPSTART="TCP","183.230.40.33",80,显示连接正常2、但是后面发送报文就会出错报文为:POST /devices/dht11/datapoints HTTP/1.1 api-key:kbepayNBl+GTYauxyWurS1sbAX8P691hZxlPtauFqfs= Host:api.heclouds.com Connection:close Content-Length:66 {"datastreams":[{"id":"dht11","datapoints":[{"value":20}]}]} 其中设备ID为:api-key为:前面WIFI连接已经at指令发送都是正常的,但是发送报文以后就显示错误。2、在使用tcp测试工具时,仍然出错
-
onenet云平台最近改版,好多东西找不到。1、HTTP协议连接时,数据协议只能选择onejson格式,不能选择数据流格式2、选择HTTP协议,数据格式为onejson格式,后面的报文格式怎么写?3、设备ID和api-key是下面两个吗?设备IDapi-key
-
问题核心:Coap 终端接入华为云一段时间之后,数据上行或者命令下发就失败,需要重新注册设备(Coap 终端为离线模拟器)或者重新执行AT指令接入云平台(Coap 终端为单片机+BC95模组)。(粗暴)解决方案:若Coap 终端为单片机+BC95模组,每隔1分钟重新执行以下步骤:AT+NRB , AT+NCDP ,AT+CFUN,AT+CGATT才能够使用AT+NMGS发送数据问题求助:什么原因造成设备掉线?怎样真正解决这个问题?
-
我首先使用mqtt获取传感器数据上传到华为云平台,在OBS中也有看见CSV文件,但是就是获取桶文件失败
-
大佬们,设备接入CoAP协议ping不通怎么解决
-
想问下大佬基于NB-IoT数据如何传输的,发送端怎么实现(单片机),接收端怎么实现(云平台)
-
手机热点连接成功,串口也正常就是云平台的设备b'x
-
类似安装在windows操作系统的KEPSERVER这款软件。有兴趣的大拿们,可以留个言。支持原创国产化、支持工业化Teams software LTD,C&江苏特姆斯软件
-
华为云物联网平台的DLV可视化大屏能增加按钮控制吗? 比如:增加一个按钮之类的,控制自己的设备,开灯或者关灯?
-
华为云物联网平台有好用的可视化界面不? 就像onenet平台有可视化组件能几分钟做一个网页。 阿里云平台能生成自定义的APK文件,安装到自己手机上这种?
-
一、项目背景当前文章介绍基于STM32单片机的智能温室大棚监控系统,当前系统由温湿度传感器、二氧化碳传感器、光敏电阻传感器、土壤湿度传感器笨时温宏大棚中内作物生长环境因子主要包括温度、湿度、光度、土壤湿度传感、二氧化碳浓度等参数进行监控。采集数据,判断是否在系统设定上限、下限范围,如果超出了上限下限蜂鸣器报警、通风系统、LED补光系统、水泵系统就会启也可以通过手机APP和华为云华为云物联网云平台对温室大棚中的数据进行修改和设定新的数据。本设计整体主要采用STM32单片机为核心、温湿度传感器、二氧化碳传感器、光敏电阻传感器、土壤湿度传感器、通风系统、LED补光系统、水泵系统组成。(1) 温湿度传感器: 主要对温室大棚中农作物环境进行温湿度监控,把数据传到控制系统,由控制系统传到OLED显示屏上显示出来。(2) 二氧化碳传感器: 工作过程对温室大棚中的农作物环境二氧化碳浓度进行监控采集数据,把数据传到控制系统后,再把控制系统中的当前环境数据传显示屏上显示出来。(3) 光敏电阻传感器: 工作过程主要通过对温室大棚中的农作物环境光照强度进行监控采集数据,把数据传到控制系统后,再从控制系统的数据传到显示屏上显示。(4) 土壤湿度传感器: 工作过程对温室大棚中的农作物生长环境的土壤湿度进行监控采集数据,把数据传到控制系统中,再从控制系统中的数据传到显示屏上显示出来。(5) OLED显示屏: 主要用来对二氧化碳、温湿度、光照强度以及土壤湿度传感器中的数据显示出来。(6) 蜂鸣器模块: 主要对二氧化碳浓度、温湿度、土壤湿度、光照强度等传感器的采集数据是否高过或低于上限、下限值时蜂鸣器报警等功能,并提醒用户。(7) 继电器模块: 主要通过把温湿度、土壤湿度传感器中的温湿度过高时或过低时,把温湿度转换成电信号,使通风、水泵启动等功能。(8) 通风系统: 当温室大棚中环境温度过高时,通风系统启动对室内进行通风,使温度降下到设定值内通风系统关闭停止工作。(9) 水泵系统: 当土壤湿度传感器检测土壤湿度低于下限值时,水泵系统开启进行浇水灌溉,当土壤湿度到达土壤湿度传感器上下限内,水泵系统关闭停止工作。(10) LED补光系统: 通过光敏电阻传感器检测温室大棚中环境光照强度低于下限值时,LED补光系统开启对农作物进行补光,当光敏电阻传感器检测达到上下限内LED补光系统关闭停止补光。(11) 按键模块: 主要用来调采集数据模块的上、下限值,可以通过按键切换手动和自动和云端三种模式,手动按键控制通风系统、LED补光系统、水泵系统打开和关闭功能。(12) WIFI模块: 通过控制系统数据处理之后传输给外网,手机APP主要用来接收传来的数据显示出来(13). 上机模块: 监控各个传感器的采集数据工作情况,执行硬件工作状态,也可以通过手机和华为云物联网云平台切换手动以及自动控制模式,对各传感器的设置上下限值。二、硬件设计【1】硬件设计本系统硬件设计包括控制模块、传感器模块和执行模块三部分。控制模块: 该模块使用STM32F103C8T6单片机作为主控制器,负责处理各个传感器的数据和控制执行模块。此外,控制模块还需要与各个执行模块和外部设备进行通信,以实现数据的处理和传输。传感器模块: 传感器模块包括温湿度传感器、二氧化碳传感器、光敏电阻传感器和土壤湿度传感器,主要负责感应和采集生长环境的温湿度、二氧化碳浓度、光照强度和土壤湿度等参数,并将数据传输给控制模块处理。执行模块: 执行模块包括通风系统、LED补光系统、水泵系统等,用于根据传感器采集到的数据直接或间接地调节生长环境因子,并保证生长环境达到稳定的状态。【2】软件设计软件设计主要分为以下四个模块:传感器数据采集模块、数据处理模块、控制模块和远程控制模块。传感器数据采集模块: 该模块负责对传感器数据进行采集,包括温湿度传感器、二氧化碳传感器、光敏电阻传感器和土壤湿度传感器。采集到的数据通过串口接口发送给控制模块。数据处理模块: 该模块负责对采集到的传感器数据进行处理,判断当前环境因子是否超出设定范围,如果超出,则触发报警和控制执行模块的操作。同时,该模块还要将处理后的数据发送给控制模块进行控制操作。控制模块: 该模块负责控制执行模块,根据数据处理模块的指令,启动通风系统、LED补光系统、水泵系统等设备,以保证生长环境稳定和水平。远程控制模块: 该模块实现通过手机APP和华为云IOT平台远程管理系统,对温室大棚中的数据进行修改和设定新的数据。用户可以通过手机APP或者华为云IOT平台,实时查看和修改温室大棚的环境因子,实现远程控制和管理。三、华为云IOT平台开发在华为云IOT平台上,需要进行设备接入、数据模型定义、规则引擎配置和应用开发等四个核心模块的开发。其中,设备接入模块包括设备注册、获取设备证书、建立连接等步骤,以保障设备与云平台之间的安全通信;数据模型定义模块需要根据实际需求定义相应的数据模型,包括上传数据格式、设备属性和服务等。规则引擎配置模块需要完成实时消息推送、远程控制和告警等功能。应用开发模块则是将完整的智能井盖系统进行打包,为用户提供统一的操作接口。华为云官网: cid:link_6打开官网,搜索物联网,就能快速找到 设备接入IoTDA。3.1 物联网平台介绍华为云物联网平台(IoT 设备接入云服务)提供海量设备的接入和管理能力,将物理设备联接到云,支撑设备数据采集上云和云端下发命令给设备进行远程控制,配合华为云其他产品,帮助我们快速构筑物联网解决方案。使用物联网平台构建一个完整的物联网解决方案主要包括3部分:物联网平台、业务应用和设备。物联网平台作为连接业务应用和设备的中间层,屏蔽了各种复杂的设备接口,实现设备的快速接入;同时提供强大的开放能力,支撑行业用户构建各种物联网解决方案。设备可以通过固网、2G/3G/4G/5G、NB-IoT、Wifi等多种网络接入物联网平台,并使用LWM2M/CoAP、MQTT、HTTPS协议将业务数据上报到平台,平台也可以将控制命令下发给设备。业务应用通过调用物联网平台提供的API,实现设备数据采集、命令下发、设备管理等业务场景。3.2 开通物联网服务地址: cid:link_4开通标准版免费单元。开通之后,点击总览,查看接入信息。 我们当前设备准备采用MQTT协议接入华为云平台,这里可以看到MQTT协议的地址和端口号等信息。总结: 端口号: MQTT (1883)| MQTTS (8883) 接入地址: a3433ab133.iot-mqtts.cn-north-4.myhuaweicloud.com复制根据域名地址得到IP地址信息: Microsoft Windows [版本 10.0.19044.2846] (c) Microsoft Corporation。保留所有权利。 C:\Users\11266>ping a3433ab133.iot-mqtts.cn-north-4.myhuaweicloud.com 正在 Ping a3433ab133.iot-mqtts.cn-north-4.myhuaweicloud.com [121.36.42.100] 具有 32 字节的数据: 来自 121.36.42.100 的回复: 字节=32 时间=37ms TTL=31 来自 121.36.42.100 的回复: 字节=32 时间=37ms TTL=31 来自 121.36.42.100 的回复: 字节=32 时间=36ms TTL=31 来自 121.36.42.100 的回复: 字节=32 时间=37ms TTL=31 121.36.42.100 的 Ping 统计信息: 数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失), 往返行程的估计时间(以毫秒为单位): 最短 = 36ms,最长 = 37ms,平均 = 36ms C:\Users\11266>复制MQTT协议接入端口号有两个,1883是非加密端口,8883是证书加密端口,单片机无法加载证书,所以使用1883端口比较合适。 接下来的ESP8266就采用1883端口连接华为云物联网平台。3.3 创建产品(1)创建产品点击右上角创建产品。(2)填写产品信息根据自己产品名字填写,设备类型选择自定义类型。(3)添加自定义模型产品创建完成之后,点击进入产品详情页面,翻到最下面可以看到模型定义。模型简单来说: 就是存放设备上传到云平台的数据。比如:环境温度、环境湿度、环境烟雾浓度、火焰检测状态图等等,这些我们都可以单独创建一个模型保存。3.4 添加设备产品是属于上层的抽象模型,接下来在产品模型下添加实际的设备。添加的设备最终需要与真实的设备关联在一起,完成数据交互。(1)注册设备点击右上角注册设备。(2)根据自己的设备填写在弹出的对话框里填写自己设备的信息。根据自己设备详细情况填写。(3)保存设备信息创建完毕之后,点击保存并关闭,得到创建的设备密匙信息。该信息在后续生成MQTT三元组的时候需要使用。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_2、业务流程:(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_2对于设备而言,一般会订阅平台下发消息给设备 这个主题。设备想接收平台下发的消息,就需要订阅平台下发消息给设备 的主题,订阅后,平台下发消息给设备,设备就会收到消息。(4)主题发布格式对于设备来说,主题发布表示向云平台上传数据,将最新的传感器数据,设备状态上传到云平台。这个操作称为:属性上报。帮助文档地址:cid:link_13.6 MQTT三元组MQTT协议登录需要填用户ID,设备ID,设备密码等信息,就像我们平时登录QQ,微信一样要输入账号密码才能登录。MQTT协议登录的这3个参数,一般称为MQTT三元组。接下来介绍,华为云平台的MQTT三元组参数如何得到。(1)MQTT服务器地址要登录MQTT服务器,首先记得先知道服务器的地址是多少,端口是多少。帮助文档地址:cid:link_0MQTT协议的端口支持1883和8883,它们的区别是:8883 是加密端口更加安全。但是单片机上使用比较困难,所以当前的设备是采用1883端口进连接的。根据上面的域名和端口号,得到下面的IP地址和端口号信息: 如果设备支持填写域名可以直接填域名,不支持就直接填写IP地址。 (IP地址就是域名解析得到的) 华为云的MQTT服务器地址:121.36.42.100 华为云的MQTT端口号:1883复制(2)生成MQTT三元组华为云提供了一个在线工具,用来生成MQTT鉴权三元组: cid:link_3打开这个工具,填入设备的信息(也就是刚才创建完设备之后保存的信息),点击生成,就可以得到MQTT的登录信息了。下面是打开的页面:3.7 参考案例华为云平台部署开发也可以参考这里:cid:link_5【基于华为云IOT平台实现多节点温度采集(STM32+NBIOT)】四、设计代码【1】DHT11温湿度数据读取以下是基于HAL库的STM32F103ZET6读取DHT11温湿度传感器的代码: #include "dht11.h" #define DHT11_GPIO_PORT GPIOA #define DHT11_GPIO_PIN GPIO_PIN_0 /* DHT11引脚初始化 */ void DHT11_Init() { GPIO_InitTypeDef GPIO_InitStruct = {0}; /* 打开GPIO时钟 */ __HAL_RCC_GPIOA_CLK_ENABLE(); /* 配置GPIO为推挽输出模式 */ GPIO_InitStruct.Pin = DHT11_GPIO_PIN; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(DHT11_GPIO_PORT, &GPIO_InitStruct); } /* 从DHT11读取一次温湿度数据 */ DHT11_Result_t DHT11_Read_Data() { uint8_t data[5] = {0}; uint8_t check = 0; uint8_t i = 0; /* 向DHT11发送起始信号 */ HAL_GPIO_WritePin(DHT11_GPIO_PORT, DHT11_GPIO_PIN, GPIO_PIN_RESET); HAL_Delay(20); HAL_GPIO_WritePin(DHT11_GPIO_PORT, DHT11_GPIO_PIN, GPIO_PIN_SET); HAL_Delay(30); /* 切换到输入模式等待DHT11的响应 */ GPIO_InitTypeDef GPIO_InitStruct = {0}; GPIO_InitStruct.Pin = DHT11_GPIO_PIN; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_PULLUP; HAL_GPIO_Init(DHT11_GPIO_PORT, &GPIO_InitStruct); /* 等待DHT11响应 */ while (HAL_GPIO_ReadPin(DHT11_GPIO_PORT, DHT11_GPIO_PIN) == GPIO_PIN_SET); /* 等待DHT11发送完毕 */ while (HAL_GPIO_ReadPin(DHT11_GPIO_PORT, DHT11_GPIO_PIN) == GPIO_PIN_RESET); /* 读取DHT11发送的数据 */ for (i = 0; i < 5; i++) { uint8_t j = 0; for (j = 0; j < 8; j++) { /* 等待低电平结束 */ while (HAL_GPIO_ReadPin(DHT11_GPIO_PORT, DHT11_GPIO_PIN) == GPIO_PIN_RESET); /* 等待高电平结束,并记录时间 */ uint32_t t = 0; while (HAL_GPIO_ReadPin(DHT11_GPIO_PORT, DHT11_GPIO_PIN) == GPIO_PIN_SET) { t++; if (t > 100) break; } /* 根据时间计算数据位的值 */ data[i] <<= 1; if (t >= 50) { data[i] |= 0x01; } } } /* 切换回输出模式 */ GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD; HAL_GPIO_Init(DHT11_GPIO_PORT, &GPIO_InitStruct); /* 验证数据的正确性 */ check = data[0] + data[1] + data[2] + data[3]; if (check != data[4]) { return DHT11_ERROR_CHECKSUM; } /* 读取温湿度数据结果 */ DHT11_Result_t result; result.humidity = data[0]; result.temperature = data[2]; return result; }该代码基于HAL库的STM32F103ZET6读取DHT11温湿度传感器的代码示例: /* 获取温湿度数据 */ void get_temperature_humidity() { DHT11_Result_t res = DHT11_Read_Data(); if (res != DHT11_ERROR_CHECKSUM) { float humidity = res.humidity; float temperature = res.temperature; printf("温度:%.1f°C 湿度:%.1f%%RH\r\n", temperature, humidity); } else { printf("读取失败,请检查连接和传感器是否正常!\r\n"); } } int main() { HAL_Init(); // 初始化串口输出 uart_init(); printf("DHT11温湿度传感器读取测试开始\r\n"); // 初始化DHT11引脚 DHT11_Init(); while (1) { // 读取温湿度传感器数据 get_temperature_humidity(); HAL_Delay(2000); } }需要注意的是,在主函数中,我们先初始化了串口输出和DHT11引脚,然后通过循环一直读取温湿度数据并打印输出。其中,get_temperature_humidity()函数负责调用DHT11_Read_Data()函数读取温湿度数据,并将结果打印出来。如果读取失败,get_temperature_humidity()函数也会将错误信息打印出来。【2】读取BH1750光敏传感器的值以下是基于HAL库的STM32F103ZET6读取BH1750光照强度传感器的代码: #include "bh1750.h" /* BH1750地址 */ #define BH1750_ADDR 0x23 /* BH1750命令 */ #define BH1750_CMD_POWER_ON 0x01 #define BH1750_CMD_POWER_DOWN 0x00 #define BH1750_CMD_RESET 0x07 #define BH1750_CMD_ONE_TIME_H 0x20 #define BH1750_CMD_ONE_TIME_L 0x23 /* BH1750初始化配置 */ void BH1750_Init() { I2C_HandleTypeDef hi2c1 = {0}; hi2c1.Instance = I2C1; hi2c1.Init.ClockSpeed = 200000; hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2; hi2c1.Init.OwnAddress1 = 0; hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT; hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE; hi2c1.Init.OwnAddress2 = 0; hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE; hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE; HAL_I2C_Init(&hi2c1); uint8_t init_data = BH1750_CMD_POWER_ON; HAL_I2C_Master_Transmit(&hi2c1, BH1750_ADDR, &init_data, 1, HAL_MAX_DELAY); } /* 从BH1750读取光照强度数据 */ float BH1750_Read_Lux() { I2C_HandleTypeDef hi2c1 = {0}; hi2c1.Instance = I2C1; hi2c1.Init.ClockSpeed = 200000; hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2; hi2c1.Init.OwnAddress1 = 0; hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT; hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE; hi2c1.Init.OwnAddress2 = 0; hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE; hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE; HAL_I2C_Init(&hi2c1); /* 发送手动读取命令 */ uint8_t cmd_data = BH1750_CMD_ONE_TIME_H; HAL_I2C_Master_Transmit(&hi2c1, BH1750_ADDR, &cmd_data, 1, HAL_MAX_DELAY); /* 等待读取完成 */ HAL_Delay(180); /* 读取数据 */ uint8_t buf[2]; HAL_I2C_Master_Receive(&hi2c1, BH1750_ADDR, buf, 2, HAL_MAX_DELAY); /* 计算光照强度 */ uint16_t val = (buf[0] << 8) | buf[1]; float lux = val / 1.2; return lux; }该代码首先在BH1750_Init()函数中初始化了I2C相关的参数,并使用HAL_I2C_Master_Transmit()函数向BH1750发送了开启电源的命令。在BH1750_Read_Lux()函数中,我们首先发送手动读取命令,等待数据准备完成后,使用 HAL_I2C_Master_Receive() 函数读取BH1750返回的2字节数据。随后通过计算获得光照强度值。使用时,只需要在主函数中调用BH1750_Init()函数初始化I2C参数和发送开启电源命令,然后在需要读取光照强度数据时调用BH1750_Read_Lux()函数即可,如下所示: int main(void) { HAL_Init(); /* 初始化BH1750 */ BH1750_Init(); /* 读取BH1750光照强度 */ float lux = BH1750_Read_Lux(); printf("光照强度:%.1f Lux\r\n", lux); while (1) { /* 主程序循环,可以进行其他操作或等待 */ } }五、总结当前设计实现了一款基于STM32单片机的智能温室大棚监控系统,该系统通过多种传感器实现环境因子的实时监测和数据上传,在应用上具有重要的作用和应用价值。整体介绍了系统硬件和软件设计的各个环节,提供了一定的参考价值和设计思路。同时,该系统还可以在未来加入更多的传感器和控制设备,提升温室大棚监控系统的智能化和自动化程度。
-
一、概述智能井盖是一种通过物联网技术实现对井盖状态监测和管理的设备。当前介绍基于STM32微控制器,BC26 NBIOT模组以及华为云IOT平台设计一款智能井盖系统。该系统通过光线传感器、霍尔传感器、温湿度传感器等设备实现井盖状态的实时监测,通过NBIOT网络将数据上传到华为云IOT平台,再通过云平台下发控制指令实现远程管理。应用场景智能井盖系统可以广泛应用于城市管理、交通建设等领域,其中具体应用场景包括:(1)实时监测井盖状态,及时发现井盖开放或异常情况,提高城市管理的效率和安全性;(2)提供实时环境监测数据,帮助提升城市环境监测能力;(3)利用NBIOT网络和华为云平台的远程控制功能,可以实现智能井盖的开关控制和监管,避免人工操作不便和监管不到位引起的危险。二、硬件设计本系统的硬件设计主要包括传感器模块和控制模块两部分,其中传感器模块主要负责采集井盖状态信息,控制模块则负责数据处理和通信。【1】传感器模块(1)光线传感器:光线传感器用于感知井盖上方光线强度,判断井盖是否露出地面。当井盖被遮住时,光线传感器输出低电平;当井盖暴露在外时,光线传感器输出高电平。(2)霍尔传感器:霍尔传感器用于感知井盖状态(开/关),当井盖开启时,霍尔传感器输出高电平;当井盖关闭时,霍尔传感器输出低电平。(3)温度传感器和湿度传感器:温度传感器和湿度传感器用于感知井盖下方的环境温湿度,实时反馈给系统,便于监测井盖下方环境状况。【2】控制模块(1)STM32微控制器:使用STM32F103C8T6微控制器,主要负责传感器数据采集、处理和控制模块与NBIOT模组之间的通信。(2)BC26 NBIOT模组:使用BC26 NBIOT模组,通过NBIOT网络将采集到的井盖状态数据上传到华为云IOT平台,同时支持远程控制井盖开关。(3)LED指示灯:采用不同颜色的LED指示灯,将井盖状态(开/关、异常、低电量)实时反馈给用户。软件设计 软件设计主要包括STM32微控制器程序设计和华为云IOT平台开发两部分。STM32微控制器程序设计: 主要包括三个模块:传感器采集模块、数据处理模块和通信模块。其中传感器采集模块负责采集传感器数据并进行处理;数据处理模块根据采集的数据进行逻辑处理,判断井盖状态;通信模块负责与NBIOT模组之间的通信,将处理后的数据上传至华为云IOT平台。三、华为云IOT平台开发在华为云IOT平台上,需要进行设备接入、数据模型定义、规则引擎配置和应用开发等四个核心模块的开发。其中,设备接入模块包括设备注册、获取设备证书、建立连接等步骤,以保障设备与云平台之间的安全通信;数据模型定义模块需要根据实际需求定义相应的数据模型,包括上传数据格式、设备属性和服务等。规则引擎配置模块需要完成实时消息推送、远程控制和告警等功能。应用开发模块则是将完整的智能井盖系统进行打包,为用户提供统一的操作接口。华为云官网: cid:link_6打开官网,搜索物联网,就能快速找到 设备接入IoTDA。3.1 物联网平台介绍华为云物联网平台(IoT 设备接入云服务)提供海量设备的接入和管理能力,将物理设备联接到云,支撑设备数据采集上云和云端下发命令给设备进行远程控制,配合华为云其他产品,帮助我们快速构筑物联网解决方案。使用物联网平台构建一个完整的物联网解决方案主要包括3部分:物联网平台、业务应用和设备。物联网平台作为连接业务应用和设备的中间层,屏蔽了各种复杂的设备接口,实现设备的快速接入;同时提供强大的开放能力,支撑行业用户构建各种物联网解决方案。设备可以通过固网、2G/3G/4G/5G、NB-IoT、Wifi等多种网络接入物联网平台,并使用LWM2M/CoAP、MQTT、HTTPS协议将业务数据上报到平台,平台也可以将控制命令下发给设备。业务应用通过调用物联网平台提供的API,实现设备数据采集、命令下发、设备管理等业务场景。3.2 开通物联网服务地址: cid:link_4开通标准版免费单元。开通之后,点击总览,查看接入信息。 我们当前设备准备采用MQTT协议接入华为云平台,这里可以看到MQTT协议的地址和端口号等信息。总结: 端口号: MQTT (1883)| MQTTS (8883) 接入地址: a3433ab133.iot-mqtts.cn-north-4.myhuaweicloud.com复制根据域名地址得到IP地址信息: Microsoft Windows [版本 10.0.19044.2846] (c) Microsoft Corporation。保留所有权利。 C:\Users\11266>ping a3433ab133.iot-mqtts.cn-north-4.myhuaweicloud.com 正在 Ping a3433ab133.iot-mqtts.cn-north-4.myhuaweicloud.com [121.36.42.100] 具有 32 字节的数据: 来自 121.36.42.100 的回复: 字节=32 时间=37ms TTL=31 来自 121.36.42.100 的回复: 字节=32 时间=37ms TTL=31 来自 121.36.42.100 的回复: 字节=32 时间=36ms TTL=31 来自 121.36.42.100 的回复: 字节=32 时间=37ms TTL=31 121.36.42.100 的 Ping 统计信息: 数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失), 往返行程的估计时间(以毫秒为单位): 最短 = 36ms,最长 = 37ms,平均 = 36ms C:\Users\11266>复制MQTT协议接入端口号有两个,1883是非加密端口,8883是证书加密端口,单片机无法加载证书,所以使用1883端口比较合适。 接下来的ESP8266就采用1883端口连接华为云物联网平台。3.3 创建产品(1)创建产品点击右上角创建产品。(2)填写产品信息根据自己产品名字填写,设备类型选择自定义类型。(3)添加自定义模型产品创建完成之后,点击进入产品详情页面,翻到最下面可以看到模型定义。模型简单来说: 就是存放设备上传到云平台的数据。比如:环境温度、环境湿度、环境烟雾浓度、火焰检测状态图等等,这些我们都可以单独创建一个模型保存。3.4 添加设备产品是属于上层的抽象模型,接下来在产品模型下添加实际的设备。添加的设备最终需要与真实的设备关联在一起,完成数据交互。(1)注册设备点击右上角注册设备。(2)根据自己的设备填写在弹出的对话框里填写自己设备的信息。根据自己设备详细情况填写。(3)保存设备信息创建完毕之后,点击保存并关闭,得到创建的设备密匙信息。该信息在后续生成MQTT三元组的时候需要使用。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_2、业务流程:(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_2对于设备而言,一般会订阅平台下发消息给设备 这个主题。设备想接收平台下发的消息,就需要订阅平台下发消息给设备 的主题,订阅后,平台下发消息给设备,设备就会收到消息。(4)主题发布格式对于设备来说,主题发布表示向云平台上传数据,将最新的传感器数据,设备状态上传到云平台。这个操作称为:属性上报。帮助文档地址:cid:link_13.6 MQTT三元组MQTT协议登录需要填用户ID,设备ID,设备密码等信息,就像我们平时登录QQ,微信一样要输入账号密码才能登录。MQTT协议登录的这3个参数,一般称为MQTT三元组。接下来介绍,华为云平台的MQTT三元组参数如何得到。(1)MQTT服务器地址要登录MQTT服务器,首先记得先知道服务器的地址是多少,端口是多少。帮助文档地址:cid:link_0MQTT协议的端口支持1883和8883,它们的区别是:8883 是加密端口更加安全。但是单片机上使用比较困难,所以当前的设备是采用1883端口进连接的。根据上面的域名和端口号,得到下面的IP地址和端口号信息: 如果设备支持填写域名可以直接填域名,不支持就直接填写IP地址。 (IP地址就是域名解析得到的) 华为云的MQTT服务器地址:121.36.42.100 华为云的MQTT端口号:1883复制(2)生成MQTT三元组华为云提供了一个在线工具,用来生成MQTT鉴权三元组: cid:link_3打开这个工具,填入设备的信息(也就是刚才创建完设备之后保存的信息),点击生成,就可以得到MQTT的登录信息了。下面是打开的页面:3.7 参考案例华为云平台部署开发也可以参考这里:cid:link_5【基于华为云IOT平台实现多节点温度采集(STM32+NBIOT)】四、读取烟雾气体浓度【1】MQ2传感器以下是一个读取MQ2传感器数据,并转换为烟雾浓度的示例代码, #include "stm32f10x.h" #include int main(void) { // 初始化ADC ADC_InitTypeDef ADC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; ADC_InitStructure.ADC_ScanConvMode = DISABLE; ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStructure.ADC_NbrOfChannel = 1; ADC_Init(ADC1, &ADC_InitStructure); // 配置ADC通道1的GPIO引脚 GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; GPIO_Init(GPIOA, &GPIO_InitStructure); // 启动ADC校准 ADC_Cmd(ADC1, ENABLE); ADC_ResetCalibration(ADC1); while (ADC_GetResetCalibrationStatus(ADC1)); ADC_StartCalibration(ADC1); while (ADC_GetCalibrationStatus(ADC1)); // 读取ADC值 ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_28Cycles5); ADC_SoftwareStartConvCmd(ADC1, ENABLE); while (!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)); uint16_t adc_value = ADC_GetConversionValue(ADC1); // 计算烟雾浓度 float voltage = (float)adc_value / 4096.0f * 3.3f; float density = (voltage - 0.4f) / 0.4f * 10000.0f; // 打印出烟雾浓度 printf("MQ2 Smoke Density: %.2f ppm\n", density); } float adc_average() { const int num_discarded = 3; // 剔除的最大/最小值数量 float samples[20]; // 存储采样结果的数组 // 采集数据 for (int i = 0; i < num_samples; i++) { samples[i] = ADC_GET(); } // 对采样结果进行排序(升序) for (int i = 0; i < num_samples - 1; i++) { for (int j = i + 1; j < num_samples; j++) { if (samples[i] > samples[j]) { float temp = samples[i]; samples[i] = samples[j]; samples[j] = temp; } } } // 计算剩下的平均值 float sum = 0; for (int i = num_discarded; i < num_samples - num_discarded; i++) { sum += samples[i]; } return sum / (num_samples - 2 * num_discarded); // 返回计算结果 }【2】MQ4传感器以下是基于HAL库的STM32F103ZET6读取MQ4烟雾传感器的代码: #include "gpio.h" /* MQ4传感器的引脚定义 */ #define MQ4_PORT GPIOA #define MQ4_PIN GPIO_PIN_0 /* MQ4传感器的校准电压 */ #define MQ4_RL_VALUE 10 // RL值为10kΩ #define MQ4_CALCULATE_RO_CLEAN(adcValue) ((float)(RL_VALUE*(4096-adcValue)/adcValue)) /* 获取MQ4传感器的数据 */ float get_mq4_value() { uint32_t adc_value = HAL_ADC_GetValue(&hadc1); float ro = MQ4_CALCULATE_RO_CLEAN(adc_value); float sensor_volt = HAL_ADC_GetValue(&hadc2) * (3.3 /4096.0); float sensor_rsr = (3.3 - sensor_volt) / sensor_volt * ro; float mq4_ppm = pow(10, ((log10(sensor_rsr / 2.5) - 0.3420) / (-0.6162))); return mq4_ppm; } /* 主函数 */ int main() { HAL_Init(); MX_GPIO_Init(); MX_ADC1_Init(); MX_ADC2_Init(); /* 读取MQ4传感器数据 */ float mq4_value = get_mq4_value(); printf("MQ4传感器值:%.2f PPM\r\n", mq4_value); while (1); }在该示例代码中,我们用到了ADC1和ADC2来分别读取MQ4传感器的数据引脚和校准电压。函数get_mq4_value()中使用了MQ4传感器的电路计算公式,将读取的传感器数据转化成对应的PPM值。五、总结当前文章介绍基于STM32微控制器、BC26 NBIOT模组和华为云IOT平台,实现了一款智能井盖系统。该系统通过多种传感器实现了井盖状态的实时监测和数据上传,在应用上具有重要的应用场景和实际应用价值。整体介绍了系统硬件和软件设计的各个环节,对相关产品的开发提供了一定的参考价值和设计思路。
上滑加载中
推荐直播
-
华为云码道Agent集成与鸿蒙实战2026/08/11 周二 19:00-21:00
王一男-华为云码道产品规划专家;李炎-华为云码道产品专家;彭江敏-华为云鸿蒙端云一体化开发专家
本次直播带你解读华为云码道7月份产品新特性、新功能。更有专家演示码道Agent Space × 钉钉机器集成实战,从0到1打通消息通道;码道鸿蒙端云一体化实战,快速搭建员工签到系统。
回顾中 -
华为云开发者AI素养直播课·第五期2026/09/04 周五 16:00-18:00
林华鼎-华为云AI开发者运营负责人;蒋春阳-华为云AI开发者案例开发专家
本期直播内容: AI工具体验营 · 第5-8课连讲。Agent-Team 多智能体协作完成毕业设计实践
回顾中 -
华为云开发者AI素养ClassRoom·第六期2026/09/08 周二 19:00-20:00
樊渊-2026华为软件挑战赛冠军
高手来了:看软挑高手解析二维排样问题—从工业难题到算法突破
回顾中
热门标签