本文提出了一种基于 STM32单片机的低功耗、高性能的自动气象站数据采集系统设计方案。详细介绍了系统软件的设计方法,实现了数据的采集、处理及存储,并提供良好的 人机交互接口,实现自动气象站数据的实时显示与菜单化的界面管理功能。利用ESP8266模块用wifi将气象站和移动端相连接,达到远程数据传输和监控气象数据的目的。
接下来的内容介绍了当前气象站的发展现状,分析了一个气象站需要具备的特性以及功能,确立了气象站的设计目标以及总体设计方案,并介绍了该气象站系统的硬件组成及设计理念,分析了所选元器件的优势及特性。最后通过局域网将气象站及用户连接起来,达到实时传输数据的功能。
该气象站从实际应用出发,实现了数据的自动采集及传输,具有体积小、成本低、功耗低、采集速度快等优点,经过包装后能够在实际应用中协助气象工作的进行,具有一定的前景。
与传统式气象采集工具相比较,采用微气候监测系统作为主要观测工具将带来以下明显优点: (1)扩展气象观测的区域与密度 自动气象站可以工作在恶劣环境下,并且不需要固定工作人员值守。既实现了无人恶劣区 域的气象信息的观测又降低了人力成本,提高了社会经济效益。 (2)提高气象观测的可靠性 自动气象监测系统采用最新技术,传感器性能相对优异,其采集到的数据准确且可靠,并 且自动气象站通常采用一定的数据处理算法,进一步提高数据的可靠性。 自动气象站安装维护方便,不需要固定人员值守,并且体积小,成本低,与专业人员观测 相比大大降低了业务费用。 (4)易于远程监控 多台自动气象站通常可以组成观测网,相互之间通过互联网进行联系,观测人员通过专用 配套软件可以方便的对各气象站进行监测与维护。 自动气象站的核心是气象传感器,气象传感器的性能直接决定采集到的信息是否可靠准确,一 套自动气象站是否良好直接受限于气象传感器,因此,研发性能优异的气象传感器是设计自动气象 站的首要任务之一。 因此,一个现代的气象站具有集成度高,无人值守,全天候工作,精度高,可靠性高等一系列优点。 3 系统方案架构及工作原理 设计任务 以stm32为核心,加上多种传感器组合,将采集到的气象数据显示在LCD屏幕上,同时可以通过串口通信以及wifi通信,将采集到的数据实时的传输回PC端及移动端。 图1功能实现流程图 4 系统硬件设计 总的设计原理图 图2 项目原理图 图3 项目引脚定义图 4.1 硬件选型 (1)主板采用的是STM32F103C8T6核心板,性价比高,有着较低廉的的价格以及良好且低耗的性能。 图4 STM32F103C8T6原理图 - 显示屏选用TFT1.44寸屏幕模块,用于显示传感器采集的数据。
- DHT11温湿度模块,用于采集温湿度数据。
图5 DHT11温湿度模块原理图 图6 光敏传感器原理图 (5)霍尔传感器测速模块,用于采集风速数据。 图7 霍尔传感器测速模块原理图 (6)ESP8266wifi模块,通过wifi进行数据传输,将数据传输回移动端。气压检测模块,通过气压检测推算出所在地的海拔高度。 图8ESP8266wifi模块原理图 (7) PM2.5模块,检测所在地的PM2.5浓度值。 图8ESP8266wifi模块原理图 4.2 功能说明 (1)通过传感器采集多种气象数据,将其显示在屏幕上。 (2)每隔五秒可以通过网络调试助手传输一次数据回PC端 (3)通过wifi模块将数据传输回移动端 图9 功能说明图 5 调试与实验结果 图10 硬件成品图 图11 数据传回图 图12 数据清理后的图 图13 BI做的界面图 6 结束语 本文提出了一种基于STM32单片机的低能耗微气候监测系统的设计方案。详细介绍了系统的设计方法,实现了数据的采集、处理和存储,并提供了良好的人机交互接口。通过ESP8266模块可以与移动端设备进行实时通信。达到远程数据实时传输和监控的目的。所设计的自动气象站数据采集系统具有体积小、成本低、功耗低、采集速度快等优点,完全满足了实际的需要。 - 在硬件方面采用了模块化的设计,当工作环境变化是只需要将新的模块加入到系统中并对其进行简单的配置和升级后即可使用,大大提高了系统的可扩展性。
- 利用了STM32芯片低耗高效的原则,且不采用复杂的嵌入式操作系统软件设计,使得气象站低功耗的要求成为现实。
- 设计的人机界面简洁、直观、可操作性强,不需要专业的维护人员便可以维持气象站的运行和简单的维护功能,提高了系统的灵活性。
本文所设计的气象数据采集系统观测精度高、自动化程序高、性价比高,可适应 各种艰苦条件下的工作环境,长时间全天候不间断地进行气象要素观测,具有良好的可靠性和稳定性。这些特点使得系统具有很高的应用价值和广阔的市场前景。
单片机源程序如下:
- #include "stm32f10x.h"
- #include "delay.h"
- #include "led.h"
- #include "uart.h"
- #include "Lcd_Driver.h"
- #include "TFT_demo.h"
- #include "GUI.h"
- #include "dht11.h"
- #include "speed.h"
- #include "adc.h"
- #include "bmp180.h"
- #include "AT_ESP.h"
- #include "key.h"
-
- u32 TimingDelay = 0; //用于延时函数计数
- u32 dht11_temp; //获取温湿度
- u32 temperature_val = 0; //温度值
- u32 humidity_val = 0; //湿度值
- u16 led_count = 0; //LED计数闪烁
- u16 light_val = 0; //光强值
- u8 ID = 0;
- u8 srr_temp1[200];
- u8 win_direction = 0; //风向值 【1:东南风 2:东风 3:东北风 4:北风 5:西北风 6:西风 7:西南风】
- char *win_str;
- float speed_temp = 0; //霍尔元件计数缓存值
- float speed_val = 0; //风速值
- float pm25_val = 0; //PM2.5值
- _Bool send_flag = 1;
- int main(void)
- {
- SysTick_Config(SystemCoreClock/1000);//系统时钟初始化
- Delay_Ms(100); //延迟100ms
-
- /****************************第一部分初始化************************************/
- LED_Init(); //LED灯初始化
- Lcd_Init(); //屏幕初始化
- EXTI_KEY_Config();//按键初始化
- UART1_Init(); //波特率115200 用于串口调试
- UART3_Init(); //USART3配置 ESP8266串口通讯
-
- dht11_init(); //DHT11温湿度模块初始化
- speed_init(); //风速驱动初始化
- ADC1_Init(); //ADC初始化,用于测光照强度、风向、PM2.5
- BMP_Init(); //气压驱动初始化
- BMP_ReadCalibrationData(); //从BMP180的获取计算参数
- Delay_Ms(1000); //延迟200ms
- printf("Init over !\r\n");
- main_Demo(); //显示主界面
- /****************************第二部分连接WIFI连接服务器************************************/
- Lcd_Clear(BLACK);
- Gui_DrawFont_GBK16(0,60,WHITE,BLACK,"wait for wifi.");
- while(!CheckEsp())Delay_Ms(100);//检测ESP01
- while(ConnectWiFi("yyt","20000412")==0);//连接指定WIFI
- Lcd_Clear(BLACK);
- Gui_DrawFont_GBK16(25,40,WHITE,BLACK,"Wifi OK !");
- printf("wifi ok!\r\n");
- while(ConnectServer("172.20.10.2","6666",0)==0);
-
- SendStringDataToServer("Connect...");//连接指定TCPServer
- Lcd_Clear(BLACK);
- /****************************第三部分测量数据************************************/
- while(1)
- {
- /*****获取温度、湿度*****/
- // dht11_temp = dht11_read();
- // show_dht11(dht11_temp);
- // printf("Moisture :%u%% Temperature:%uC \r\n",temperature_val,humidity_val );
-
- /*****获取风速*****/
- // speed_val = speed_temp/30.0;
- // printf("speed:%0.2f\r\n",speed_val);
- // speed_temp = 0;
-
- /*****获取光强*****/
- // light_val = Read_Light();
- // printf("light_val:%u\r\n",light_val);
-
- /*****获取风向*****/
- // win_direction = Read_Wind();
- // printf("win_dir:%u\r\n",win_direction);
-
- /*****获取PM2.5*****/
- // pm25_val = Read_PM25();
- // printf("pm25_val:%0.2f\r\n",pm25_val);
-
- /*****获取大气压强*****/
- // ID = BMP_ReadOneByte(0xd0);
- // BMP_UncompemstatedToTrue();
- // printf("ID = %d\t temp = %d.%dC\t Pressure = %ldPa\t Altitude = %.5fm\r\n",ID,bmp180.Temp/10,bmp180.Temp%10,bmp180.p,bmp180.altitude);
-
-
- /*****获取所有数据*****/
- dht11_temp = dht11_read(); /*****获取温度、湿度*****/
- speed_val = speed_temp/30.0;speed_temp = 0; /*****获取风速*****/
- light_val = Read_Light(); /*****获取光强*****/
- win_direction = Read_Wind();/*****获取风向*****/
- pm25_val = Read_PM25(); /*****获取PM2.5*****/
- ID = BMP_ReadOneByte(0xd0);/*****获取大气压强*****/
- BMP_UncompemstatedToTrue();
-
- //根据风向的ADC值转化成字符串
- if(win_direction == 1)win_str="东南";
- else if(win_direction == 2)win_str="东 ";
- else if(win_direction == 3)win_str="东北";
- else if(win_direction == 4)win_str="北 ";
- else if(win_direction == 5)win_str="西北";
- else if(win_direction == 6)win_str="西 ";
- else if(win_direction == 7)win_str="西南";
-
- //屏幕显示数据
- show_data(dht11_temp,speed_val,light_val,win_str,bmp180.p,bmp180.altitude,pm25_val);
-
-
- if(send_flag)//TCP发送数据 KEY控制开关
- {
- snprintf((char *)srr_temp1,sizeof(srr_temp1),
- "{\"Data\":[\"temp\":\"%u\",\"humi\":\"%u\",\"speed\":\"%0.1f\",\"light\":\"%d\",\"direction\":\"%s风\",\"p\":\"%ld\",\"altitude\":\"%.1f\",\"pm25\":\"%0.1f\"]}",
- temperature_val,humidity_val,speed_val,light_val,win_str,bmp180.p,bmp180.altitude,pm25_val);
-
- SendStringDataToServer((char *)srr_temp1);
- }
- Delay_Ms(5000); //延迟
- }
- }
- void SysTick_Handler(void){TimingDelay--;}
复制代码
下位机STM32源程序分享:
基于STM32大棚系统.7z
(5.89 MB, 下载次数: 82)
|