基于STM32+OneNet设计的物联网智慧路灯

一、前言

近年来,构筑智慧城市、推动城镇发展被国家列入重要工作范畴。发布的《超级智慧城市报告》显示,全球已启动或在建的智慧城市有1000多个,中国在建500个,远超排名第二的欧洲(90个)。从在建智慧城市的分布来看,我国已初步形成环渤海、长三角、珠三角、中西部四大智慧城市群。

智慧路灯将以道路照明灯杆为基础,整合公安、交通信号、通信、交通标识牌等为一体,实现多杆合一,减少路面立杆,释放公共空间资源。同时,作为智慧城市建设的重要载体,智慧路灯将作为物联网的端口,发挥更大的“综合体”作用。作为城市中分布最为密集且均匀的信息基础设施,路灯杆被认为是5G基站室外覆盖较优的载体,在智慧城市、5G基站建设的推动下,将逐步由单一照明功能变成新型公共基础设施。

基于STM32+OneNet设计的物联网智慧路灯_第1张图片

二、设计需求

本次设计的智慧路灯支持以下功能:

(1) 采用锂电池供电

(2) 支持太阳能充电

(3) 可连接物联网平台

(4) 具有GPS定位功能,可以上传当前的位置信息到物联网平台。

(5) 支持手动控制路灯开关

(6) 支持设置自动开关时间段,设置自动模式,定时模式等功能

(7) 支持采集环境光照、环境湿度上传到物联网平台。

(8) 通过环境光调整光照强度。

(9) 支持红外传感器,可以判断周围是否有人控制路灯的光亮强度

(10) 支持空气质量检测(MQ135传感器)

(11) 路灯发生异常情况之后,可以自动发送邮件到指定邮箱,也可以选择发送短信(不过目前选择的模块是内置电信卡,这个卡只能用来联网,如果要发短信需要插自己的电话卡进去就可以实现短信发送)。

(12) 物联网云平台采用onenet云平台

(13) 可视化界面,采用onenet可视化组件设计,支持手机和电脑打开。

与物联网云平台交互的数据信息如下:

电压信息、GPS经纬度、路灯开关状态、环境温度、湿度、光照度、空气质量、路灯状态、自动开关时间信息。

本次设计的智能路灯采用STM32芯片和OneNet物联网平台进行连接,开发出支持太阳能充电锂电池供电、GPS定位上传位置信息、手动/自动控制路灯开关、环境光照调节、红外传感器检测周围人员、空气质量监测等多项功能。同时,当路灯发生异常情况时,系统可以自动发送邮件或短信到指定邮箱或电话。

通过OneNet物联网平台,我们可以实现对多种信息(如电压、GPS经纬度、路灯状态、环境温度湿度等)的实时监测,并且借助可视化组件,使得用户可以随时随地通过手机或电脑端访问和管理整个路灯系统。

本设计创新之处在于,它采用了STM32芯片作为主控制器,支持多种功能,并且与OneNet平台实现无缝对接,实现了智慧路灯的全面升级。

三、硬件选型

3.1 STM32系统板

主控CPU采用STM32F103ZET6。采用野火的核心板。

基于STM32+OneNet设计的物联网智慧路灯_第2张图片

3.2 温湿度传感器

DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。它应用专用的数字模块 采集技术和温湿度传感技术,确保产品具有可靠性与卓越的长期稳定性,成本低、相对湿度和温度测 量、快响应、抗干扰能力强、信号传输距离长、数字信号输出、精确校准。传感器包括一个电容式感湿 元件和一个NTC测温元件,并与一个高性能8位单片机相连接。可用于暖通空调、除湿器、测试及检测设 备、消费品、汽车、自动控制、数据记录器、气象站、家电、湿度调节器、医疗、其他相关湿度检测控 制。

特点如下:

1、可以检测周围环境的湿度

2、可以检测周围环境的温度

3、湿度测量范围:20%-95%(0度-50度范围)湿度测量误差:±5%

4、温度测量范围:o度-50度温度测量误 差:±2度

5、工作电压3.3V-5V

6、输出形式数字输出

淘宝链接:https://detail.tmall.com/item.htm?id=15598344236&ali_refid=a3_430582_1006:1104520036:N:TAiHo9GD8eTurMzH21/csQ==:a9713f529e04b83568179509c64f1d18&ali_trackid=1_a9713f529e04b83568179509c64f1d18&spm=a230r.1.14.1&skuId=4835521242382

基于STM32+OneNet设计的物联网智慧路灯_第3张图片

3.3 大功率LED灯(当做路灯灯泡)

参数如下:

产品名称 LED模块
正向电流 3W/650MA
正向电压 3.2-3.6V(红光/黄光电压为2.0-2.6V)
方向电压 5V
工作电压 3V
功率 3W
发光角度 12-140度
工作温度 -20-60度
储存温度  20-60度
高度衰减 工作5000小时后3%
寿命 约50,000小时
正白 6000-6500K
暖白 3000-3300K
红光波长 620-630NM
绿光波长 520-525NM
蓝光波长 450-455NM
黄光波长 590-595NM

淘宝链接:https://detail.tmall.com/item.htm?spm=a230r.1.14.16.6fdc2b59CwQkxZ&id=536336613714&ns=1&abbucket=6&skuId=3764844880397

基于STM32+OneNet设计的物联网智慧路灯_第4张图片

3.4 环境光检测传感器

BH1750FVI是一种用于两线式串行总线接口的数字型光强度传感器集成电路。这种集成电路可以根据收集的光线强度数据来调整液晶或者键盘背景灯的亮度。利用它的高分辨率可以探测较大范围的光强度变化。

bh1750传感器有接近视觉灵敏度的光谱灵敏度特性,它支持I2CBUS接口,支持1.8v逻辑输入接口。传感器有两种可选的I2Cslave地址,无需其他外部件。光源依赖性弱,受红外线影响很小。传感器通过降低功率功能,实现低电流化。通过50Hz/60Hz除光噪音功能实现稳定的测定,最小误差变动在±20%。

模块封装信息:

尺寸: 13.9mm X 18.5mm
采用ROHM原装BH1750FVI芯片
供电电源 3-5v
数据范围: 0-65535 ,
传感器内置16bitAD转换器
直接数字输出,省略复杂的计算,省略标定
不区分环境光源
接近于视觉灵敏度的分光特性
可对广泛的亮度进行1勒克斯的高精度测定

BH1750的特点描述:

1.支持IICBus接口。
2.接近视觉灵敏度的光谱灵敏度特性(峰值灵敏度波长典型值:560nm)3.输出对应亮度的数字值。
4.对应广泛的输入光范围(相当于1-65535lx)5.通过降低功率功能,实现低电流化。
6.通过5OHz/6OHz除光噪音功能实现稳定的测定。
7.支持1.8V逻辑输入接口。
8.无需其他外部件。
9.光源依赖性弱(白炽灯,荧光灯,卤素灯,白光 LED,日光灯)10.有两种可选的C slave地址。
11.可调的测量结果影响较大的因素为光入口大小。
12.使用这种功能能计算1.1 lx到100000 lx马克斯/分钟的范围。

基于STM32+OneNet设计的物联网智慧路灯_第5张图片

**淘宝链接:**https://detail.tmall.com/item.htm?spm=a230r.1.14.1.52c57d40Gnt5VA&id=543135220776&ns=1&abbucket=9

3.5 人体感应-热释电模块

此模块灵敏度高,响应速度快,静态功耗小,体积小巧,易于安装,已装好透镜,已焊接好排针,上电源无需调试。可用于人体感应灯,报警器,安防,门禁,农林矿业自动设备等。

模块特点:

