收藏官网首页
查看: 4816|回复: 0

[分享] 【IoT毕设.4.1】STM32+机智云AIoT+猪舍监测与系统软件设计

682

主题

741

帖子

3万

积分

版主

Rank: 7Rank: 7Rank: 7

积分
36647
跳转到指定楼层
楼主
 楼主| 发表于 2022-7-21 18:11:59 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
校园创客福利
本帖最后由 Kara 于 2022-7-21 18:29 编辑

【IoT毕设.4.1】STM32+机智云AIoT+猪舍监测与系统软件设计

第一篇内容:绪论,研究的意义和内容

第二篇内容:系统总体方案设计

第三篇内容:系统硬件设计

第四篇内容:系统软件设计
硬件是系统的躯体,软件就是系统的灵魂,软件设计在系统开发过程中占据非常重要的地位。本系统软件设计主要由STM32单片机软件程序设计、esp8266WIFI通信模块固件软件实现、机智云平台设计与实现、手机APP软件设计与实现四部分组成。本章将详细阐述这四个部分设计方案与实现方法。
4.1 STM32单片机软件程序设计

本系统采用STM32F407ZGT6单片机作为下位机主控制芯片,主要实现以下功能:
(1) 监测功能:监测环境温度、湿度、光照强度、氨气浓度、是否下雨、是否有火焰、是否有人靠近。
(2) 控制功能:在自动模式或者手动模式下控制猪舍内的保温灯、照明灯、换气扇、喷水泵、电动卷帘以及蜂鸣器工作。
(3) 显示功能:借助LCD屏幕显示监测数据以及电气化设备状态。
(4) 通信功能:接收来自云端的指令数据,发送本地数据。

本小节将从STM32程序开发环境、主程序设计、检测子程序设计、显示子程序设计、自动模式子程序设计以及手动模式子程序设计共计六个方面,详细介绍STM32单片机软件程序设计。

4.1.1  STM32程序开发环境

在本设计中,下位机部分采用C语言进行程序开发。C语言是一门面向过程的高级语言,广泛应用于嵌入式软件开发[53],它以简易的方式编译代码、能够灵活操作寄存器等存储器,代码量较其他语言较小、可移植性高、可读性高、运行速度快,非常适合本系统的硬件部分软件功能程序开发。

用来开发下位机软件的集成开发环境(IDE)是KeilUvision5MDK,该软件为基于Cortex-M、Cortex-R4、ARM7、ARM9的处理器提供了一个完整的开发环境[54]。它是专门针对以ARM为核心的单片机系列的开发编程工具,具有功能强大、易学易用的特点,能够满足绝大多数的嵌入式应用开发场景,中国有80%以上的软硬件工程师都在使用,深受大众喜欢。该软件集成了编码、链接、编译、仿真、调试、下载六项功能于一体,大大节省了软件开发人员的时间,提升了开发效率。更重要的是,目前市场上没有可替代的产品,该软件开发平台界面如图4.1所示。
图4.1KeilUvision5开发平台界面

本次开发使用Keil软件编码,使用J-link仿真器对程序进行下载和仿真。具体实验操作步骤如下:
(1) 打开keil软件,创建新项目,根据使用的单片机来确定具体的单片机芯片型号,根据系统功能完成对应的程序代码编写。
(2) 编码结束后,编译代码,检查报错信息。
(3) 查找报错原因,修改代码至报错为0。
(4) 进行相关功能的仿真调试。
(5) 生成后缀为hex的目标文件,并将该文件烧录单片机中运行。
(6) 在单片机上进行测试,验证功能的完整性。

4.1.2  主程序设计

硬件设备上电之后,首先进行通信协议初始化,然后对硬件各部分进行初始化。硬件部分初始化主要包括各电气化设备初始化、WIFI模块初始化等。

接着进入While(1)循环。首先获取服务器端通过串口传输的猪只数据,获取各传感器检测的环境因子,并将环境数据显示在LCD显示屏上。然后开始连接WIFI,定义一个wifi_sta,该参数表示WIFI连接状态,当为1时表示连接成功;当为0时表示连接失败。连接失败则直接进入自动模式子程序,其中无人报警模式默认开启,然后回到获取环境数据的步骤,循环进行。所以在联网失败的情况下,本系统也是一个独立的自动控制系统。

