最近毕业设计终于是告一段落了,大概断断续续边做边玩搞了两个月吧,论文还没写麻了。
今天写这篇博客的主要目的是记录梳理一下自己做毕设的过程,同时也希望自己的毕设经验能给有需要的人提供一些帮助。
题目:基于Lora的远程农业监测与控制系统
目的:通过Lora子节点采集好各种传感器的信息,发送给汇聚节点,汇聚节点将数据通过ESP8266上传至云端,使用了微信小程序进行监测与控制
元器件:正点原子lora模块3个、正点原子STM32F103ZET6最小系统开发板3个、MQ2气敏传感器(替代二氧化碳传感器)、雨滴传感器、土壤湿度传感器、光照传感器、DHT11温湿度传感器、水位传感器、三路继电器、12V转5V、3.3V电源模块
成品:
主要元器件图片:
下面的过程略微有点长,不过算是记录了我详细的思考过程,有需要的小伙伴可以看看
其实我觉得设计思路是整个毕设最重要的部分,因为它决定着你后续工作的展开,这里我仅提供自己的设计思路做以参考,希望大佬多多指点。
子节点:采集各种传感器数据,在接收到汇聚节点的指令后发出数据
汇聚节点:发送指令与接收子节点返回的数据
整体思路:汇聚节点发出获取A节点数据的指令后立马开启接收函数,并且对收到的值进行判断以确保没有丢包,如果数据不完整会再次重复发送过程,三次不成功后将跳过对A节点的询问,直接开始对B节点进行询问。
子节点采集好各种传感器数据后,在接收到子节点的查询指令后,使用串口3通过Lora发出,同时会在末尾加上校验数据,比如0X55,当汇聚节点收到数据后可以直接判断末尾是否为0x55,确保数据的完整性。
这里我们有一个需要注意的问题,如果不对子节点进行地址和信道的单独设置会使得数据在发送时存在干扰问题。通过研究正点原子Lora使用手册,可以使用定向传输,在进行Lora配置时,对每个子节点进行信道、地址单独配置,发送数据时携带上目标节点的信道和地址即可。
参考下图(来源AN1801A ATK-LORA-01 无线串口模块使用说明):
最重要部分:个人认为最重要的就是汇聚节点对子节点的轮询,因为我们不可能同时访问到两个子节点,就算可以也会存在数据干扰,因此我们需要轮流询问子节点,简单理解就是一次只能跟一个人交流,面对一群人时我们只能一个一个的交流。
我的初步想法是在一个while循环里通过判断一个节点是否接收完毕然后开始下一个节点,这样的话感觉理论上是没有什么问题的,但是和导师说完我的想法后,导师直接说我想的过于简单,建议我使用一个实时操作系统来完成轮询。
后面我经过思考发现,如果只是在while里面轮询,对于数据上传和命令下发是非常不友好的。因为我们的要求是对子节点的控制命令优先级要高于对节点数据采集。并且我们在收到数据后还要进行数据上云的步骤,如果只是普通while循环的话是远远不够的。
最终通过网上查询相关资料,和简单了解之后我是用了FreeRTOS系统,另一部分原因也是正点原子官方提供的开发板资料里面有一些FreeRTOS的使用教程,可以作为学习的起点。
1、系统整体设计
系统整体是基于STM32、Lora和FreeRTOS、微信小程序、onenet开发,分别由终端节点、汇聚节点、云平台、小程序用户端四大部分组成。每个终端节点由STM32和Lora模块组成,其主要任务是完成对农田温湿度、土壤湿度、水位、二氧化碳、降雨量、光照等数据量的采集、完成对数据的简单处理,保证数据的可用性,同时也要也要完成对灌溉设备、补光设备、换气设备的控制实现人工干预创造适合农作物生长的环境。终端节点在采集到数据后通过低耗能Lora将数据上传至汇聚节点。汇聚节点在通过Lora接收到数据后将数据上传至云平台,用户端可以随时通过小程序链接云平台完成对数据的读取和对设备的控制。
2、汇聚节点设计
汇聚节点硬件主要是由STM32、Lora和ESP8266组成。在FreeRTOS的系统中,分别设置五个主要任务,并且按照一定的优先级执行,同时也要响应ESP8266接收到的云端下发数据。在轮询到Lora任务时,接收到子节点数据后进行判断,如果数据完整则进行简单处理后上传云平台。
3、子节点设计
子节点主要是通过STM32采集各种传感器数据和控制设备,采集到的数据通过简单处理后在接受到查询命令时通过Lora发给汇聚节点。同时也要接收汇聚节点的控制命令,对控制设备进行操作。
虽然整个软件设计比较简单或者说大多是重复工作,比如传感器的ADC采集,但是我尽可能多用集中方式来实现,感兴趣的小伙伴可以做个参考。如果有不对的地方或者更优解欢迎指出。
上面这个过程可能有些许复杂,我自己画的可能也有点问题。下面我会再详细的叙述一遍代码执行过程。
B节点的流程与这个类似,只是在最终命令判断部分有所不同,这里就不重复展示了。
时间2022年3月10日,忙完了一些事有点空了,接着上面的继续。
如果你没有看明白上面的流程图,那么没关系,可以看看我下面的文字叙述,及主要代码分析
这个地方我们可以参考正点原子的ATK-LORA配置软件 V1.2,软件的下载地址可以去这里面寻找:开发工具专栏-OpenEdv-开源电子网
指令帮助一栏里面有相应配置指令的使用方式,我这里的配置代码如下所示:
//为防止通信产生干扰可以自己修改这里的模块配置参数,如果另一侧是用上位机接收,
//就在上位机调试APP中修改为对应的参数即可,不然两个模块无法通信
lora_send_cmd((u8 *)"AT+ADDR=FF,F1",(u8 *)"OK",200); //设置地址
lora_send_cmd((u8 *)"AT+CWMODE=0",(u8 *)"OK",200); //设置为省电模式
lora_send_cmd((u8 *)"AT+TMODE=1",(u8 *)"OK",200); //设置为定向传输
lora_send_cmd((u8 *)"AT+TPOWER=3",(u8 *)"OK",200); //设置发射功率20db
lora_send_cmd((u8 *)"AT+WLRATE=24,2",(u8 *)"OK",200); //设置信道为24,空中速率2.4
lora_send_cmd((u8 *)"AT+WLTIME=0",(u8 *)"OK",200); //设置休眠时间为1S
lora_send_cmd((u8 *)"AT+UART=7,0",(u8 *)"OK",200);//设置波特率115200,无校验
我们要特别注意地址、信道、传输模式、空中速率的配置,这里有必要说一下传输模式的区别。
传输模式一共有三种,分别是{0 一般模式}、{1 唤醒模式}、{2 省电模式}、{3 信号强度模式},信号强度模式我并未测试,但是前面两种我已经测试完毕。
一般模式:这个模式下可以进行无线透明、定向传输数据,接收方必须是工作在一般模式和唤醒模式。
在终端节点接收到发送数据的命令时,子节点会调用各个传感器相应的函数获取数据,然后将数据填装到对应数组的位置,最后将数据数组与目标地址和信道组合,通过串口使用Lora发出。
——————————————————2022年3月20日——————————————————
未完待续