使用STM32组建基于LoRa的环境监测系统

一.前言

本篇文章为本科毕业的时候做的毕业设计,当时还手动画了PCB版,经过验证该系统是可以正常工作,但在这里并没有把所有图片和源码都附上,有问题可以讨论

二.介绍

本系统由中心网关和两个传感器节点组成,两个传感器节点获取温湿度,二氧化碳气体浓度,光照强度这几种数据,传感器节点和中心网关通过LoRa进行数据传输。
中心网关通过串口和上位机连接,此时就可以通过上位机查看数据信息,同时中心网关有显示器模块,通过显示器模块也可以查看到数据信息。网关的小灯作为指示灯指示当前的工作模式,并通过按键改变系统的工作模式,设定的系统工作模式有:配置模式、通信模式、深度休眠模式。中心网关在设计上由ALIENTEK的战舰 STM32F103单片机和亿佰特的E22-400T30D LoRa无线模块组成。
传感器节点由主控MCU、传感器元件和LoRa无线通信模块组成,由于需要接入比较多的传感器,所以传感器节点有两个。其中一个节点由STM32F103C8T6系统板、温湿度传感器、气体传感器和LoRa无线通信模块组成,另一个节点由STC89C52RC系统板、光照传感器和LoRa无线通信模块组成,两个节点将获取到的传感器数据通过LoRa模块向中心网关发送,完成数据采集和传输的功能。同时也可以接收网关的LoRa模块发送的信号,从而做出响应。

三.硬件连接

1.系统框架

在这里插入图片描述

2.中心网关的连接

中心网关采用STM32F103芯片,通过引出IO控制LoRa模块的工作方式并获取LoRa模块的状态,LED小灯作为指示灯,蜂鸣器作为警报器,显示屏显示当前接收的数据,按键切换系统工作模式。中心网关通过SWD接口进行程序的调试和下载,LoRa无线模块的由5V/3V电源电路输入输出模块进行供电,整个网关由USB进行供电,保证系统的正常运行。
通过引出IO实现网关和LoRa无线传输模块的连接,将LoRa无线传输模块的M0、M1连接到网关PB6和PB7,通过这两个IO输出高低电平来控制LoRa无线传输模块的工作模式,将LoRa无线传输模块的工作状态通过AUX接到PA4,网关通过PA4IO口接收到的高低电平来判断无线传输模块处于空闲模式或者忙碌模式,中心网关MCU进而做出进一步的处理。每个IO口寄存器要按照32位字被访问,都有7个寄存器来控制,CRL和CRH控制每个IO口的模式和输出速率。

3.传感器节点1的连接

节点一的微控制处理单元为STM32F103C8T6,这是基于ARMCortex-M3内核设计的微控制器,由意法半导体公司推出。支持SWD调试,拥有USBHD外设,额定电压为3.3V或者5V,该芯片的控制LoRa模块的工作模式,芯片的RX接收数据,TX发送数据,完成与LoRa进行通信,LoRa的M1、M0、和AUX与芯片的其他引脚连接,让芯片控制LoRa工作模式及获取LoRa工作状态。DHT11的DATA总线与芯片的PA15相连,由于PA15为JTAG调试接口,需要先禁用JTAG功能才能作为普通的GPIO口,该总线完成数据传输的功能。SPG-30模块的SCL与PB0相连,SDA与PB1相连,通过IIC完成数据通信。该芯片同样可以提供3.3V或者5V电压和GND,让LoRa模块、温湿度传感器模块和气体传感器模块正常工作,板上的小灯指示节点工作状态。同样在使用GPIO口时,要对GPIO口进行初始化。

4.传感器节点2的连接

节点二的微控制器为STC89C52RC,Flash程序空间是8K字节,RAM数据空间是512字节使用该芯片可以降低成本,同时也能完成数据的接收和发送。该芯片是宏晶的增强51单片机,可以使用STC进行程序的下载,具有8K的可编程Flash存储器。该节点由STC89C52RC系统板、光照传感器和LoRa无线通信模块组成。芯片的RX和TX引脚和LoRa无线通信模块相连,完成与LoRa的数据接收和发送。T2和T2EX引脚与光照传感器相连,完成与光照传感器的数据传输。其他引脚与LoRa的M1、M0、和AUX连接,控制LoRa工作模式及获取LoRa工作状态。该系统板提供5V电压和GND,使LoRa模块和光照传感器正常运行。其他引脚与LoRa的M1、M0、和AUX连接,控制LoRa工作模式及获取LoRa工作状态。