WIFI连接成功后则将获取的数据发送至云端,并且获取云端指令。云端指令是字典格式,包括系统工作模式、无人报警模式、照明灯、保温灯、换气扇、喷水泵、电动卷帘以及蜂鸣器的key和value值。所以需要将指令进一步解析为单独的数据并存储,方便为后续的控制做判断。

系统工作模式分为自动模式和手动模式,二者间的切换由系统内定义的Auto_Mode参数实现,其类型为布尔型。Auto_Mode为1时,表示自动模式;Auto_Mode为0时,表示手动模式。通过判断该参数状态,进入手动模式子程序或者自动模式子程序。两种模式控制结束后,将所有电气化设备状态数据上传至云端,主程序流程图如图4.2所示。
图4.2主程序流程图

4.1.3  检测子程序设计

检测子程序涉及六个传感器检测,分别是DHT11温湿度传感器、光照强度传感器、氨气传感器、雨滴传感器、火焰传感器以及人体感应传感器。首先进行各传感器初始化,再进行数据采集,接着进行数据的处理和上传,流程图如图4.3所示。
图4.3检测子程序流程图


1, 温湿度传感器

DHT11温湿度传感器通过DHT11_Init()方法进行初始化,成功则返回Bool值为1,失败则返回Bool值为0。进行端口初始化之后通过DHT11_Check()方法检查DHT11是否初始化成功,只有当初始化程序返回的DHT11_Check值为1时才能进行温湿度读取,读取程序如下:
u8DHT11_Read_Data(u8*temp,u8*humi)//读取数据整体


2、光照强度传感器