1、本产品输出的高电平时间可调,2.5秒到1小时,出厂时设定的输出时间是2.5秒,如需更改,可更改一个贴片电阻。
2、封锁时间,2秒,不可调节
3、出厂定义为可重复触发,无法变更
4、本模块的供电电压是3.3V到15V,极限电压是2. 8V到18V5
5、模块的输出时序是:.上电后输出高电平2秒,然后变为低电平,进入待机状态。若更改延时时间,模块上电后输出高电平的时间会相应增长,可理解为上电后进入正常工作状态的启动时间会增长。
6、装上光敏元件后,白天不工作,晚上工作;不装光敏元件,全天工作(黑认是没有装光敏元件的)
7、此模块很灵敏,注意安装位置,尽量避开热源辐射源(出风/阳光直射)_
8、本模块灵敏度可调,需要更改一个贴片电阻
9、使用接220V普通烙铁焊接时,需拨下电源后才可进行焊接,建议使用24V低压烙铁,如国产白光936

淘宝链接:https://detail.tmall.com/item.htm?spm=a230r.1.14.13.34882459fJHEXK&id=639845813011&ns=1&abbucket=9

基于STM32+OneNet设计的物联网智慧路灯_第6张图片

3.6 MQ135空气质量传感器

淘宝链接:https://detail.tmall.com/item.htm?spm=a230r.1.14.28.21af59b3C4ajv0&id=13302081252&ns=1&abbucket=12

MQ135气体传感器所使用的气敏材料是在清洁空气中电导率较低白二氧化锡(Sno2)。当传感器所处环境中存在污染气体时,传感器的电导率随空气中污染气体浓度的增加而增大。使用简单的电路即可将电导率的变化转换为与该气体浓度相对应的输出信号。

MQ135传感器对氨气、硫化物、苯系蒸汽的灵敏度高,对烟雾其它有害的监测也很理想。这种传感器可以检测多种有害气体,是一款适合多种应用的低成本传感器。

3.7 4G模块(有人科技)

**特点:**在2G退、4G贵、NB慢的趋势下,采用全新网络制式推出的4G DTU透传插针模块-WH-LTE-7S1系列,为中低速物联网通讯提供全新解决方案,在速率、延迟、功耗和成本等方面,为用户提供多样选择。

最大的优点:

(1)价格便宜(目前因为活动价便宜),一个BC26-NBIOT模块价格都在80块以上。

(2)内置电信卡,不需要单独插卡,买卡,内置卡每月100M流量连送8年,可以满足一般的物联网场景。

淘宝链接: https://detail.tmall.com/item.htm?spm=a1z0d.6639537/tb.1997196601.85.6a9c7484yYf4a8&id=628534515942&skuId=4869817103232

基于STM32+OneNet设计的物联网智慧路灯_第7张图片

3.8 天线(4G模块使用)

天线是给4G模块使用的,增加信号强度。

链接:https://detail.tmall.com/item_o.htm?spm=a220o.1000855.1998099587.6.63774fccKuAj30&releaseId=318828&bucketId=447258&id=542210401917&skuId=4669143950776

基于STM32+OneNet设计的物联网智慧路灯_第8张图片

3.9 太阳能充电模块

这款模块有三种输入电压6V 9V 12V,分别对应太阳能电池板工作电压(标称电压)6V 9V 12V这是用于
单节锂电池限大功率点跟踪(MPPT)的太阳能充电器。

这款MPPT太阳能充电器使你能够从太阳电池板或其他光伏设备中获取尽可能多的电能,并装入可充电的锂
电池中。使用非常容易,只需将太阳能电池板插入太阳能充电器的一侧,然后将电池插入另一侧,就可以开始
充电了!

太阳能限大功率点跟踪(MPPT)是为了确保光强度发生变化,光伏电池输出限大功率,以充分利用太阳。

通常,需要使用开关模式的DC- DC转换器来实现MPPT功能,保持输出电压和充电电流乘积限大化(输出)。

太阳能充电器的输出只在为单个聚合物锂离子电池充电。负载应与电池并联。每个太阳能充电器都配备有
CN379 1功率跟踪电池充电电路,并预装了四个2针JST/PH2.0连接器。

链接:
https://detail.tmall.com/item.htm?spm=a230r.1.14.16.34b07b3ejBdBA2&id=609864362456&ns=1&abbucket=9&skuId=4457102119754

基于STM32+OneNet设计的物联网智慧路灯_第9张图片

基于STM32+OneNet设计的物联网智慧路灯_第10张图片

3.10 3.7V锂电池

链接:https://item.taobao.com/item.htm?spm=a230r.1.14.143.3d3f1249n70Lfa&id=608055464577&ns=1&abbucket=20#detail

基于STM32+OneNet设计的物联网智慧路灯_第11张图片

3.11 太阳能板

太阳能滴胶板是太阳能电池板的一种,只是封装方式不同。通过把太阳能电池片激光切割成小片,做出需求的电压与电流,再进行封装。因尺寸较小,一般不采用类似太阳能光伏组件那样的封装方式,而是用环氧树脂覆盖太阳能电池片,与PCB线路板粘结而成,具有生产速度快,抗压耐腐蚀,外观晶莹漂亮,成本低等特点。

链接:https://detail.tmall.com/item_o.htm?spm=a1z10.3-b-s.w4011-16538328900.30.1ecf3d6c4mwhyQ&abbucket=18&releaseId=318828&bucketId=447258&id=564409283491&rn=4259268cfd9ff54cacc537ed7ce8c7af&skuId=4686596799270

基于STM32+OneNet设计的物联网智慧路灯_第12张图片

串联的接线方式

为了提高输出电压,可以采用两块或更多的电池板串联使用。串联电流不变,电压是串联块数的倍数。
例如: 2块5V 160MA的电池板串联输出的电压就是10V 160MA。

基于STM32+OneNet设计的物联网智慧路灯_第13张图片

并联的接线方式

电压满足的情况下,为了增加电流,加快充电速度,可以采用两块或者更多的太阳能板并联,并联时电压不变,
电流是电压块数的倍数。

基于STM32+OneNet设计的物联网智慧路灯_第14张图片

基于STM32+OneNet设计的物联网智慧路灯_第15张图片

基于STM32+OneNet设计的物联网智慧路灯_第16张图片

太阳能板使用的常见问题

1、太阳能板能给手机、充电宝充电吗?
可以。现在的手机电池容量越做越大,建议选配电流在1A以 上的6V太阳能板。而且要搭配稳压模块才能正常使用。

2、太阳能板能储电吗?
不能。一般需要搭配电池才能储电。

3、太阳能板阴天能发电吗?灯光下能发电吗?
不能。阴天发电量很小很小,通常有电压没有电流。灯光下不能发电。


4、买回去的太阳能板该怎么使用?
首先要了解下太阳能发电板的工作原理,需要结合太阳能发电板和电池的关系来选配合适的电池。根据负载确定电池容量、电压等等。
其次,学会使用太阳能需要不断改进。比方后期会增加电池,增加太阳能发电板等等,不断修改来完善自己的DIY太阳能设计方案。

5、太阳能板的应用有哪些?
太阳能灯,太阳能充电宝,太阳能玩具,太阳能水泵,太阳能增氧机等等,只要是需要直流动力的地方,都可以用太阳能作为充电方案。

3.12 GPS模块

ATGM336H-5N系列模块是小尺寸的高性能BDS/GNSS全星座定位 导航模块系列的总称。

该系列模块产品都是基于中科微第四代低功耗GNSS SOC单芯片—AT6558,支持多种卫星导航系统,包括中国的BDS(北斗卫星 导航系统),美国的GPS,俄罗斯的GLONASS,欧盟的GALILEO,日本的QZSS 以及卫星增强系统SBAS(WAAS,EGNOS,GAGAN,MSAS)。AT6558 是一 款真正意义的六合一多模卫星导航定位芯片,包含32 个跟踪通道,可以同时接 收六个卫星导航系统的GNSS 信号,并且实现联合定位、导航与授时。 ATGM336H-5N本系列模块具有高灵敏度、低功耗、低成本等优势,适用于 车载导航、手持定位、可穿戴设备,可以直接替换Ublox MAX系列模块。

链接:https://item.taobao.com/item.htm?spm=a230r.1.14.6.5b1b181cu1Q08x&id=550058686581&ns=1&abbucket=9#detail