四.网关程序

1.主程序设计

网关主程序是该系统的核心,当系统开始正常运行,对需要用到的GPIO口、系统时钟、串口、小灯、按键、蜂鸣器、LCD进行初始化。开启中断服务函数,加载LCD_display()函数,展示系统欢迎界面,扫描Key键,可以选择通信模式、配置模式和深度睡眠模式,当选择进入通信模式时,将LoRa模块的M0=0,M1=0,开始从串口3接收数据,将接收的数据存在BUFF变量中,根据通信格式解析数据,分析数据是否存在丢失,如果存在丢失则重新获取数据,数据正确后将有效数据进行处理显示在LCD上,同时通过串口1与电脑进行通信,将数据传输给电脑,电脑通过串口通信软件将数据打印处理。同时加载Warning()函数,当接收的数据出现异常时,温度大于40摄氏度,二氧化碳浓度大于1500ppm,TVOC浓度大于50ppb,就会驱动蜂鸣器响起,提示环境数据异常。可以通过按键或者上位机传输的数据对系统工作模式进行转换。

2.LoRa程序

网关和LoRa的通信是通过串口3完成的,从串口3读取数据后,网关需要对数据进行进一步的处理。根据选择的系统工作模式来控制LoRa的工作状态,一开始默认工作在通信状态,此时LoRa的M0=0,M1=0。通过接收从上位机和网关按键选择来改变M0、M1的高低电平,从而达到LoRa工作状态的改变。LoRa将获取到的数据存在串口3的数据寄存器,对该部分数据进行校验,如果发现错误则清空数据寄存器重新接收,数据校验成功则给MCU做进一步处理。同时LoRa模块也可以接收来自MCU的数据进行发送。

3.串口1程序

串口1主要完成上位机和网关的通信,在串口3从LoRa模块获取正确的数据后,便通过串口1将该数据发送给上位机,上位机通过串口通信软件接收到数据,并将接收到的数据打印出来。同时在上位机也可以向串口1发送数据,按照通信格式发送数据控制系统工作模式,通信格式的第一个字节(8位)为数据起始位,第二个字节为系统工作模式控制位,同样也为8个位,1个字节。当控制位为0x01时,MCU将LoRa的M1引脚置为0,M0引脚置为0,可以正常通信。当控制位为0x02时,MCU将LoRa的M1引脚置为1,M0引脚置为0,LoRa进入配置模式,此时可以在上位机通过E22配置软件进行参数配置。当控制位为0x03时,MCU将LoRa的M1引脚置为1,M0引脚置为1,系统进入深度睡眠模式,只有在确定在较长时间内不使用才选择进入该模式,退出该模式LoRa模块会重新进行参数配置。

4.LCD显示程序

LCD显示屏提高了网关的实用性,在没有连接上位机的情况下,也能实时显示接收到的数据,并且还能通过按键选择LoRa的工作模式。LCD显示使操作数据可视化,提高了便捷性。由于显示需要汉字,所以需要加载汉字字库,其字库存在FLASH。汉字字库为GBK编码。
先进行初始化,初始化GPIO口、FSMC、LCD序列和汉字字库,设置为竖屏显示,此时背光点亮,显示主界面,设置变量N,通过按键可以改变N的值,设置坐标,获取显示的数据,用软件将显示的数据转化成LCD显示坐标,当变量N等于0,指针指向进入通信模式,等于1指向进入配置模式,等于2指向进入深度睡眠模式,当监测到KEY_UP被按下,则显示对应模式的界面。当进入通信模式时,LoRa处于通信模式,LCD就开始显示字符,该字符从MCU的BUFF的获取,为校验过的数据,当监测到KEY2键按下则返回主界面。当进入深度睡眠模式时,控制MCU向LoRa发送进入深度睡眠模式控制字,LoRa将其发送,等待传感器节点的接收,之后整个系统进入深度睡眠模式。切换模式可以唤醒,传感器节点需要重启才能唤醒。

