-
1 知识介绍
-
2 PPT
-
3 教学视频
-
4 章节讨论
-
5 名家名言
任务2所需要实现的任务为:编写程序采集温湿度数据、在OLED屏上可显示采集到的数据信息。
LoRa温湿度传感器节点开发实现过程包括:LoRa开发模块硬件连接,采集温湿度数据并显示在OLED屏上,根据数据采集流程编写应用程序,将写好的程序编译,并烧录到开发板中。
任务2 LoRa温湿度传感器节点应用程序开发
步骤1:硬件连接
将LoRa开发模块显示屏下方的开关JP1往右拨,JP1右拨为:正常工作,左拨为:下载固件。开关JP2往左拨。JP2是STM32单片机的usart1的接通选择开关,左拨为:接通到NewLab主机上,右拨为:断开与NewLab主机的连接。编码开关往上拨,编码开关是控制STM32的SPI引角和SX1278模组的SPI接通。全部上拨时为: STM32的SPI和SX1278模组接通,全部下拨时为:STM32的SPI和SX1278模组断开连接。 连接 Lora 模块天线。在指定位置插上温湿度传感器模块儿。准备NewLab主机和配套12V电源, NewLab主机接通12V电源通讯旋钮开关悬置通讯模式,将 LoRa 传感器节点放置NewLab主机上。
步骤2:建立工程模板
根据任务的要求需要实现:采集温湿度数据并显示在OLED屏上。具体内容为:当LoRa模块收到网关读取传感器数据的指令,将传感器数据响应给网关,并在 OLED屏上显示。
本任务包含:1、工程模板操作和关键函数概述;2、功能函数解析;3、程序烧写。按照程序设计的思想对我们的任务进行功能和流程分析,可分为以下几部分:外设初始化、接收数据、解析数据、采集数据、准备数据、发送数据、OLED显示数据。
将任务1中移植后的工程源码,复制重命名为:“LoRaModernSensorTempleRhProject”。进入这个文件夹并打开该工程源码,可以看到“main.c”。其中主要包含:4个函数,分别是main()、LoRaGetSensorDataProcess()、 MyRadioRxDoneProcess() 和PlatformInit()。
步骤3:应用程序编写
在主程序中:main函数中包含的3个具体功能函数。
1、外设初始化函数 PlatformInit()。PlatformInit()函数是对整个硬件及外设如温湿度传感模块、OLED串口和LoRa模块等各个外设部件的初始化操作障。除了可以直接调用工程模板中提供的初始化函数如开启定时器SPI、GPIO口等功能外,还可使用软件STM32CubeMX生成初始化代码,将初始化功能代码或函数添加到PlatformInit()内,开启特定的功能。
2、接收数据和解析数据响应数据函数MyRadioRxDoneProcess()。该函数即包含接收数据和解析数据/响应数据。这个函数包含2个子函数,接收数据函数ReadRadioRxBuffer()和解析数据响/应数据函数 LoRa_DataParse()。首先接收数据的功能,网关会给LoRa模块发送数据。LoRa模块要随时接收数据,调用NS_Rradio.c 文件下的:unit16_t ReadRadioRxBuffer函数来获取接收到的数据长度和缓冲数据。在本工程中,把该函数的输出存放在RXBuffer数据缓冲区域中,返回值即接收到的数据长度保存在BufferSize变量中。接收完数据之后,对接收到的数据进行解析,添加解析指令/响应指令功能的函数,解析指令/响应指令函数LoRa_DataParse()。在接收到数据之后,对收到的数据内容进行解析。经过网关传输的数据非常的多,可能会包含其它节点或者传感器的数据,怎么才能区分出我们接收到的数据是不是读取传感器数据的指令?在工业和商业应用领域中,网络通信都是有自己私有的通信协议,否则网关无法从接收到的数据中识别和提取出传改数据,因此就要根据通信协议编写一个解析指令的程序。
这段程序共有四部分:1)宏定义,按照通信协议的格式将接收到请求读传感器的数据帧中包含的各种数据做宏定义。2)ExtractCmdframe()函数。注意到上面定义的针头数据的指针地址DestData是空,需要通过一个找出针头数据的地址的函数,即ExtractCmdframe()函数。该函数把接收到的缓冲区中的数据和针头数据逐一对比,第一个存放这个数据的地址就是针头数据的地址。3)判断数据。检测到针头数据后,就需要对针头之后的数据逐一进行校对分析,才能确认是否从约定网关和设备传来的读取传感器数据的指令。如果是,则就需要回传数据,如果不是,就继续返回,等待接收新数据。我们校对的内容有数据长度、命令字节、网络ID、设备地址和校验盒。4)响应命令/回传数据函数。在程序中,先把回传的数据温度、湿度信息保存在变量 temperature helmedirty 中,再按照通信协议格式打包成待发送的数据,最后将这些数据通过 Lora 模块发送出去。数据打包就是按响应命令的指令格式打包的,包含针头命令、字节、网络ID、设备地址。发送数据,这里可以直接调用Radio.Send()函数,这个函数中7+RspBuf[6]中的7指的是数据帧中约定指令的长度,包含:帧头、命令字节、网络ID、设备地址和校验位等指令的长度。RspBuf[6]是指数据域的长度,即温度和湿度数据域的长度。数据发送成功之后,就点亮LED1发送数据指示灯。
3、 采集温度进程函数LoRa_GetSensorDataProcess(),这个函数是一个进程函数,用于每隔1秒采集温湿度数据。但是后面这些代码执行的前提是User0Timer_MS>Time。这里使用了定时器中断,系统运行后,每隔 1 毫秒就会产生中断,就会进入中断函数。进入中断回调韩硕:HAL_TIM_PeriodElapsedCallback(),该函数在tim_board.c文件中找到。每进一次这个中断函数,User0Timer_MS就自动加1。当User0Timer_MS加到 1000 后,就执行 if 语句里的代码。这些代码主要包括两部分内容,温湿度数据采集功能和OLED显示温湿度数据功能。温湿度数据采集功能可以通过调用hal_temHum.c 下的call_sht11()函数实现。温度数据存放在变量Temp中,湿度数据存放在变量Rh中。OLED 显示温湿度数据功能,可通过调用hal_oled.c下OLED_ShowString()函数实现。OLED_ShowString()函数的第一个参数和第二个参数表示的是字符在液晶屏上显示的位置,第三个参数是要显示的字符。由于得到的温度和湿度数据是整形数据,需要把格式进行转换。在代码中先定义了一个字符型的缓冲区StrBuf,再通过memset指令将缓冲区StrBuf初始化为“\0”格式。然后再通过sprintf函数将温湿度数据和它们各自对应的单位符号转换为字符型数据合并保存在StrBuf缓冲区中,最后把StrBuf放入OLED_ShowString 函数中就完成了OLED数据显示的功能。最后在main.c起始处附近添加函数声明。这样程序就编写完成。然后编译工程,无错误后,keil编译器编译生成HEX文件到这里就完成了温湿度传感器节点的应用程序开发了。
步骤4:程序烧录
1、将温氏度传感器LoRa模块JP1往左拨,按一下复位键。2、 打开STMFlashLoaderDemo软件,在PortName 下拉列表框中选择对应的窗口。3、读到硬件设备后,BaudRate波特率选:115200,点击NEXT命令按钮。4、 选择MCU型号为STM32L1_Cat1-128k,点击NEXT命令按钮。5、 选中Download device单选按钮,选择xxx.hex下载程序对应的路径,点击NEXT命令按钮。注意:路径要根据.hex文件的实际路径选择。6、 等待下载完成,将LoRa模块的JP1往右拨,同时按一下复位键KEY1。温湿度程序便开始运行了。