基于STM32+OneNet设计的物联网智慧路灯_第17张图片

3.13 杜邦线(2份)

链接:https://detail.tmall.com/item.htm?id=14466195609&ali_refid=a3_430582_1006:1104520036:N:MsF9mE9KLTC2IibWJh+K1A==:0395c662ef512f1b59b31b906608d31b&ali_trackid=1_0395c662ef512f1b59b31b906608d31b&spm=a230r.1.14.1&skuId=3936936817454

基于STM32+OneNet设计的物联网智慧路灯_第18张图片

3.14 PCB板

链接:https://detail.tmall.com/item.htm?spm=a230r.1.14.34.16b221829wBwAI&id=525489414251&ns=1&abbucket=9&skuId=3929211749440

基于STM32+OneNet设计的物联网智慧路灯_第19张图片

三、知识点科普

(1)如何准确测量锂离子电池中的剩余电量?

1、电压测试法:通过简单地监控锂离子电池的电压得到的数据,然后根据电压变化来显示锂离子电池大概剩余电量,不过锂离子电池的电量和电压并不是规律的线性关系,所以电量测量精度并不高。

2、锂离子电池建模法:根据锂离子电池的放电曲线来建立一个数据表,数据表会标明不同电压下的电量值,这一方法可以明显的提高测量的精度。手机厂商要经过大量的测试才能得到这一数据,而且锂离子电池的电压和电量的关系还涉及到锂离子电池的温度、自放电、老化等因素,所以这种方法是最不可行的。

3、库仑计:在锂离子电池的回路上串联一个电量计量芯片,通过电假如对所有电池的充、放电流进行积分就可以得出剩余电量的大小,当锂离子电池刚充好电并且已知是完全充电时使用电流积分方法效果非常好。这种方法被成功地运用于当今众多的电池电量监测过程中。

以电压为基础的方法属于最早应用的方法之一,它仅需测量电池两级间的电压。基于锂离子电池电压和剩余电量之间存在的某种已知关系,当施加负载时锂离子电池电压就会因为锂离子电池内部阻抗所引起的压降而出现失真。此外即使去掉了负载,发生在锂离子电池内部的张持过程也会在数小时内造成电压的持续变化,实际的充电过程中温度、放电速率以及电池老化等众多因素都会影响充电状态。

(2)太阳能充电的原理?

现在全世界都面临着能源问题,传统能源的逐渐枯竭,加上传统能源对环境的污染使开发新能源变成了一件迫在眉睫的是。环保的新能源越来越受到重视, 太阳能 就是一种取之不尽用之不竭的新能源,而且还是一种环保能源,几乎是0污染。

太阳能发电的原理是根据爱因斯坦的光电效应。即光子像弹珠一样的粒子,照射到太阳能电池板上,将其上的电子打出来,太阳能电池板上就形成了空穴(硅原子少了一个电子留下的带正电的空位),当空穴附近的电位来"填空"时,就会形成所谓"空穴电流",这样电能就产生了。

目前,经典的太阳能发电就这种方式,提高效率是通过太阳光过滤器,收集频率高的光子(最好是紫外光),然后再用集中器将空中散漫的高频光子富集起来,照射在高效太阳能电池板上。

太阳能发电收取能量的方式通常有两种:

1、光—热—电转换方式:就是利用太阳辐射产生的热能发电的一个过程,它一般是由太阳能集热器将所吸收的热能转换成工质蒸气,再驱动汽轮机发电。前一个过程是光—热转换过程,后一个过程就是热—电转换过程,它热—电转换过程与普通的火力发电一样。

2、光—电直接转换方式:利用光电效应将太阳辐射能直接转换成电能,其基本装置就是太阳能电池板。太阳能电池板是利用光生伏特效应而将太阳光能直接转化为电能的设备,属于半导体光电 二极管 ,当太阳光照到光电二极管上时,光电二极管就会把太阳光能变成电能,从而产生电流。当多个太阳能电池板串联或并联就可成为有较大输出功率的太阳能电池方阵。

四、OneNet平台部署

OneNET是中国移动打造的高效、稳定、安全的物联网开放平台。OneNET支持适配各种网络环境和协议类型,可实现各种传感器和智能硬件的快速接入,提供丰富的API和应用模板以支撑各类行业应用和智能硬件的开发,有效降低物联网应用开发和部署成本,满足物联网领域设备连接、协议适配、数据存储、数据安全以及大数据分析等平台级服务需求。

OneNET主要功能如下:

(1)设备接入

支持多种行业及主流标准协议的设备接入,提供如NB-IoT(LWM2M)、MQTT、EDP、Modbus、HTTP等物联网套件,满足多种应用场景的使用需求。
提供多种语言开发SDK,帮助开发者快速实现设备接入。
支持用户协议自定义,通过TCP透传方式上传解析脚本来完成协议的解析。

(2)数据可视化View

免编程,可视化拖拽配置,10分钟完成物联网可视化大屏开发。
提供丰富的物联网行业定制模版和行业组件。
支持对接OneNET内置数据、第三方数据库、Excel静态文件多种数据源。
自动适配多种分辨率的屏幕,满足多种场景使用。

4.1 产品创建

官网地址:https://open.iot.10086.cn/

帮助文档地址: https://open.iot.10086.cn/doc/v5/develop/detail/easy-manual

(1)登录控制台

先登录。

基于STM32+OneNet设计的物联网智慧路灯_第20张图片

然后进入控制台页面。

基于STM32+OneNet设计的物联网智慧路灯_第21张图片

(2)选择接入方式: MQTT

选择MQTT物联网套件。

基于STM32+OneNet设计的物联网智慧路灯_第22张图片

(3)添加产品

基于STM32+OneNet设计的物联网智慧路灯_第23张图片

(4)设置产品信息

根据自己产品的类型,联网方式,填写信息。

基于STM32+OneNet设计的物联网智慧路灯_第24张图片

基于STM32+OneNet设计的物联网智慧路灯_第25张图片

点击确定后,产品创建成功。

(5)平台接入地址

在这里可以看到MQTT协议接入平台时,填入的服务器IP和端口号。‘

文档地址: https://open.iot.10086.cn/doc/v5/develop/detail/248

基于STM32+OneNet设计的物联网智慧路灯_第26张图片

MQTTS 接入套件支持标准 MQTT V3.1.1 版本,支持TLS加密,接入服务地址如下:

MQTT	mqttstls.heclouds.com	8883	加密接口
MQTT	mqtts.heclouds.com   	1883	非加密接口

对于单片机而言,使用非加密接口比较方便。本次项目就采用的是非加密接口。 端口号是1883。

上面的域名转为IP之后信息如下:(如果设备不支持域名解析,可以直接填IP地址)
IP地址: 183.230.40.96
端口号: 1883

(6)产品ID和key

产品ID:  555205
access_key  :   haSZry0UNPwBY/S2pFKk52sct4rdc2Fse8y9WMuiXco=

4.2 设备创建

(1)添加设备

点击立即添加设备按钮。

基于STM32+OneNet设计的物联网智慧路灯_第27张图片

基于STM32+OneNet设计的物联网智慧路灯_第28张图片

(2)设置设备信息

一个产品模型下,可以添加多个设备,我这里只有一套路灯硬件,就创建一个设备就OK了。

基于STM32+OneNet设计的物联网智慧路灯_第29张图片

(3)查看设备详情

添加完设备之后,点击详情可以查看设备的详细信息。

基于STM32+OneNet设计的物联网智慧路灯_第30张图片

设备ID和设备的key,后续作为设备的鉴权。

基于STM32+OneNet设计的物联网智慧路灯_第31张图片

(4)设备ID和key

设备ID    1013157599
key       U8qsJoWEbg8BJcTVrMKS+gEd7m1COjmq7tIIjpwNXek=
设备描述  智慧路灯设备1

4.3 设备数据流创建

数据流就是存储设备上传的数据,一般一个设备数据对应一个数据流。这个数据流是JSON格式的,所以创建的时候不用设置数据的类型。 一个数据流也可以存放多个数据,在显示的时候使用过滤器提取出来就行。

