在当前背景下,我国正大力推进数字乡村建设,智慧农业管理系统作为其中的重要组成部分,对于提高农业生产精细化管理水平,解决传统农业中信息获取不及时、人工管理成本高、决策缺乏科学依据等问题具有重要作用。
本设计开发一套基于STM32F103RCT6主控芯片的智慧农业管理系统,通过集成DHT11温湿度传感器、BH1750光照强度传感器以及土壤湿度检测传感器,实时监测农田环境和作物生长状态,并在超出阈值时通过蜂鸣器报警,提醒管理人员进行灌溉、施肥等操作。同时,采用NBIoT通信技术(BC26模块)将采集到的数据上传至云端,利用EMQX开源MQTT服务器框架部署于华为云ECS服务器上的MQTT服务器,实现数据的远程展示与处理。
(2)自动化管理与预警:根据土壤湿度传感器检测的数据,如果土壤湿度低于设定的适宜作物生长的含水量阀值,则系统会自动提醒管理者进行灌溉操作。同时,可以按照预设周期发送施肥提醒,以确保农作物在最佳时期得到充足的水分和养分供应。
(1)主控模块:采用STM32F103RCT6微控制器作为核心控制单元,负责整个系统的运行和管理。STM32F103RCT6具有丰富的外设接口、强大的处理能力和低功耗特性,能够实时处理传感器数据、执行逻辑判断,并通过无线通信模块发送和接收指令。
(2)环境监测模块:
(3)控制输出模块:
(4)无线通信模块:集成NBIoT-BC26模块,实现与云端服务器的数据交互。该模块具备广覆盖、低功耗、大连接的特点,可确保在各种复杂农业环境中稳定地传输数据至MQTT服务器。
(5)报警模块:系统配备蜂鸣器用于异常情况报警,当环境参数超出设定范围时,主控板会驱动蜂鸣器发出声音警报。
(1)系统需求分析:根据智慧农业管理的实际需求,确定需要监测的关键环境参数(温度、湿度、光照强度和土壤湿度),以及必要的控制功能(灌溉、补光灯控制等)。同时考虑远程监控与预警的需求,规划通过NBIoT通信技术实现数据上传及远程操控。
(2)硬件选型与设计:
(3)软件架构设计:
(1)DHT11温湿度传感器:
(2)BH1750光照强度传感器:
(3)土壤湿度检测传感器:
(4)蜂鸣器报警模块:
(5)5V抽水泵与继电器组合:
(6)NBIoT-BC26模块:
STM32的编程语言选择C语言,C语言执行效率高,大学里主学的C语言,C语言编译出来的可执行文件最接近于机器码,汇编语言执行效率最高,但是汇编的移植性比较差,目前在一些操作系统内核里还有一些低配的单片机使用的较多,平常的单片机编程还是以C语言为主。C语言的执行效率仅次于汇编,语法理解简单、代码通用性强,也支持跨平台,在嵌入式底层、单片机编程里用的非常多,当前的设计就是采用C语言开发。
开发工具选择Keil,keil是一家世界领先的嵌入式微控制器软件开发商,在2015年,keil被ARM公司收购。因为当前芯片选择的是STM32F103系列,STMF103是属于ARM公司的芯片构架、Cortex-M3内核系列的芯片,所以使用Kile来开发STM32是有先天优势的,而keil在各大高校使用的也非常多,很多教科书里都是以keil来教学,开发51单片机、STM32单片机等等。目前作为MCU芯片开发的软件也不只是keil一家独大,IAR在MCU微处理器开发领域里也使用的非常多,IAR扩展性更强,也支持STM32开发,也支持其他芯片,比如:CC2530,51单片机的开发。从软件的使用上来讲,IAR比keil更加简洁,功能相对少一些。如果之前使用过keil,而且使用频率较多,已经习惯再使用IAR是有点不适应界面的。
EMQX是一款开源的、云原生的分布式物联网MQTT消息服务器,设计目标是实现高可靠性,并支持承载海量物联网终端的MQTT连接,以及在海量物联网设备间实现低延时消息路由。基于Erlang/OTP平台开发,充分利用了Erlang/OTP的软实时、低延时和分布式特性。
以下是EMQX服务器框架的详细介绍:
(1)可扩展性:EMQX支持亿级的MQTT服务订阅,单节点能够支持500万MQTT设备连接,集群可扩展至1亿并发MQTT连接。这种强大的扩展能力使其能够适应不同规模的物联网应用。
(2)安全性:EMQX提供了多种安全机制,包括SSL/TLS、密码认证、增强认证和ACL(访问控制列表)等,以保障数据传输和访问的安全性。
(3)规则引擎:EMQX内置了基于SQL的规则引擎,能够实时过滤、转换和处理消息,提供灵活的消息处理机制。这使得应用程序能够根据业务需求对消息进行灵活处理。
(4)数据存储:EMQX企业版还提供了数据存储功能,将客户端上下线状态、订阅关系、离线消息、消息内容以及消息回执等操作记录到各种数据库中。这一功能在服务崩溃或客户端异常离线后,能够保留数据,确保数据的完整性和可靠性。
(5)集群设计:EMQX采用Masterless的大规模分布式集群架构,实现了系统的高可用性和水平扩展。集群设计包括维护订阅表、路由表和主题树等数据结构,以实现消息转发和投递给各节点上的订阅者。
(6)协议支持:EMQX完全支持MQTT5.0和3.x协议标准,提供了更好的伸缩性、安全性和可靠性。同时,它还提供了对多种其他协议的支持,如WebSocket、TCP、SSL/TLS等。
(7)易用性:EMQX提供了丰富的API和插件管理功能,使得用户可以方便地查看在线客户端信息、踢出客户端、管理插件状态等。它还提供了可视化的管理界面和调试工具,方便用户进行监控和管理。
【1】选择ECS弹性服务器
【2】选择ECS服务器的区域、配置信息、操作系统(我选择的Ubuntu18.0464位)。
【3】购买弹性公网IP,配置带宽。
【4】配置密码
【5】选择购买时长,我这里选择了1个月时长
【6】确认付费付款
收到邮件提醒,服务器创建成功。(为了写教程,花费320元,买了一个月服务器)
【7】返回弹性服务器的控制台
【8】点击服务器名字,可以进入到详情页面。
要确保MQTT服务器常用的几个端口已经开放出出来。
【1】新建连接,选择SSH连接。
【2】填入IP地址、用户名、密码
这里的主机就是填服务器的公网IP地址,密码就是创建服务器输入的密码,用户名直接用root。
【3】点击连接服务器
本章节将介绍如何在Ubuntu系统中下载安装并启动EMQX。
支持的Ubuntu版本:
EMQX支持通过Apt源安装,免除了用户需要手动处理依赖关系和更新软件包等的困扰,具有更加方便、安全和易用等优点。
在命令行终端,复制下面的命令过去,按下回车键。
【1】通过以下命令配置EMQXApt源:
sudoapt-getinstallemqx【3】运行以下命令启动EMQX:
sudosystemctlstartemqx过程如下:
这里面的IP地址,就是自己ECS云服务器的公网IP地址。
打开浏览器后,输入地址后打开的效果:
默认用户名和密码:
下面修改新密码:
这里可以配置MQTT的一些参数,根据自己的需求进行配置。
新建一个客户端,点击连接。
连接之后,然后点击订阅,和发布,如果下面消息能正常的接收。说明MQTT服务器通信是已经正常,没问题了。
并且在这个页面也可以看到主题发布和主题订阅的格式。
端口选择:1883
EMQX默认配置中启用了匿名认证,任何客户端都能接入EMQX。没有启用认证插件或认证插件没有显式允许/拒绝(ignore)连接请求时,EMQX将根据匿名认证启用情况决定是否允许客户端连接。
在订阅主题的页面也可以看到我们客户端设备订阅的主题。
在正式产品里肯定是要启用认证的,不然任何设备都能接入。
下面就介绍如何配置客户端认证。
【1】打开客户端认证页面
【2】选择密码认证
【3】选择内置数据库
【4】设置认证方式(都可以默认,不用改),直接点击创建。
【5】创建成功后,点击用户管理
【6】添加用户
【7】添加成功
【8】添加完毕之后,打开MQTT客户端可以进行测试。
【1】创建数据源
【2】选择内置数据库
【3】完成创建
【4】点击权限管理
【5】选择客户端ID,点击添加
【6】配置权限
在集成选项里,可以对设备数据处理。比如:转发到自己的HTTP服务器,转发到自己其他的MQTT服务器,创建规则,某些事件触发某些动作等等。
选择数据桥接。
可以把数据发送端自己的HTTP服务器,或者发送到其他的MQTT服务器。
选择HTTP服务(如果自己有HTTP服务器,可以将数据转发给自己的HTTP服务器)。
为了方便测试设备间互相订阅主题,数据收发,在客户端认证页面至少添加2个设备。我这里分别添加了test1和test2。
设备A订阅设备B的主题,设备B订阅设备A的主题,实现数据互发。
设备A的MQTT信息:
(1)查询模块是否正常
ATOK(2)获取卡号,查询卡是否插好
AT+CIMI460041052911195OK(3)激活网络
AT+CGATT=1OK(4)获取网络激活状态
AT+CGATT+CGATT:1OK(5)查询网络质量
AT+CSQ+CSQ:26,0OK(6)检查网络状态
AT+CEREG=//检查网络状态+CEREG:0,1//找网成功OK(7)激活GPS
查询激活状态,1表示成功激活AT+QGNSSC+QGNSSC:1OK(9)获取一次GPS定位语句
AT+QGNSSRD="NMEA/RMC"+QGNSSRD:$GNRMC,120715.00,A,3150.78179,N,11711.93433,E,0.000,,310818,,,A,V*19OK(10)连接MQTT服务器
本地设备的LCD显示屏上会显示各种传感器数据,需要用到中文、数字、字母。
当前使用的取模软件如下:
这是软件的设置页面:
传感器上传组合的MQTT主题报文格式如下:
//上报数据sprintf(data_buff,"{\"services\":[{\"service_id\":\"stm32\",\"properties\":{\"DHT11_T\":%d,\"DHT11_H\":%d,\"BH1750\":%d,\"SOIL\":%d,\"DS18B20\":%f,\"MOTOR\":%d,\"mode\":%d,\"MAX_SOIL\":%d}}]}",DHT11_T,DHT11_H,BH1750,SOIL,f_ds18b02,MOTOR,mode,MAX_SOIL);MQTT_PublishData(POST_TOPIC,data_buff,0);手机APP给STM32下发的消息:
下面是ESP8266的特点介绍:
ESP8266是一款Wi-Fi适用的可编程网络单芯片,搭载一个TensilicaL10632-位处理器,可支持802.11b/g/nWi-Fi功能,还有一个低功耗的10-bit精度的模拟/数字信号处理器和高度集成的低功耗,高安全性的TLS/SSL协议核心,能够支持用户终端上的全功能的低成本IoT应用。(3)DHT11温湿度传感器DHT11是一款有已校准数字信号输出的温湿度传感器。其精度湿度±5%RH,温度±2℃,量程湿度595%RH,温度-20+60℃。
DHT11应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性和卓越的长期稳定性。传感器包括一个电阻式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。因此该产品具有品质卓越、超快响应、抗干扰能力强、性价比极高等优点。每个DHT11传感器都在极为精确的湿度校验室中进行校准。校准系数以程序的形式存在OTP内存中,传感器内部在检测信号的处理过程中要调用这些校准系数。单线制串行接口,使系统集成变得简易快捷。超小的体积、极低的功耗,使其成为该类应用中,在苛刻应用场合的最佳选择。产品为4针单排引脚封装,连接方便。
该传感器包括一个电阻式测湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。通过单片机等微处理器简单的电路连接就能够实时的采集本地湿度和温度。DHT11与单片机之间能采用简单的单总线进行通信,仅仅需要一个I/O口。传感器内部湿度和温度数据40Bit的数据一次性传给单片机,数据采用校验和方式进行校验,有效的保证数据传输的准确性。DHT11功耗很低,5V电源电压下,工作平均最大电流0.5mA。
DHT11的技术参数如下:
工作电压范围:3.3V-5.5V工作电流:平均0.5mA输出:单总线数字信号测量范围:湿度20~90%RH,温度0~50℃精度:湿度±5%,温度±2℃分辨率:湿度1%,温度1℃DHT11数字湿温度传感器采用单总线数据格式。即,单个数据引脚端口完成输入输出双向传输。其数据包由5Byte(40Bit)组成。数据分小数部分和整数部分,一次完整的数据传输为40bit,高位先出。
DHT11的数据格式为:8bit湿度整数数据+8bit湿度小数数据+8bit温度整数数据+8bit温度小数数据+8bit校验和。其中校验和数据为前四个字节相加。
作用:连接模块与单片机。
主控CPU采用STM32F103RCT6,这颗芯片包括48KBSRAM、256KBFlash、2个基本定时器、4个通用定时器、2个高级定时器、51个通用IO口、5个串口、2个DMA控制器、3个SPI、2个I2C、1个USB、1个CAN、3个12位ADC、1个12位DAC、1个SDIO接口,芯片属于大容量类型,配置较高,整体符合硬件选型设计。当前选择的这款开发板自带了一个1.4寸的TFT-LCD彩屏,可以显示当前传感器数据以及一些运行状态信息。
特点如下:
1、可以检测周围环境的湿度
2、可以检测周围环境的温度
3、湿度测量范围:20%-95%(0度-50度范围)湿度测量误差:+-5%4、温度测量范围:o度-50度温度测量误差:+-2度
4、工作电压3.3V-5V
5、输出形式数字输出
■模块采用串口(LVTTL)与MCU(或其他串口设备)通信,内置TCP/IP协议栈,能够实现串口与WIFI之间的转换■模块支持LVTTL串口,兼容3..3V和5V单片机系统■模块支持串口转WIFISTA、串口转AP和WIFISTA+WIFIAP的模式,从而快速构建串口-WIFI数据传输方案■模块小巧(19mm*29mm),通过6个2.54mm间距排针与外部连接
一套完整的物联网产品。会分为设备端,服务器,上位机部分。
这个章节,介绍采用Qt开发上位机的过程。利用EMQX提供的API接口与MQTT客户端设备进行通信,完成数据上传,命令下发等功能。
EMQX提供了管理监控RESTAPI,这些API遵循OpenAPI(Swagger)3.0规范。EMQX在RESTAPI上做了版本控制,EMQX5.0.0以后的所有API调用均以/api/v5开头。
比如:我的EMQX服务器是在华为云ECS服务器上搭建,公网IP是:122.112.225.194
那我访问API文档的地址就是下面这样的格式:在浏览器里打开即可。
【2】找到菜单里的系统设置选项-->API密匙。
【3】创建密匙。
【4】填写密匙名称
【5】创建成功
【6】得到APIKey和SecretKey
APIKey:f072a6e9758b8cdfSecretKey:LzwPB71Yf7PTED39C7RGboz9C9ANhv83ULUynTANgog4hG10.4测试API:获取节点信息上一步已经创建好API的访问密匙,这里就以获取节点信息为例,调用获取节点信息的API接口,获取节点信息。
接口在API文档里的介绍:
根据前面的API访问路径规则说明;那么,获取节点信息的API完整访问路径为:
【1】在云服务器上创建一个python文件,方便测试代码
【2】创建之后FinaShell自动上传到服务器
【3】编辑代码
在这里双击要编辑的文件,就可以打开文件进行编辑。默认采用内置的编辑器,也可以选择自己电脑上的外置编辑器。
【4】代码编辑完成,按下键盘快捷键Ctrl+S保存文件内容,保存之后文件内容会自动同步到服务器。
保存后提示,自动上传。
写入的代码如下:
通过返回信息来看,节点信息获取是没有问题的。
在编写代码之前,可以先测试下API接口的效果,可以直接在SwaggerUI界面直接调试API。
例如:以获取以订阅主题列表的API接口为例。
【1】在SwaggerUI界面上找到对应的API接口。
【2】点击API说明,展开详情
【3】点击右边的试试看按钮。
【4】点击执行
【5】然后会弹出提示框,让你填入用户名和密码。
这个用户名和密码就是前面创建API密匙生成的APIKey(用户名)和SecretKey(密码)。
【7】再次点击执行,就可以看到接口返回的数据了。
并且在页面上也写出了,请求的信息。使用curl命令行给出详细的请求过程,参考这个就可以自己写代码了。
【8】API调用,curl命令行执行代码如下:
【1】先找到发布主题的API接口
【2】点击API名字,展开详情
【3】点击右边的Tryitout按钮。
【4】参数填写说明
因为这个接口是发送主题的,需要填参数,填自己需要发布什么主题,什么消息。
出来的框框里就是发布信息,根据自己需要修改。
topic就是发布的主题。payload就是发布的消息内容。只要MQTT客户端订阅了这个主题,就可以收到发布的消息。
这个主题的名字可以随便改的。我这里就用默认的名字和内容测试。
【6】在API调试页面,点击执行
【7】执行之后,在MQTT客户端的就可以收到API下发的消息了。
【8】API接口调用,curl命令行执行的代码如下:
打开下载链接后选择下面的版本进行下载:
qt-opensource-windows-x86-5.12.6.exe13-Nov-201907:283.7GDetails
软件安装时断网安装,否则会提示输入账户。
安装的时候,第一个复选框里勾选一个mingw32编译器即可,其他的不管默认就行,直接点击下一步继续安装。
选择MinGW32-bit编译器:
【1】新建工程
【2】设置工程名字
【3】选择QWiget父类
【4】选择编译套件:如果电脑没有安装VS环境,就选MinGW,这个比较简单没有其他依赖环境问题。具体看自己编译的程序最终在哪里运行,来选择合适的编译器。
【5】创建完成
【6】点击左下角设置发布类型。默认是Debug,选择Release,运行效率高一些(如果需要调试就选择Debug)。
本智慧农业管理系统设计与实现项目基于STM32F103RCT6微控制器为核心,通过集成DHT11温湿度传感器、BH1750光照强度传感器和土壤湿度检测传感器等设备,构建了一套全面的农田环境监测系统。当环境参数超出预设阈值时,系统能够实时报警并自动或提醒进行灌溉、施肥等操作,同时利用蜂鸣器发出声音警报。
本项目的成功实施,不仅有效提升了农业生产过程中的智能化水平,降低了人工管理成本,而且为实现精准农业和智慧农业提供了有力的技术支持。未来,随着物联网技术、云计算和人工智能技术的进一步发展,这套智慧农业管理系统将有望在更多领域推广使用,助力我国现代农业朝着更高效、智能、可持续的方向迈进。