NEWS CENTER
新闻资讯
展开分类
收起分类

环境监测系统软件部分的编程实现!

来源:三水智能化环境监测 发布时间:2020-05-15 关键词: 环境监测系统

由于环境监测系统涉及的传感器及通信接口较多,如USART、SPI、I2C等,所以设置硬件状态标志及软件事件队列时,分别储存底层的硬件触发标志和需要处理的软件事件。环境监测系统软件设计时,注意函数封装,基于STM32标准外设库基础上,逐个优化,方便读取和修改代码。环境监测系统总体流程图如图所示。

环境监测系统软件部分的编程实现!

环境监测系统上电后,先进行系统时钟初始化、外部事件中断配置、串口初始化、I2C配置及LCD初始化,为后续处理做准备,读取BMP180校准系数及初始化PMS5003和QQ物联模块,并进入队列事件循环,不断执行处理底层硬件触发事件和事件处理队列,及时更新LCD液晶屏。该流程包括HalEvent( )和ManageEvent( )两个重要函数,前者用来处理各种底层触发事件,后者用来处理事件队列事件。其中,HalEvent( )函数的关键代码如下:

if(status_hal& HALEVENT_FLAG_UART_READ)

Get_UART_Data(Rx_Data_len,LumMod_Rx_Buf);//从串口读数据

if(status_hal& HALEVENT_FLAG_TIM3_OVR)

TIME_10ms( );//处理10 ms数据,模拟分时处理

if(status_hal& HALEVENT_FLAG_KEY_INT)

Key_handle( );//处理按键事件

在硬件中断及软件处理环节中若需要后续软件处理的情况,会在相应环节将需要处理的事件写入事件队列,ManageEvent( )会选取优先事件进行处理,实现队列的管理。其算法如下所示。

if(!(isEmpty( ))) cmd=ReadEventList( );//若是列表不为空则读取指令进行分析

switch(cmd&0xff00)

{

case EVENT_TIME_100 ms: Time_100 ms_handle( );

break; // 每100 ms对相应要处理的事情进行一次判断

case EVENT_TIME_SECOND:One_Second_handle( );

break; // 每秒对要处理的事情进行一次判断

case EVENT_READ_SENSOR_DATA:Read_Sensor( );

break; // 发送命令读取传感器数据

case EVENT_WIFI_WIFI_RESET:wifi_reset( );

break; // 重启WIFI模块

case EVENT_WIFI_SMART_LINK:wifi_Goto_Smartlink( );

break; // 令WIIF进入SMARTlink模式

case EVENT_WIFI_READ_STATUS:Read_Wifi_STATUS( );

break; // 读WIFI模块状态

case EVENT_WIFI_SEND_QQ_TEXT:Send_TEXT_TO_QQ( );

break; // 向QQ聊天界面发送消息(实时推送到QQ消息)

case EVENT_SEND_AQI_TO_WIFI: Send_AQI_To_QQ_H5( );

break; // 向QQ H5设备界面发送数据

case EVENT_SEND_TEMP_TO_WIFI: Send_Temperature_To_QQ_H5( );

break; // 向QQ H5设备界面发送数据

default:

break;

}