(1)添加数据流模板: 环境数据

基于STM32+OneNet设计的物联网智慧路灯_第32张图片

路灯本身需要上传多个数据(电量、温度、湿度、光照强度、异常情况等等),为了方便后面数据扩展或改动,设备在上传的时候可以将这些数据通过JSON格式都放在一个数据点里保存上传。在可视化界面,或者其他场景需要提取数据时,直接解析JSON数据即可。

基于STM32+OneNet设计的物联网智慧路灯_第33张图片

(2)添加数据流模板: 路灯控制

路灯还需要下发控制指令,实现远程控制,单独添加一个数据流来保存路灯的开关状态。

基于STM32+OneNet设计的物联网智慧路灯_第34张图片

(3)添加数据流模板: 时间设置

路灯需要支持时间设置下发,控制路灯开关的时间段,根据目前市面上的路灯遥控器调研。一般路灯支持自动模式,定时模式,比如:3,5,8小时的设置,支持光的亮度加减调整。

基于STM32+OneNet设计的物联网智慧路灯_第35张图片

(4)添加完毕

一共添加3个数据流模板。

基于STM32+OneNet设计的物联网智慧路灯_第36张图片

4.4 设备模拟登录

经过上面的步骤,产品,设备已经创建完毕;为了方便测试平台的连通性,接下来先使用MQTT客户端来模拟设备的数据上传,完成设备登录、主题订阅、主题发布等常见操作。

(1)MQTT服务器地址

这个在第一小节里已经介绍了。

MQTTS 接入套件支持标准 MQTT V3.1.1 版本,支持TLS加密,接入服务地址如下:

MQTT	mqttstls.heclouds.com	8883	加密接口
MQTT	mqtts.heclouds.com   	1883	非加密接口

对于单片机而言,使用非加密接口比较方便。本次项目就采用的是非加密接口。 端口号是1883。

上面的域名转为IP之后信息如下:(如果设备不支持域名解析,可以直接填IP地址)
IP地址: 183.230.40.96
端口号: 1883

(2)下载密匙生成工具

地址: https://open.iot.10086.cn/doc/v5/develop/detail/242

点击进行下载。

基于STM32+OneNet设计的物联网智慧路灯_第37张图片

这是工具打开的页面:

基于STM32+OneNet设计的物联网智慧路灯_第38张图片

工具软件里需要填写的参数如下:

1】res选项参数的格式: products/{产品ID}/devices/{设备名称}2】et是设置token过期时间:算出1970-1-1到你想要设置的到期时间,单位是秒,填入即可。
比如: 超时时间设置为2022-4-7,那么,这里填入的秒就是:1970-1-12022-4-7之间的秒单位时间。

【3】key的参数格式: 就是设备创建之后,在设备详情页的key

(3) 生成token过期时间

下面通过C代码计算得一个时间范围:

#include 
#include 
#include 
int main()
{
	time_t time_sec;
	time_sec=time(NULL); //当前的秒单位时间--UTC时间
	printf("当前时间(秒):%ld\n",time_sec);
	printf("加一年的时间(秒):%ld\n",time_sec+12*30*24*60*60);
	return 0;
}

基于STM32+OneNet设计的物联网智慧路灯_第39张图片

基于STM32+OneNet设计的物联网智慧路灯_第40张图片

设置的过期时间-1:  1698635613
设置的过期时间-2:  2040780102

(4)密匙生成工具参数

密码生成工具软件的选项框需要填入的格式: (关于产品ID和设备key的查看方式在设备创建章节里已经讲过了)

res选项格式:products/<产品ID>/devices/<设备名字>
res选项填入:products/555205/devices/dev1
et是设置token过期时间:2040780102
设备key:U8qsJoWEbg8BJcTVrMKS+gEd7m1COjmq7tIIjpwNXek=

下面把这些参数截图标注出来,方便大家去对应寻找:

基于STM32+OneNet设计的物联网智慧路灯_第41张图片

基于STM32+OneNet设计的物联网智慧路灯_第42张图片

基于STM32+OneNet设计的物联网智慧路灯_第43张图片

(5)生成MQTT登录密匙

第一步: 填好参数

基于STM32+OneNet设计的物联网智慧路灯_第44张图片

第二步:生成密匙

基于STM32+OneNet设计的物联网智慧路灯_第45张图片

第三步,复制密匙,待用

version=2018-10-31&res=products%2F555205%2Fdevices%2Fdev1&et=2040780102&method=md5&sign=MvsNYrM4FumbXP25H0kwHA%3D%3D

(6)主题订阅格式

主题订阅是设备订阅平台的消息,如果设备想知道平台下发的消息,就需要订阅主题。

帮助文档: https://open.iot.10086.cn/doc/mqtt/book/device-develop/protocol.html

目前支持订阅的主题如下:

订阅 topic 订阅效果
$sys/{pid}/{device-name}/dp/post/json/accepted 订阅设备数据点上报成功的消息
$sys/{pid}/{device-name}/dp/post/json/rejected 订阅设备数据点上报失败的消息
$sys/{pid}/{device-name}/dp/post/json/+ 订阅设备数据点上报结果
$sys/{pid}/{device-name}/cmd/request/+ 订阅设备所有命令消息
$sys/{pid}/{device-name}/cmd/response/+/+ 订阅设备所有命令应答结果消息
$sys/{pid}/{device-name}/cmd/# 订阅设备所有命令相关消息
$sys/{pid}/{device-name}/# 订阅设备所有相关消息

如果想知道设备所有相关信息,直接订阅$sys/{pid}/{device-name}/#即可。 (其中的PID就是产品ID)

$sys/555205/dev1/#

为了确保设备上传消息确实被平台所接受处理,设备可以订阅系统 topic 获取上传数据点结果消息;

topic 命名规则如下:
$sys/{pid}/{device-name}/dp/post/json/+

本例中,订阅topic为:
$sys/555205/dev1/dp/post/json/+

(7)主题发布格式

主题发布: 就是设备向平台上传数据。

帮助文档地址:https://open.iot.10086.cn/doc/mqtt/book/example/datapoints.html

文档里介绍了数据点上传的格式:

基于STM32+OneNet设计的物联网智慧路灯_第46张图片

根据当前设备,总结的格式如下:

发布主题: $sys/555205/dev1/dp/post/json

发布消息:
{"id":123,"dp":{"dev_data":[{"v":11}],"led_button":[{"v":22}],"led_time":[{"v":33}]}}

dp对象里面就是需要上传的数据点字段。 这个数据点的名字就是自己创建数据流模板的时候创建的。

(8)MQTT登录参数总结

MQTT协议登录时,需要输入3个参数: MQTT-设备ID,MQTT-设备名称,MQTT-密码。

对应OneNet的参数:

MQTT- 设备ID  -----> 就是OneNet的设备名称

MQTT-设备名称-----> 就是OneNet的产品ID

MQTT-密码------------> 就是OneNet的密匙工具生成的密码

下面是对本次的设备做总结:

IP地址: 183.230.40.96
端口号: 1883
clientId: dev1
username: 555205
password: version=2018-10-31&res=products%2F555205%2Fdevices%2Fdev1&et=2040780102&method=md5&sign=MvsNYrM4FumbXP25H0kwHA%3D%3D


订阅主题:  $sys/555205/dev1/#


发布主题: $sys/555205/dev1/dp/post/json

发布消息:
{"id":123,"dp":{"dev_data":[{"v":11}],"led_button":[{"v":22}],"led_time":[{"v":33}]}}

(9)MQTT客户端工具登录

根据软件的输入框提示,输入对应的参数,然后登录设备,订阅主题,发布主题即可完成一个流程的测试。

基于STM32+OneNet设计的物联网智慧路灯_第47张图片

(10)登录OneNet控制台查看设备

在设备列表页面,可以看到设备已经在线了。

基于STM32+OneNet设计的物联网智慧路灯_第48张图片

在设备详情页面可以看到设备模拟器刚才上传的数据:

基于STM32+OneNet设计的物联网智慧路灯_第49张图片

(11)传递多个数据

如果设备参数有多个数据,想要一次性通过一个数据点上传,如何办到?

数据参数这样写就行了:

{"id":123,"dp":{"dev_data":[{"v":{"lon":109.73,"lat":28.28,"dht11_t":12,"dht11_h":20,"light":40,"power":80,"mq135":1234,"signal":90}}],"led_button":[{"v":1}],"led_time":[{"v":"20221104145533"}]}}

基于STM32+OneNet设计的物联网智慧路灯_第50张图片

上传之后,到网页控制台,设备详情页面查看:

基于STM32+OneNet设计的物联网智慧路灯_第51张图片

可以看到,设备的数据已经上传上来。 后续显示,可以通过数据过滤器提取数据。

到此,设备的云平台已经配置完毕。

4.5 数据可视化页面设计

为了方便控制设备,显示设备上传的数据,接下来设计一个可视化的网页。

(1)可视化页面

地址: https://open.iot.10086.cn/studio/view/project

基于STM32+OneNet设计的物联网智慧路灯_第52张图片

(2)新建项目

基于STM32+OneNet设计的物联网智慧路灯_第53张图片

选择一个空项目,新建。

基于STM32+OneNet设计的物联网智慧路灯_第54张图片

创建好之后,点击项目下面的编辑按钮,编辑项目。

基于STM32+OneNet设计的物联网智慧路灯_第55张图片

(3)设计页面

选中主页面画布之后,在右边可以设置页面的分辨率,页面名称,颜色等等,如果页面后续主要是手机上显示,可以选择移动端页面。

基于STM32+OneNet设计的物联网智慧路灯_第56张图片

(4)拖拽控件设计页面

专业版的权限可以使用全部控件,接下来就先拖拽控件,设计大致想要的页面模型。

大致设置完成的页面如下:

基于STM32+OneNet设计的物联网智慧路灯_第57张图片

(5)设置数据源

控件如果要显示设备上传的实时数据,需要指定数据的来源。我这里以温度控件为例,演示如何设置控件的数据源。

【1】选中控件,点击管理数据源

基于STM32+OneNet设计的物联网智慧路灯_第58张图片

【2】点击新增数据源

基于STM32+OneNet设计的物联网智慧路灯_第59张图片

【3】填入参数添加数据源

基于STM32+OneNet设计的物联网智慧路灯_第60张图片

【4】按照这个方式,将设备其他的数据源全部添加进来

基于STM32+OneNet设计的物联网智慧路灯_第61张图片

基于STM32+OneNet设计的物联网智慧路灯_第62张图片

【5】添加完毕

基于STM32+OneNet设计的物联网智慧路灯_第63张图片

【6】展开标签可以看到设备上传到数据源里的完整数据内容,这内容很重要,等会编写数据过滤器提取数据就需要用到。

基于STM32+OneNet设计的物联网智慧路灯_第64张图片

dev_data节点保存的完整JSON如下:

{
  "data": [
    {
      "update_at": "2022-11-04 14:56:35",
      "unit": "",
      "id": "dev_data",
      "unit_symbol": "",
      "current_value": {
        "dht11_t": 12,
        "light": 40,
        "dht11_h": 20,
        "lon": 109.73,
        "power": 80,
        "mq135": 1234,
        "lat": 28.28
      },
      "at": "2022-11-04 14:56:35",
      "value": {
        "dht11_t": 12,
        "light": 40,
        "dht11_h": 20,
        "lon": 109.73,
        "power": 80,
        "mq135": 1234,
        "lat": 28.28
      }
    }
  ],
  "type": "OneNET",
  "rate": 5,
  "nums": 1,
  "name": "dev_data",
  "authType": "secure",
  "apiKey": "haSZry0UNPwBY/S2pFKk52sct4rdc2Fse8y9WMuiXco=",
  "productId": "555205",
  "devId": "1013157599",
  "vDevId": "",
  "dsId": "dev_data",
  "vDsId": "",
  "protocol": "MQTTS",
  "id": "dev_data",
  "fields": [
    
  ],
  "refreshing": false
}

【7】回到刚才的页面就可以继续设置数据源

基于STM32+OneNet设计的物联网智慧路灯_第65张图片

(6)编写数据过滤器

设置好控件数据源之后,还需要编写数据过滤器,提取想要显示的数据。

(数据过滤器主要是提取数据的,如果上传的数据点是独立的一个数据,就不用数据过滤器,我这里是把温度、湿度、光照强度、电压、GPS经纬度等等所有数据都放在一个变量中。这里就需要写数据过滤器提取)。

注意:每个控件的需要的值的格式是不一样的,这个要看控件默认值是什么格式,按照这个格式组合返回。

以温度控件为例,想要提取温度数据显示:

return [{
    "value": data[0].value.dht11_t
}]

基于STM32+OneNet设计的物联网智慧路灯_第66张图片

基于STM32+OneNet设计的物联网智慧路灯_第67张图片

保存之后,可以看到,控件上的数字已经变成了设备上传的温度数据了。

基于STM32+OneNet设计的物联网智慧路灯_第68张图片

接下来按照这个方式,将剩下的控件设置好数据源。

如果想验证数据提取是否正确,点击这里的数据处理结果,可以看到最终提取的数据。

基于STM32+OneNet设计的物联网智慧路灯_第69张图片

当前页面上的圆环控件,和进度条控件设置过滤器代码如下:

return [{
    "value": data[0].value.dht11_t
}]


return [{
    "value": data[0].value.mq135
}]


return [{
    "value": data[0].value.dht11_h
}]

return [{
    "value": data[0].value.light
}]


return [
  {
	value: [data[0].value.power],
  },
]

(7)设置按钮开关

按钮开关控件是用来控制路灯的,因为按钮开关是独立的数据源,所以不要提取数据,也就不要数据过滤器。

基于STM32+OneNet设计的物联网智慧路灯_第70张图片

设置按钮开关发出的命令格式: (为了方便设备端区分命令功能,可以在命令内容前加一些标识符)

基于STM32+OneNet设计的物联网智慧路灯_第71张图片

(8)时间设置

为了方便设置路灯的开关灯时间范围。加一个命令发送框。这个命令发送框里面,可以输入内容发送给设备。

命令发送框不需要显示数据,所以将数据过滤器也去掉。

基于STM32+OneNet设计的物联网智慧路灯_第72张图片

然后设置命令框的名字:

基于STM32+OneNet设计的物联网智慧路灯_第73张图片

(9)地图设置

设备上传了经纬度,为了方便显示设备的位置,加了一个地图控件。

GPS经纬度数据也是放在一起上传的,需要编写过滤器提取经纬度数据给地图控件显示。

提取经纬度的过滤器代码如下:

// 最终数据应该是一个数组
var result = [];
var dataPoint = null;
//循环处理选中的数据源的数据点
for (var i = 0; i < data.length; i++) {
    // 从数据点中取出需要的数据,通过配置键值对使得数据格式符合要求
    dataPoint = {
        dev1: {
            lon: data[i].value.lon,
            lat: data[i].value.lat,
        },
    };
    // 将这个数据点添加进结果中
    result.push(dataPoint);
}
return result;

基于STM32+OneNet设计的物联网智慧路灯_第74张图片

(10)保存发布

设计好之后保存页面。

基于STM32+OneNet设计的物联网智慧路灯_第75张图片

回到项目管理页面,发布项目。

基于STM32+OneNet设计的物联网智慧路灯_第76张图片

基于STM32+OneNet设计的物联网智慧路灯_第77张图片

发布链接: https://open.iot.10086.cn/view/main/index.html#/share2d?id=6364ab3dbb4cd1003511f49d

(11) 设备故障上报

为了方便显示设备故障情况,页面增加了一个文本控件,显示设备故障状态。数据流里增加一个state字段表示故障,0表示正常,1表示故障。

上报的数据流如下:

{"id":123,"dp":{"dev_data":[{"v":{"lon":106.489733,"lat":29.541377,"dht11_t":12,"dht11_h":20,"light":40,"power":80,"mq135":1234,"signal":90,"state":0}}],"led_button":[{"v":1}],"led_time":[{"v":"20221104145533"}]}}

基于STM32+OneNet设计的物联网智慧路灯_第78张图片

过滤器编写:

return [{
    "value": "故障设备: " + data[0].value.state
}]

基于STM32+OneNet设计的物联网智慧路灯_第79张图片

编写完保存即可。

(12)手机打开显示效果

基于STM32+OneNet设计的物联网智慧路灯_第80张图片

4.6 设备数据通信总结

(1)当点击页面上开关按钮时

len:73,Data:$sys/555205/dev1/cmd/request/bf830cbf-5f6c-4fd0-9ca8-e8e0980db18fbutton:1
len:73,Data:$sys/555205/dev1/cmd/request/73b6fe4c-00b0-4da8-8f58-964a0aeeeaa4button:0

(2)时间设置

页面上输入时间范围然后点击发送。

基于STM32+OneNet设计的物联网智慧路灯_第81张图片

设备收到的数据:

len:81,Data:$sys/555205/dev1/cmd/request/ee6d4002-1c11-49e6-af5c-eb24e0ed3cfbtime_19:00_22:00

五、可视化界面修改

5.1 数据流模板增加

通过对市面常用的太阳能路灯遥控器进行调研。当前OneNet界面上的时间设置就按照遥控器的上面的模式进行设定。增加数据点:支持半亮模式、全自动模式、3小时,5小时,8小时定时等功能。

基于STM32+OneNet设计的物联网智慧路灯_第82张图片

接下来修改数据点:

下面是创建好的数据流模板。

基于STM32+OneNet设计的物联网智慧路灯_第83张图片

目前新创建的数据流如下:

dev_data    传感器数据	
led_button  路灯强制开关	
state	    路灯故障状态		
time_3h	    从天黑开始计算,定时3小时	
time_5h	    从天黑开始计算,定时5小时	
time_auto   自动模式。天黑亮,天亮关	
LED_L	    半亮模式	
LED_H	    全亮模式

5.2 可视化界面: 新增数据源

将刚才创建数据流模板关联到数据源里,方便直接关联控件进行显示。

基于STM32+OneNet设计的物联网智慧路灯_第84张图片

在新增数据源的时候,获取数据点选择1.

基于STM32+OneNet设计的物联网智慧路灯_第85张图片

5.3 可视化界面修改

在可视化界面上增加几个按钮控件,分别对应不同的模式。 每个按钮控件的数据源就关联到刚才创建的数据源上面。 按钮的输入不需要过滤器,把过滤器去掉,因为当前关联的是独立的数据。

基于STM32+OneNet设计的物联网智慧路灯_第86张图片

每个按钮发送的值格式,可以在属性页面进行修改。

这个命令内容修改之后,点击按钮发送给设备的数据就是led_button:0或者led_button:1

基于STM32+OneNet设计的物联网智慧路灯_第87张图片

5.4 登录测试

界面修改之后,通过MQTT客户端登录测试,上传数据上去,接收界面的按钮指令测试。

上传的数据点如下:

{"id":123,"dp":{"dev_data":[{"v":{"lon":109.73,"lat":28.28,"dht11_t":22,"dht11_h":24,"light":40,"power":80,"mq135":42,"signal":90,"state":0}}],"led_button":[{"v":1}],"time_5h":[{"v":0}],"time_3h":[{"v":0}],"time_auto":[{"v":1}],"LED_L":[{"v":0}],"LED_H":[{"v":1}]}}

5.5 最终界面

基于STM32+OneNet设计的物联网智慧路灯_第88张图片

5.6 数据下发测试

为了方便单片机解析,可以先使用MQTT客户端模拟设备登录服务器,然后点击界面上的各种按钮,看下服务器下发的数据格式,单片机就需要解析这些格式,完成数据处理交互等操作。

基于STM32+OneNet设计的物联网智慧路灯_第89张图片

len:76,Data:$sys/555205/dev1/cmd/request/9430041a-c5a7-4334-b094-084ebd4d6670time_auto:0
len:77,Data:$sys/555205/dev1/cmd/request/c8a74b7e-5ee5-4f61-9353-560bdaf48b55led_button:0
len:77,Data:$sys/555205/dev1/cmd/request/d88be992-8082-47bd-b64a-99a226f340c7led_button:1
len:72,Data:$sys/555205/dev1/cmd/request/1d9bcb91-97f8-49a2-8dda-6f20f2594c30LED_L:1
len:72,Data:$sys/555205/dev1/cmd/request/96d93990-691f-48cf-b9cc-cd301d4024a5LED_L:0
len:72,Data:$sys/555205/dev1/cmd/request/3e0c1cbe-147b-48fe-b36b-b79a83d29085LED_H:0
len:72,Data:$sys/555205/dev1/cmd/request/62a34b04-3b78-4c40-b20d-d01036b5f51fLED_H:1
len:74,Data:$sys/555205/dev1/cmd/request/173cb1d9-1190-4da0-9ef0-75db50479612time_3h:1
len:74,Data:$sys/555205/dev1/cmd/request/7aac72c9-6912-4862-9725-081117a39ac5time_3h:0
len:74,Data:$sys/555205/dev1/cmd/request/d267f4a9-9b94-4a6b-be0d-04b288a3a862time_5h:1
len:74,Data:$sys/555205/dev1/cmd/request/f54e8dc4-dc59-4285-81d8-5b876598f6a6time_5h:0
len:76,Data:$sys/555205/dev1/cmd/request/888d7818-6d8e-4140-9841-1204469721c0time_auto:1
len:76,Data:$sys/555205/dev1/cmd/request/d165c45d-aac5-41e9-bbf1-c06d0eb3b910time_auto:0

六、硬件代码设计

硬件上的主控采用STM32,配合各种传感器、太阳能充电设备、4G联网设备完成最终的项目设计。

6.1 硬件实物

6.2 接线说明

1.有人的WH-LTE-7S1-4G模块与STM32的串口3连接。

模块的第6个脚(UART-TX): 接单片机PA3(RXD)
模块的第7个脚(UART-RX): 接单片机PA2(TXD)
模块的第10个脚(key)   : 接单片机的电源正-3.3v (表示模块开机)
模块的第12个脚(GND)   : 接单片机的电源地-GND (给模块供电)
模块的第13个脚(DCIN)  : 接单片机的电源正-5v (给模块供电)
LINKA------——PE0 判断网络是否连接。

    
2. DHT11 温湿度
VCC--VCC
GND---GND
DAT---PA5 


3. MQ135空气质量检测传感器
VCC--->5V
GND--->GND
DAT--->PA1


4. BH1750环境光检测模块:
SDA-----PB5
SCL-----PB6
GND---GND 地
VCC---VCC 电源(3.3V~5.0V)


5. GPS接线说明: (波特率需要根据GPS模块实际情况进行修改)
GND----GND
VCC---3.3V
PB11----GPS_TX


6. 热释电模块(检测是否有人)
GND----GND
VCC---3.3V
IO----PC9

7. 大功率LED灯(当做路灯灯泡)
GND----GND
VCC---3.3V
IO----PA6


8. OLED显示屏接线:
D0----(SCK)------------------->>PB14
D1----(MOSI)------------------>>PB13
RES—(复位脚低电平有效)-------->>PB12
DC--(数据和命令控制管脚)------>>PB1
CS--(片选引脚)---------------->>PA7
GND--------------------------->>GND
VCC--------------------------->>3.3V或者5V


9. 板载LED灯
PB5---LED_R
PB0---LED_G
PB1---LED_B


10. 板子按键(高电平按下)
PA0-----K1
PC13-----K2


11. 检测电压  

PA4 ------接板子的VCC--锂电池

6.3 GPS模块设置