五.传感器节点程序

1.传感器节点一主程序

主程序先进行硬件的初始化,SPG-30开启需要一定的时间,所以在这段初始化时间内将会发送正在“正在监测中的”的数据,指示网关需要等待数据。SPG30数据的前8位为二氧化碳浓度值,后8位为TVOC浓度值。由于SPG没有完成初始化时传回的数据一直为二氧化碳浓度400,TVOC浓度0,所以当同时收到二氧化碳浓度为400并且TVOC浓度为0时,表示未初始化完成,芯片重新向SPG30读取数据。芯片向DHT11读取数据,向SPG30读取数据,将接收到的数据通过LoRa发送,当LoRa处于空闲状态时,便将数据进行传输,否则等到LoRa空闲。

2.传感器节点二主程序流程图

传感器节点二的主程序主要完成光照传感器数据的读取和LoRa数据的发送,该节点由51单片机进行控制,主程序先进行串口初始化,BH1750初始化和LoRa初始化。初始化串口时,设置串行口控制寄存器允许接收8位数据,向BH1750写入0x01控制字,打开其电源,之后写入0x10控制字,进入H分辨率模式,读取光照传感器的数据,存储在BUFF中,将该数据校验处理后发送给LoRa,当LoRa处于空闲状态时,便将数据进行传输,否则等到LoRa空闲。

3.温湿度传感器程序

温湿度传感器首先完成初始化,在这个过程中初始化PA15IO口,禁用JTAG功能,当接收到来自MCU读取数据的命令,先将DHT11进行复位,复位后检测DHT11是否响应,当响应成功返回0,此时开始连续读取数据,高电平返回1,低电平返回0,连续读取40位,5个字节,前两个字节表示温度数据,后两个字节表示湿度数据,最后一个字节表示校验,完成读取数据后判断获取的数据和校验数是否一致,一致则将读取的数据存在BUFF,否则将数据丢弃。

4.气体传感器程序

先将SPG30初始化,在这个过程中完成PB0和PB1的初始化。由于控制字的写入需要用到I2C,所以需要先产生I2C起始信号,电平从高变低,钳住I2C总线,准备发送或接收数据,完成IIC起始信号。之后向SPG30发送控制字0x2003,表示初始化接收空气质量,完成SPG30的初始化。向SPG30发送控制字0x2008,表示测量数据,前两个字节表示二氧化碳浓度,后两个字节表示TVOC浓度,同时还会发送一个CRC校验数据,当CRC校验成功则接收,MCU从PB0读取数据,否则将数据丢弃。SGP30模块开机需要一定时间初始化,在初始化阶段读取的CO2浓度为400ppm,TVOC为0ppd且恒定不变,因此上电后每隔一段时间读取一次,直到读取的数据不为上述值,获取的数据则为正常数据,读取完数据,IIC总线信号停止。

5.光照传感器程序

GY-30光照传感器接收来自51单片机的命令,做出相应的反应,BH1750先进行初始化,由于GY-30与MCU是通过IIC进行数据传输,所以先让IIC产生起始信号,先置SDA和SCL为高电平,之后为低电平,当接收到来自MCU的指令时,便根据相对应的指令执行操作。光照环境测量采用连续H分辨率模式,当收到MCU发送的控制字0x10,发送“连续h分辨率模式”指令(0x46),等待测量结束后,发送“读取数据”指令(0x47),读取完数据后将数据存在BUFF,等待MCU的处理,读取完毕便停止IIC信号。

6.LoRa程序

传感器节点1和传感器节点2的LoRa功能都是一样的,其M0、M1、AUX由MCU控制,通过MCU输出高低电平来改变工作模式,AUX返回LoRa的工作状态。当接收到MCU发送的数据时,在LoRa空闲的情况下便将读取MCU的数据,将其进行传输。LoRa同时也可以接收来自中心网关的信号将其传输给节点MCU。

