包括电路图,源码设计和上位机设计
ARM-STM32校园创新大赛
题 目: 基于STM32的微型分布式气象站
视频观看地址:http://v.youku.com/v_show/id_XNjEzMzU4NTYw.html
本设计在充分考虑到现有天气气象预报的弊端后,提出了一种气象预报形式。采用一些传感器将气象以及环境信息进行采集,并通过相关的算法对气象惊醒预报。得到的预报信息会通过微博发送出去,是的人们获取气象信息更加的方便。且本设计是对短时间的气象进行预报尽管简单但是能够很好的对现有大众化的气象预报进行了补充。
1. 引言气象信息,在当代社会人们的生活与工作中起着相当重要的作用。实时、准确、便捷的气象服务便于人们更好的进行时间安排。然而,现在普遍的气象服务(比如电视天气预报节目)实时性差、预报的地区范围过大。不能很好的服务广大用户。当然,现有一个便携式的个人气象服务器,但是其价格昂贵且不便于携带。 所以,我们萌发设计一个成本低、实时性好的微型气象服务站。此服务站,由多个气象采集终端组成气象采集的小型网络再通过无线汇总到上位机上上位机通过发微博的方式进行数据共享。本设计的创新点在于,是对短时间的气象预报既能够较为准确的预报 半个小时后到一两个小时间的降雨信息。填补了普通气象预报时间跨度大的问题。(举个例子,普通气象预报预报明天阴转小雨 但是不能够准确的预报是那个时段下雨,本设计可以提前一到半个小时预报降雨情况实时性极好) 本设计还添加了对空气质量的监测,即对空气中微小灰尘的监测(所选的灰尘传感器可对0.8微米以上的微小粒子进行检测,故其中包含了人们关心的PM2.5 与PM10)。 2. 系统方案详细说明系统设计的整体思路,用模块的形式指出系统设计的各个关键点,并指出其中使用的关键算法 (1)系统的总体设计 本设计主要分为三个部分,采集节点、集中器与上位机。三部分协调工作共同完成整个任务。采集节点,是本系统的关键部分,它以STM32F4Discovery为控制核心,通过温湿度传感器DHT11、气压传感器BMP085以及灰尘传感器GP2Y1010对相关信息进行采集。然后,通过气象预报算法对降雨情况进行大概的预报。最后,对相关信息打包发送出去。集中器,主要进行数据的穿法。上位机,承担着人机交互工作并将数据存储到数据库定时发微博。 采集节点,通对各个传感器的数据读取得到相关的气象与环境信息。当采集到一手的气象信息后,会对数据进行处理并根据气压值采用合适的算法进行降雨可能性的预报。采集点会定时的向集中器发送数据,发送的数据打包成一个自己定义的数据帧格式。 集中器,负责将各个采集节点采集上来的数据集中起来,并定时的通过串口发送到上位机。集中器内部开辟了两个字节的存储空间用来存储上位机发送过来的命令,如何在更具命令来做出相应的反应。 上位机,会对上传上来的数据进行存储并且会定时的发送微博实现资源的共享。使用上位机时必须合理的完成配置,特别是串口以及微博授权的配置。对于微博的发送可以在上位机上选择定时发送(一般如此选择),为了避免造成刷屏的尴尬我没设置了手动发送微博的选项。上位机,除去以上功能外还有变化趋势分析以及历史数据查询的功能。 3. 系统硬件设计(1)硬件系统框架图 1)整体硬件框图 采集节点的硬件系统,主要由控制中心、温度采集模块、气压采集模块、空气质量模块与无线通信模块组成。在PC端有一个无线数据接收设备即集中器,集中器是由STM32F107+nRF24L01架构实现。整体结构图如图1所示。 图1
2)采集终端硬件
本模块是以stm32f4discovery为控制核心,传感器方面使用温湿度传感器DNT22对温度以及湿度进行测量,使用BMP085气压传感器对气压进行测量,使用夏普灰尘传感器GP2Y1010AU0F对空气质量 进行检测。并通过LCD12864进行显示。 图2
3)通信部分硬件框图 通信部分,使用nRF24L01进行多点的无线通信。 图3
GP2Y1010的LED控制端要求十分的严格必须按照原理图给出的来做。
图4
BMP085管脚较多,但本次设计仅使用I2C通信即可。当然,去耦电容也是必须的!
图5
4. 系统软件设计采集节点,是本次设计最为关键的部分。其主要完成了对各个传感器的信息的采集、数据处理和信息的定时发送。采集节点上电后,首先对各个传感器及板上资源初始化。然后,会循环读取各个传感器的测量值。最后,判断定时时间是否满足条件。如定时时间到,通过无线发送数据。
1)采集节点主流程介绍 主函数流程图如下: 图6 初始化函数流程图: 图7 气象预报算法介绍 本设计是根据气压值对降雨情况预报的。首先,在晴天情况下测量安装点的气压信息。根据气象学知识我们知道,晴天的情况下气压最高。阴天以及降雨的情况下气压会明显的降低,且如果在半小时内气压发生明显时降雨可能性会明显变大。于是,我们就可以根据气压值得大小即可预报降雨的可能性。
nRF24L01驱动函数介绍: nRF24L01驱动主要是将数据通过SPI写入发送寄存器,并根据状态寄存器来判断是否发送成功!流程图如下。
图8
BMP085驱动函数介绍: BMP085可以同时采集温度和气压值,对于温度的采集仅存在一种精度。但是,气压的精度却存在低、中、高三中精度。软件中的延时要求也是非常严格的。流程图如下。
图9
GP2Y1010驱动函数介绍: GP2Y1010关键点就在于严格的时间延时!必须在280ns读取才能得到正确的数据。 图10
集中器主要将通过无限接收来的数据通过串口发送到PC端!在软件中设计了1个数组2个字节用来接收上位机发送的命令进而控制集中器的运行。流程图如下。 图11
上位机主要对发送上来的数据实时的显示、定时的发送微博与储存到数据库。当然,还包括一些附属功能比如数据的查询以及变化趋势的分析。 上位机软件,编写的难点在于微博的发送与串口数据的读取处理。微博的发送要经过网络,网速的好坏对于软件的影响较大。为力避免网速差而造成的界面卡顿现象我们采用了多线程技术。 C#的串口操作软件数据读取不及时会造成严重的丢包现象。为了解决这个问题,在串口触发函数内仅对数据进行读取不对数据进行任何处理。另外,开辟一个线程专门对数据进行处理。
5. 系统创新我们的主要创新点主要有3处: - 对短时间的气象预报能够较为准确的预报一个小时左右的降雨信息,弥补了现有天气预报时间跨度长的问题!
- 添加了对空气质量的监测,包含了人们关心的PM2.5和PM10灰尘检测!
- 位机接收数据后将数据存储到数据库并在PC上显示,再将数据选择性的发微博!
6. 评测与结论系统主要通关较长时间的运行测试,系统对于温湿度、气压以及灰尘浓度的测量比较精准。但是由于对空气质量的测量只采用的灰尘污染物浓度,而没有采集其他污染物的量造成 空气质量AQI的计算不是很精准。对于降雨可能性的预报,由于数学模型建立的较为简单过预报的不是十分的精准。存在误报显现,但是降雨的情况全能预报出来。故预报结果还能接受。 本次设计,基本满足各方面的要求。预报功能得以实现,但是未来还有很大的完善空间。未来,我们考虑添加位置信息,通对往年相同位置的气象情况进行对比完善我们的预报精度。
附录上位机
采集点
集中器
1.外部晶振(HSE)为8M。
2.在system_stm32f4xx.c中的SystemInit()函数开始添加了FPU控制项。
3.预定义USE_STDPERIPH_DRIVER,STM32F4XX (不适用FPU)
USE_STDPERIPH_DRIVER,STM32F4XX,__FPU_PRESENT=1,__FPU_USED =1 (使用FPU)
4.只添加了标准外设库,DSP(CMSIS内)、USB以及ETH库均为添加。
单片机源程序如下:
- #include "stm32f10x.h"
- #include "bsp.h"
- uint8_t cmIndex=0;//控制索引(0——1)
- uint8_t adIndex=0;
- uint8_t displaytime=0;
- uint8_t rbuf[11]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
- uint8_t TxBuf[6][11]={ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- };
- uint8_t CM_Box[2]={0x00,0x00};//开始信号 与节点数目
- int main()
- {
- uint8_t indexbuf=0;
- uint8_t i=0;
-
- BSP_Init();
- // USART_SendData(USART2,CD_Box[1]);
- // while(USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET) ;
-
- while(1)
- {
- while(CM_Box[0]==0xfa)
- {
- if (NRF24L01_RxPacket( rbuf )==0)
- {
- indexbuf=rbuf[0];
-
- for(i=0;i<11;i++)
- {
- TxBuf[indexbuf][i]=rbuf[i];
- }
-
- }
-
- if(displaytime)
- {
- displaytime=0;
- for(adIndex=0;adIndex<CM_Box[1];adIndex++)
- {
- for(i=0;i<11;i++)
- {
- USART_SendData(USART2,TxBuf[adIndex][i]);
- while(USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET) ;
- }
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
1.基于STM32的气象站预报系统设计(硬件、源码、上位机).rar
(1.91 MB, 下载次数: 113)
|