当前采用的GPS模块是ATGM336H-5N系列模块,该模块是基于中科微第四代低功耗GNSS SOC单芯片—AT6558,支持多种卫星导航系统。 GPS模块支持串口协议输出GPS数据,波特率默认为9600;上电后,GPS默认会以1秒的频率将收到的GPS数据全部数据发送出来,在实际使用中,为了方便高效率解析数据GPS数据,可以通过配置指令设置GPS模块输出自己需要的一部分数据。

比如:

如果只需要得到经纬度,可以这样设置: (每个指令发送的时候,结尾要加\r\n)

关闭全部语句输出: $CCRMO,GGA,3,1*3F
打开RMC语句输出: $CCRMO,RMC,2,1*23

GNRMC语句字段含义解释如下:

$GNRMC 语句的基本格式如下:
$GNRMC,(1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12)*hh(CR)(LF)
(1) UTC 时间, hhmmss(时分秒)
(2) 定位状态, A=有效定位, V=无效定位
(3) 纬度 ddmm.mmmmm(度分)
(4) 纬度半球 N(北半球)或 S(南半球)ALIENTEK
(5) 经度 dddmm.mmmmm(度分)
(6) 经度半球 E(东经)或 W(西经)
(7) 地面速率(000.0~999.9 节)
(8) 地面航向(000.0~359.9 度,以真北方为参考基准)
(9) UTC 日期, ddmmyy(日月年)
(10) 磁偏角(000.0~180.0 度,前导位数不足则补 0(11) 磁偏角方向, E(东)或 W(西)
(12) 模式指示(A=自主定位, D=差分, E=估算, N=数据无效)
举例如下:
$GNRMC,095554.000,A,2318.1327,N,11319.7252,E,000.0,005.7,081215,,,A*73

6.4 ADC调试

当前项目需要利用STM32内置的ADC测量电压,测量MQ135空气质量传感器数据、测量CPU内部温度、测量内部参考电压。

(1)配置代码

/*
函数功能:初始化ADC1为规则通道
转换通道1-->PA1  PA4   启用了通道16和通道17  分别是温度传感器,内部参考电压
*/
void AdcInit(void)
{
	/*1. 配置GPIO口*/
		RCC->APB2ENR|=1<<2; //PA
		GPIOA->CRL&=0xFFF0FF0F; // 1  4 
		GPIOA->CRL|=0x00000000; //配置PA1口为模拟输入
		
		/*2.配置ADC1时钟*/
		RCC->APB2ENR|=1<<9; 		//开启ADC1时钟
		RCC->APB2RSTR|=1<<9;		//开启复位时钟
		RCC->APB2RSTR&=~(1<<9); //关闭复位时钟
			
		/*3. 配置ADC的预分频器*/
		RCC->CFGR&=~(0x3<<14); //清空预分频
		RCC->CFGR|=0x2<<14;    //12MHZ
		
	  /*4. 配置ADC CR1基本寄存器*/
		ADC1->CR1&=~(0xF<<16); //0000:独立模式
		ADC1->CR2|=1<<23;      //1:启用温度传感器和VREFINT。
		ADC1->CR2|=1<<20;      //1:使用外部事件启动转换
		ADC1->CR2|=0x7<<17;    //111: SWSTART
		ADC1->CR2&=~(1<<11);   //0:右对齐;
		
		ADC1->CR2&=~(1<<1);    //单次转换
        
		/*5. 配置ADC规则序列寄存器*/
		ADC1->SMPR2|=0x7<<3;    //配置通道1 111: 239.5周期
		ADC1->SMPR2|=0x7<<12;   //配置通道4 111: 239.5周期
		ADC1->SMPR1|=0x7<<18;   //配置通道16 111: 239.5周期
		ADC1->SMPR1|=0x7<<21;   //配置通道17 111: 239.5周期
        
		ADC1->CR2|=1<<0;        //1:开启ADC并启动转换。
		ADC1->CR2|=1<<3;        //1:初始化校准寄存器。
		ADC1->CR2|=1<<2;        //1:开始校准
		while(ADC1->CR2&1<<2){} //等待校准结束
}



/*
获取ch通道的ADC转换值
ch的范围:0-17
16 :内部温度
17 :内部参考电压值
0-15 :外部输入引脚
*/
u16 GetAdcCHxDATA(u8 ch)
{
	ADC1->SQR3&=0xFFFFFFE0;   //00000
    ADC1->SQR3|=ch<<0;        //规则序列中的第1个转换
    ADC1->CR2|=1<<22;         //1:开始转换规则通道。

    while(!(ADC1->SR&1<<1)){} //等待转换完成
    return ADC1->DR;          //返回接收到的数据值
}

(2)调用测试代码

while(1)
    {
        /*
        PA1=0
        PA4=2211
        cpu温度=1706,温度=37.837550
        参考电压=1437,1.158022
        */
            /*单次转换,单独转换6个通道*/
            adc_data=GetAdcCHxDATA(1);
            printf("PA1=%d\r\n",adc_data);		
            
            adc_data=GetAdcCHxDATA(4);
            printf("PA4=%d\r\n",adc_data);		
            
            adc_data=GetAdcCHxDATA(16);
            cpu_temp=adc_data*3.3/4095;     //将模拟值转换为电压值
            printf("cpu温度=%d,温度=%f\r\n",adc_data,(1.43-cpu_temp)/0.0043+25);
        
            adc_data=GetAdcCHxDATA(17);
           	printf("参考电压=%d,%f\r\n",adc_data,adc_data*3.3/4095);
          
            printf("\r\n");
            DelayMs(1000);			
    }

(3)运行测试结果

PA1=0
PA4=2253
cpu温度=1706,温度=37.837550
参考电压=1436,1.157216

PA1=0
PA4=2211
cpu温度=1706,温度=37.837550
参考电压=1437,1.158022

PA1=0
PA4=2281
cpu温度=1706,温度=37.837550
参考电压=1436,1.157216

PA1=0
PA4=2211
cpu温度=1706,温度=37.837550
参考电压=1437,1.158022

6.5 开发板下载调试

当前采用的是野火的ZET6核心板,上面预留有SWD下载口,可以通过STLINK或者JLINK下载。

下面是SWD下载口对应的GPIO口,和开发板的SWD接口说明:

基于STM32+OneNet设计的物联网智慧路灯_第90张图片

=======================

基于STM32+OneNet设计的物联网智慧路灯_第91张图片

下面是开发板的下载口和串口调试接口的接线实物图:

简单的总结:

TMS----》SWDIO

TCK-----》SWCLK

RST-----》RST

GND----》GND

配置好下载方式之后,点击左上角的下载按钮即可下载程序了。

基于STM32+OneNet设计的物联网智慧路灯_第92张图片

6.6 4G模块硬件调试

拿到模块之后首先就是要了解引脚说明,明白每个引脚的功能。 在手册的第9页,有对模块引脚的介绍。

下面是模块的实物图:

调试模块时,必接的引脚有5个。 分别是:电源VCC(5V),电源GND,串口发送,串口接收,开机引脚。

下面标出这几个引脚的位置:

目前模块供电的VCC+正极有2个脚。一个支持3.4-4.2V (第16脚),一个支持5V~16V(第13脚和第14脚)。供电的时候,这两个脚只能选择其中一个。 其中,3.4-4.2V 供电是留给锂电池使用的,5V~16V的供电接口方便接单片机的电源。

当前的这个项目是需要使用STM32开发板来驱动模块完成网络连接,处理。 所以,这里模块供电引脚直接选择5V,方便接在单片机开发板引出的电源口上。

接线总结:

模块的第6个脚(UART-TX): 接单片机或者USB转TTL模块的RXD
模块的第7个脚(UART-RX): 接单片机或者USB转TTL模块的TXD
模块的第10个脚(key):    接单片机的电源正-3.3v (表示模块开机)
模块的第12个脚(GND):    接单片机的电源地-GND (给模块供电)
模块的第13个脚(DCIN):   接单片机的电源正-5v (给模块供电)

(2)模块接上位机软件测试

第一次拿到模块,肯定要先测试模块是否正常。 有人科技提供了模块对应的串口调试上位机,可以直接在官网下载。

【1】下载上位机调试软件

下载地址:https://www.usr.cn/Download/939.html

【2】将模块与USB-TTL模块接好线,连接到电脑USB口上。

接线按下面的来:

模块的第6个脚(UART-TX): 接单片机或者USB转TTL模块的RXD
模块的第7个脚(UART-RX): 接单片机或者USB转TTL模块的TXD
模块的第10个脚(key):    接单片机的电源正-3.3v (表示模块开机)
模块的第12个脚(GND):    接单片机的电源地-GND (给模块供电)
模块的第13个脚(DCIN):   接单片机的电源正-5v (给模块供电)

【3】打开软件测试模块

软件打开后,选择串口后,打开串口。 点击获取当前参数,就能看到串口打印获取到数据。

注意: 模块默认的工作模式是NET模式,他也就是连接的有人的服务器。 如果要执行AT指令,需要先进入配置状态才可以正常执行。

(3)模块状态指示灯

模块的第9个引脚是状态指示灯输出接口,正常启动后,这个引脚会按照1 秒的频率输出高低电平变化,可以将这个引脚接在单片机上的某个LED灯口上,通过观察LED灯的闪烁状态确定模块是否正常工作。也可以作为输入脚接到单片机的某个IO口上,用于判断模块是否工作正常。

(4)模块的AT指令手册

下载地址:https://www.usr.cn/Download/940.html

(5)有人的测试服务器

服务器: socket.usr.cn

端口号: 2317

这是有人的公网测试TCP服务器,向这个服务器发送数据,服务器会将发送的数据返回。 可以用这个服务器测试4G模块的联网情况。

6.7 故障上报问题

路灯出现问题之后,可以在上传状态到云端,云端页面会实时显示,同时也可以通过邮箱通知相关联系人。

目前onenet新版更新之后(2022.11.01)的MQTT协议不支持邮箱设置,短信也只是支持企业版用户。为了实现邮箱报警的效果,单独创建HTTP协议的设备。用来作为报警功能。 目前使用的4G模块支持同时连接4路TCP连接。

基于STM32+OneNet设计的物联网智慧路灯_第93张图片

这触发器里可以添加邮箱信息:

基于STM32+OneNet设计的物联网智慧路灯_第94张图片

简单来说: 就是上传的数据达到某个阀值,就可以触发动作。 可以发送邮件,短信等操作。

基于STM32+OneNet设计的物联网智慧路灯_第95张图片

基于STM32+OneNet设计的物联网智慧路灯_第96张图片

这是设置触发条件:

基于STM32+OneNet设计的物联网智慧路灯_第97张图片

目前这个设备选择的是HTTP协议接入。

给设备上传数据的格式如下:

POST /devices/1014688065/datapoints HTTP/1.1
api-key:YnRBES=bKJ93bWRY5glwcMTLHQY=
Host:api.heclouds.com
Connection:close
Content-Length:58

{"datastreams":[{"id":"data","datapoints":[{"value":1}]}]}

注意: 上面的Content-Length字段表示下面的数据长度。

服务器的IP地址和端口号:

IP:   183.230.40.33
端口号:80

通过TCP调试助手上报数据测试:

基于STM32+OneNet设计的物联网智慧路灯_第98张图片

看云端是否收到数据:

基于STM32+OneNet设计的物联网智慧路灯_第99张图片

目前的故障状态: 1表示故障,0表示没有故障。 设置触发器时候注意条件即可。

6.8 程序运行过程

程序运行中,串口打印的状态如下:

空气质量:27
环境光强度ADC:1267
du=252
du=258
du=102
du=108
du=294
du=300
2022-11-7 13:33:58
环境温度:22
环境湿度:55
电压=4095,3.300000
已向MQTT服务器更新数据.
UART2收到数据.....
usr.cn#
+SOCKALK:Connected

OK
UART2收到数据.....
02&$sys/555205/dev1/dp/post/json/accepted{"id":123}du=258
du=264
du=102
du=108
du=294
du=300
2022-11-7 13:33:59
经度:106.615692,纬度:29.700472
du=-96
du=-90
du=108
du=114
du=294
du=300
2022-11-7 13:34:0
du=-90
du=-84
du=108
du=114
du=294
du=300
2022-11-7 13:34:1
本机SIM卡的CCID号码:
RX: usr.cn#
+ICCID:89861122219046030522

OK

当前4G模块信号强度:
du=-84
du=-78
du=108
du=114
du=294
du=300
2022-11-7 13:34:2
RX: usr.cn#
+CSQ: 26,99

OK

空气质量:26
环境光强度ADC:1247
环境温度:22
环境湿度:55
电压=4095,3.300000
已向MQTT服务器更新数据.
UART2收到数据.....
usr.cn#
+SOCKALK:Connected

OK
经度:106.615728,纬度:29.700460
UART2收到数据.....
02&$sys/555205/dev1/dp/post/json/accepted{"id":123}

6.9 白天黑夜检测说明

通过太阳能充电板来检测是白天还是黑夜。 白天有太阳,可以检测到太阳光。充电模块会处于充电状态。

6.9 工程代码

基于STM32+OneNet设计的物联网智慧路灯_第100张图片

基于STM32+OneNet设计的物联网智慧路灯_第101张图片

-KMFRIv7D-1692350756753)]