光照强度传感器采用IIC总线进行数据读取,需要占用2个GPIO端口进行数据传输,其中1个GPIO端口作为时钟总线。运行TaskBH1750()方法即可实现对光照强度数据的读取,其中包含了该传感器启动函数、数据读取函数以及数据转换函数,最终直接得到光照强度数据。因为光照强度容易变化,取两次检测结果的平均值作为最后的光照强度数据,具体代码如下:
intTaskBH1750()
{
Start_BH1750();delay_ms(180);
Read_BH1750();//readsensorlight_result=Convert_BH1750();//convertresult(lux)returnlight_result;}
GuangQiang=(TaskBH1750()+TaskBH1750())/2;

3、氨气传感器
氨气传感器的AO输出端口与单片机PA5相连,使用ADC1。首先对ADC进行初始化,其中设置ADC1端口为模拟输入,为了数据的稳定性,采样20次并求平均,代码如下:
Ammonia_adc=Get_Adc_Average(ADC_Channel_5,20);

将获取的平均ADC值转换为输出电压VRL其中VC表示参考电压5V,Ammonia_adc为获取的ADC值。
再根据公式将电压值转换为相对准确的浓度值。MQ137传感器并没有给出具体的计算公式,只有传感器特性,所以需要根据传感器特性取数值进行拟合。传感器特性中给出了几种气体浓度与RS/RO的关系图,RS表示传感器在不同浓度气体中的电阻值,RO表示传感器在洁净空气中的电阻值[55]。

4、雨滴、火焰、人体感应传感器

雨滴传感器、火焰传感器以及人体感应传感器工作原理相似,输出都为高、低电平,可看作为开关器件。首先将三个传感器连接的端口进行初始化,然后通过宏定义,进行GPIO读取输入数据,三个宏定义如下:
#defineSWICH_FIREGPIO_ReadInputDataBit(GPIOG,GPIO_Pin_10)//Raindrop#defineSWICH_HUMANGPIO_ReadInputDataBit(GPIOG,GPIO_Pin_0)//Fire#defineSWICH_RAINGPIO_ReadInputDataBit(GPIOG,GPIO_Pin_3)//Human
定义三个触发标志位代码如下:
#defineSWICH_RAIN_ON#defineSWICH_FIRE_ON#defineSWICH_HUMAN_ON

获取传感器状态代码如下:
u8SWICH_RAIN_Scan()
{if(SWICH_RAIN==0)returnSWICH_RAIN_ON;
elsereturn0;}
u8SWICH_FIRE_Scan()
{if(SWICH_FIRE==0)returnSWICH_FIRE_ON;
elsereturn0;}
u8SWICH_HUMAN_Scan()
{if(SWICH_HUMAN==0)returnSWICH_HUMAN_ON;
elsereturn0;}

最后获取三个传感器的电平值,具体代码如下:Rain_flag=SWICH_RAIN_Scan();Fire_flag=SWICH_FIRE_Scan();Human_flag=SWICH_HUMAN_Scan();

4.1.4  显示子程序设计

首先进行LCD屏幕使用的引脚初始化,再初始化通信协议以及用于存储的存储寄存器。然后接收待显示数据,将LCD屏幕对应区域内容清空,最后循环显示数据,程序流程如图4.4所示。在本部分还需要控制LCD显示汉字,所以需要导入字库。通过SD卡,将字库复制到外部FLASH芯片W25Q128中存储,此时W25Q128就相当于汉字字库芯片。通过查询汉字内码(GBK/GB2312),查找点阵库中对应汉字的点阵数据,接着单片机进行解析,最后在LCD上进行显示。
图4.4显示子程序流程图
4.1.5  自动模式子程序设计

自动模式下,系统将根据各传感器检测的环境数据对相应的电气化设备进行控制,判断其是否动作。自动模式的意义在于能够使环境因子无需人工控制即可稳定的维持在一定范围内,并且在防雨、防火、防盗方面起到积极作用,能够有效降低饲养员劳动强度。自动模式子程序流程图如图4.5所示,依次进行温湿度调控、光照强度调控、雨滴控制以及火焰、行人报警子程序。所有控制结束后,会采集所有电气化设备状态,并将其显示在LCD屏幕上。

图4.5自动模式子程序流程图

1、温湿度调控子程序
进入自动模式后,首先进入温湿度调控子程序,温湿度对应保温灯、换气扇以及喷水泵控制。当温度低于20℃时,打开保温灯进行升温;当温度大于40℃时,打开换气扇以及喷水泵,达到强效降温的目的;当温度大于35℃时,为了避免高温高湿的不利情况,打开换气扇达到继续降温以及降低湿度的目的,流程图如图4.6所示。
图4.6温湿度调控子程序流程图

1,  光照强度调控子程序

光照强度对应照明灯控制。进入该子程序,首先通过wifi_sta参数判断当前设备连接WIFI情况。设备处于联网情况时,可以通过gizwitsGetNTP()方法获取网络时间。设置6:00-21:00为猪只自由采食时间,在这个时间段内检测的光照强度低于设置的阈值即150Lux时,打开照明灯达到辅助照明的目的。若设备处于非联网情况下,则直接判断光照强度是否低于阈值,流程图如图4.7所示。
图4.7光照强度调控子程序流程图

3,雨滴控制子程序

雨滴监测对应电动卷帘控制,当有雨且当前卷帘状态为开启时,关闭卷帘,表现为舵机顺时针转动;当无雨且当前卷帘状态为关闭时,开启卷帘,表现为舵机逆时针转动,流程图如图4.8所示。

4、火焰、行人报警子程序

行人监测与火焰监测都对应蜂鸣器控制,当饲养员在现场时不会触发报警,所以无人报警模式的设计是为了表示饲养员是否在现场。该模式由饲养员在手机APP上手动设置,切换由系统内定义的Human_Mode参数实现,类型为布尔型。Human_Mode=1时表示该模式开启;Human_Mode=0时表示模式关闭。

当无人报警模式开启时代表饲养员不在现场,监测到有人靠近或者监测到火焰时,打开蜂鸣器;否则关闭蜂鸣器。当无人报警模式关闭时代表饲养员在现场,则不考虑报警情况,流程图如图4.9所示。

图4.9火焰、行人报警子程序流程图

4.1.6  手动模式子程序设计

手动模式下,人工将接管系统所有控制权限,系统将根据云端指令控制对应的设备动作。手动模式的意义在于当人工需要接管系统控制时,系统只响应人工控制信号。

进入手动模式后,对解析后的云端下发控制指令进行判断,依序进行保温灯控制、照明灯控制、喷水泵控制、换气扇控制、电动卷帘控制以及蜂鸣器控制。所有控制结束后,会采集控制元件状态并将其发送到LCD屏幕上进行显示,流程图如图4.10所示。


未完待续
下一篇内容:4.2   ESP8266WIFI通信模块固件软件实现
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

加入Q群 返回顶部

版权与免责声明 © 2006-2024 Gizwits IoT Technology Co., Ltd. ( 粤ICP备11090211号 )

快速回复 返回顶部 返回列表