六.测试与验证

1.代码的调试与下载

在Keil进行程序的编写后,需要将编译好的代码下载到单片机中,其中STM32F103ZET6使用ST-LINK进行下载,并且可以使用SWD进行调试,在KEIL中配置好ST-Link Debugger后,将ST-Link连接电脑和网关的JTAG,即可进行代码的下载。
由于STM32F103C8T6提供了HUSB,因此用数据线就可以进行代码下载,在下载前将boot0设置为高电平,boot1设置为低电平,进入WCHISPTool软件,选择32位CH32F1系列,将编译好的HEX文件导入,即可完成程序的下载。
对于STC89C52RC则选择USB转TTL下载,将USB转TTL的TX换个RX接口与芯片相连,软件选择STC-ISP,将编译好的HEX文件导入,同时将单片机重新启动,程序就会自动下载,。

2.LoRA模块的配置

系统进入配置模式后,此时LoRa模块的M1引脚为1,M0引脚为0,连接上位机打开E22配置软件,将该系统所有的LoRa模块波特率设为9600,奇偶校验选择奇校验,空中速率选择1.2Kbps,信道等均设置相同,让LoRa模块M1引脚置位0则可进入通信模式,模块间可以正常收发数据。

3.上位机通信

传感器节点放在较远处获取环境数据,中心网关连接电脑读取数据,节点与网关之间采用星型组网的方式,两个传感器节点获取周围的温度、湿度、二氧化碳浓度、TVOC浓度、光照强度。电脑上使用串口通信助手获取网关的数据,并可以通过串口1向网关发送数据。

传感器将获取的环境数据传输给中心网关,中心网关将数据进行处理后将数据发送给上位机。
当网关和电脑连接时,使用串口通信助手进行双向串口通信,当搜索到串口后,打开串口,设置波特率为9600,校验位为奇校验,在串口通信助手可以选择暂停接收数据或者继续接收数据,同样也可以在数据发送区发送数据改变系统工作状态。系统的工作状态分为三种,一种是配置模式、一种是通信模式,一种是深度睡眠模式,分别由控制字0x02,0x01,0x03决定,控制字由上位机发送。

将该系统上电,系统正常运行,通过串口传输助手发送控制字0x01切换系统进入通信模式,传感器节点收到信息也进入通信模式,初始化传感元件,数据经过校验后通过LoRa发送给网关,网关将接收的数据进行校验,校验码正确则将数据进行进一步处理,然后将数据发送给上位机,上位机接收的数据如下,获取的数据与实际情况相符合。

4.网关控制

当上位机不在的时候,也可以通过网关的显示屏来显示当前获取的数据,提高了网关的实用性。此时可以通过按键来选择当前系统工作模式。系统欢迎界面展示按键的功能如图 ,其中KEY0表示下一个,KEY1表示上一个,WK_UP表示确定/取消。欢迎界面有三种模式,一种是通信模式,一种是配置模式,一种是深度睡眠模式。
选择进入配置模式如图 ,此时LoRa的M1和M0引脚分别为1,0,将USB转TTL的RX连接LoRa的TX,串口1的TX连接LoRa的RX,打开上位机配置软件即可对LoRa进行参数配置。进入通信模式如图,将接收到的数据在LCD上进行展示,比较直观,显示的数据和在上位机上接收的数据是一样的,并且还对当前环境数据做出判断,目前环境数据正常,当出现异常时蜂鸣器就会响起。进入深度睡眠模式如图,在该模式下系统的接收和发送功能均关闭,此时LoRa无法接收和发送所有的数据,在不需要数据传输时进入该模式,可以保持系统以较低的功耗运行,当进入特定模式时按KEY2可以退出,当网关LoRa从深度睡眠模式退出时,需要重新配置参数,此时AUX返回0,需要等待一定时间才能接收数据。传感器节点退出深度睡眠模式则需要重启设备,重新运行LoRa初始化函数进入通信模式。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 26
    点赞
  • 154
    收藏
    觉得还不错? 一键收藏
  • 62
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 62
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值