这是设置触发条件:

[外链图片转存中…(img-VM62lesJ-1692350756753)]

目前这个设备选择的是HTTP协议接入。

给设备上传数据的格式如下:

POST /devices/1014688065/datapoints HTTP/1.1
api-key:YnRBES=bKJ93bWRY5glwcMTLHQY=
Host:api.heclouds.com
Connection:close
Content-Length:58

{"datastreams":[{"id":"data","datapoints":[{"value":1}]}]}

注意: 上面的Content-Length字段表示下面的数据长度。

服务器的IP地址和端口号:

IP:   183.230.40.33
端口号:80

通过TCP调试助手上报数据测试:

[外链图片转存中…(img-sXLVlJBL-1692350756753)]

看云端是否收到数据:

[外链图片转存中…(img-GMnQNRgM-1692350756754)]

目前的故障状态: 1表示故障,0表示没有故障。 设置触发器时候注意条件即可。

6.8 程序运行过程

程序运行中,串口打印的状态如下:

空气质量:27
环境光强度ADC:1267
du=252
du=258
du=102
du=108
du=294
du=300
2022-11-7 13:33:58
环境温度:22
环境湿度:55
电压=4095,3.300000
已向MQTT服务器更新数据.
UART2收到数据.....
usr.cn#
+SOCKALK:Connected

OK
UART2收到数据.....
02&$sys/555205/dev1/dp/post/json/accepted{"id":123}du=258
du=264
du=102
du=108
du=294
du=300
2022-11-7 13:33:59
经度:106.615692,纬度:29.700472
du=-96
du=-90
du=108
du=114
du=294
du=300
2022-11-7 13:34:0
du=-90
du=-84
du=108
du=114
du=294
du=300
2022-11-7 13:34:1
本机SIM卡的CCID号码:
RX: usr.cn#
+ICCID:89861122219046030522

OK

当前4G模块信号强度:
du=-84
du=-78
du=108
du=114
du=294
du=300
2022-11-7 13:34:2
RX: usr.cn#
+CSQ: 26,99

OK

空气质量:26
环境光强度ADC:1247
环境温度:22
环境湿度:55
电压=4095,3.300000
已向MQTT服务器更新数据.
UART2收到数据.....
usr.cn#
+SOCKALK:Connected

OK
经度:106.615728,纬度:29.700460
UART2收到数据.....
02&$sys/555205/dev1/dp/post/json/accepted{"id":123}

6.9 白天黑夜检测说明

通过太阳能充电板来检测是白天还是黑夜。 白天有太阳,可以检测到太阳光。充电模块会处于充电状态。

6.9 工程代码

[外链图片转存中…(img-oDVdr9mq-1692350756754)]

[外链图片转存中…(img-wxd6CKdD-1692350756754)]

你可能感兴趣的:(stm32,物联网,嵌入式硬件)