本文提出了一種基于 STM32單片機(jī)的低功耗、高性能的自動(dòng)氣象站數(shù)據(jù)采集系統(tǒng)設(shè)計(jì)方案。詳細(xì)介紹了系統(tǒng)軟件的設(shè)計(jì)方法,實(shí)現(xiàn)了數(shù)據(jù)的采集、處理及存儲(chǔ),并提供良好的 人機(jī)交互接口,實(shí)現(xiàn)自動(dòng)氣象站數(shù)據(jù)的實(shí)時(shí)顯示與菜單化的界面管理功能。利用ESP8266模塊用wifi將氣象站和移動(dòng)端相連接,達(dá)到遠(yuǎn)程數(shù)據(jù)傳輸和監(jiān)控氣象數(shù)據(jù)的目的。
接下來的內(nèi)容介紹了當(dāng)前氣象站的發(fā)展現(xiàn)狀,分析了一個(gè)氣象站需要具備的特性以及功能,確立了氣象站的設(shè)計(jì)目標(biāo)以及總體設(shè)計(jì)方案,并介紹了該氣象站系統(tǒng)的硬件組成及設(shè)計(jì)理念,分析了所選元器件的優(yōu)勢(shì)及特性。最后通過局域網(wǎng)將氣象站及用戶連接起來,達(dá)到實(shí)時(shí)傳輸數(shù)據(jù)的功能。
該氣象站從實(shí)際應(yīng)用出發(fā),實(shí)現(xiàn)了數(shù)據(jù)的自動(dòng)采集及傳輸,具有體積小、成本低、功耗低、采集速度快等優(yōu)點(diǎn),經(jīng)過包裝后能夠在實(shí)際應(yīng)用中協(xié)助氣象工作的進(jìn)行,具有一定的前景。
與傳統(tǒng)式氣象采集工具相比較,采用微氣候監(jiān)測(cè)系統(tǒng)作為主要觀測(cè)工具將帶來以下明顯優(yōu)點(diǎn): (1)擴(kuò)展氣象觀測(cè)的區(qū)域與密度 自動(dòng)氣象站可以工作在惡劣環(huán)境下,并且不需要固定工作人員值守。既實(shí)現(xiàn)了無人惡劣區(qū) 域的氣象信息的觀測(cè)又降低了人力成本,提高了社會(huì)經(jīng)濟(jì)效益。 (2)提高氣象觀測(cè)的可靠性 自動(dòng)氣象監(jiān)測(cè)系統(tǒng)采用最新技術(shù),傳感器性能相對(duì)優(yōu)異,其采集到的數(shù)據(jù)準(zhǔn)確且可靠,并 且自動(dòng)氣象站通常采用一定的數(shù)據(jù)處理算法,進(jìn)一步提高數(shù)據(jù)的可靠性。 自動(dòng)氣象站安裝維護(hù)方便,不需要固定人員值守,并且體積小,成本低,與專業(yè)人員觀測(cè) 相比大大降低了業(yè)務(wù)費(fèi)用。 (4)易于遠(yuǎn)程監(jiān)控 多臺(tái)自動(dòng)氣象站通?梢越M成觀測(cè)網(wǎng),相互之間通過互聯(lián)網(wǎng)進(jìn)行聯(lián)系,觀測(cè)人員通過專用 配套軟件可以方便的對(duì)各氣象站進(jìn)行監(jiān)測(cè)與維護(hù)。 自動(dòng)氣象站的核心是氣象傳感器,氣象傳感器的性能直接決定采集到的信息是否可靠準(zhǔn)確,一 套自動(dòng)氣象站是否良好直接受限于氣象傳感器,因此,研發(fā)性能優(yōu)異的氣象傳感器是設(shè)計(jì)自動(dòng)氣象 站的首要任務(wù)之一。 因此,一個(gè)現(xiàn)代的氣象站具有集成度高,無人值守,全天候工作,精度高,可靠性高等一系列優(yōu)點(diǎn)。 3 系統(tǒng)方案架構(gòu)及工作原理 設(shè)計(jì)任務(wù) 以stm32為核心,加上多種傳感器組合,將采集到的氣象數(shù)據(jù)顯示在LCD屏幕上,同時(shí)可以通過串口通信以及wifi通信,將采集到的數(shù)據(jù)實(shí)時(shí)的傳輸回PC端及移動(dòng)端。 圖1功能實(shí)現(xiàn)流程圖 4 系統(tǒng)硬件設(shè)計(jì) 總的設(shè)計(jì)原理圖 圖2 項(xiàng)目原理圖 圖3 項(xiàng)目引腳定義圖 4.1 硬件選型 (1)主板采用的是STM32F103C8T6核心板,性價(jià)比高,有著較低廉的的價(jià)格以及良好且低耗的性能。 圖4 STM32F103C8T6原理圖 - 顯示屏選用TFT1.44寸屏幕模塊,用于顯示傳感器采集的數(shù)據(jù)。
- DHT11溫濕度模塊,用于采集溫濕度數(shù)據(jù)。

圖5 DHT11溫濕度模塊原理圖 - 光敏傳感器,光敏電阻用于采集光照強(qiáng)度數(shù)據(jù)。
圖6 光敏傳感器原理圖 (5)霍爾傳感器測(cè)速模塊,用于采集風(fēng)速數(shù)據(jù)。 圖7 霍爾傳感器測(cè)速模塊原理圖 (6)ESP8266wifi模塊,通過wifi進(jìn)行數(shù)據(jù)傳輸,將數(shù)據(jù)傳輸回移動(dòng)端。氣壓檢測(cè)模塊,通過氣壓檢測(cè)推算出所在地的海拔高度。 圖8ESP8266wifi模塊原理圖 (7) PM2.5模塊,檢測(cè)所在地的PM2.5濃度值。 圖8ESP8266wifi模塊原理圖 4.2 功能說明 (1)通過傳感器采集多種氣象數(shù)據(jù),將其顯示在屏幕上。 (2)每隔五秒可以通過網(wǎng)絡(luò)調(diào)試助手傳輸一次數(shù)據(jù)回PC端 (3)通過wifi模塊將數(shù)據(jù)傳輸回移動(dòng)端 圖9 功能說明圖 5 調(diào)試與實(shí)驗(yàn)結(jié)果 圖10 硬件成品圖 圖11 數(shù)據(jù)傳回圖 圖12 數(shù)據(jù)清理后的圖 圖13 BI做的界面圖 6 結(jié)束語 本文提出了一種基于STM32單片機(jī)的低能耗微氣候監(jiān)測(cè)系統(tǒng)的設(shè)計(jì)方案。詳細(xì)介紹了系統(tǒng)的設(shè)計(jì)方法,實(shí)現(xiàn)了數(shù)據(jù)的采集、處理和存儲(chǔ),并提供了良好的人機(jī)交互接口。通過ESP8266模塊可以與移動(dòng)端設(shè)備進(jìn)行實(shí)時(shí)通信。達(dá)到遠(yuǎn)程數(shù)據(jù)實(shí)時(shí)傳輸和監(jiān)控的目的。所設(shè)計(jì)的自動(dòng)氣象站數(shù)據(jù)采集系統(tǒng)具有體積小、成本低、功耗低、采集速度快等優(yōu)點(diǎn),完全滿足了實(shí)際的需要。 - 在硬件方面采用了模塊化的設(shè)計(jì),當(dāng)工作環(huán)境變化是只需要將新的模塊加入到系統(tǒng)中并對(duì)其進(jìn)行簡(jiǎn)單的配置和升級(jí)后即可使用,大大提高了系統(tǒng)的可擴(kuò)展性。
- 利用了STM32芯片低耗高效的原則,且不采用復(fù)雜的嵌入式操作系統(tǒng)軟件設(shè)計(jì),使得氣象站低功耗的要求成為現(xiàn)實(shí)。
- 設(shè)計(jì)的人機(jī)界面簡(jiǎn)潔、直觀、可操作性強(qiáng),不需要專業(yè)的維護(hù)人員便可以維持氣象站的運(yùn)行和簡(jiǎn)單的維護(hù)功能,提高了系統(tǒng)的靈活性。
本文所設(shè)計(jì)的氣象數(shù)據(jù)采集系統(tǒng)觀測(cè)精度高、自動(dòng)化程序高、性價(jià)比高,可適應(yīng) 各種艱苦條件下的工作環(huán)境,長(zhǎng)時(shí)間全天候不間斷地進(jìn)行氣象要素觀測(cè),具有良好的可靠性和穩(wěn)定性。這些特點(diǎn)使得系統(tǒng)具有很高的應(yīng)用價(jià)值和廣闊的市場(chǎng)前景。
單片機(jī)源程序如下:
- #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; //用于延時(shí)函數(shù)計(jì)數(shù)
- u32 dht11_temp; //獲取溫濕度
- u32 temperature_val = 0; //溫度值
- u32 humidity_val = 0; //濕度值
- u16 led_count = 0; //LED計(jì)數(shù)閃爍
- u16 light_val = 0; //光強(qiáng)值
- u8 ID = 0;
- u8 srr_temp1[200];
- u8 win_direction = 0; //風(fēng)向值 【1:東南風(fēng) 2:東風(fēng) 3:東北風(fēng) 4:北風(fēng) 5:西北風(fēng) 6:西風(fēng) 7:西南風(fēng)】
- char *win_str;
- float speed_temp = 0; //霍爾元件計(jì)數(shù)緩存值
- float speed_val = 0; //風(fēng)速值
- float pm25_val = 0; //PM2.5值
- _Bool send_flag = 1;
- int main(void)
- {
- SysTick_Config(SystemCoreClock/1000);//系統(tǒng)時(shí)鐘初始化
- Delay_Ms(100); //延遲100ms
-
- /****************************第一部分初始化************************************/
- LED_Init(); //LED燈初始化
- Lcd_Init(); //屏幕初始化
- EXTI_KEY_Config();//按鍵初始化
- UART1_Init(); //波特率115200 用于串口調(diào)試
- UART3_Init(); //USART3配置 ESP8266串口通訊
-
- dht11_init(); //DHT11溫濕度模塊初始化
- speed_init(); //風(fēng)速驅(qū)動(dòng)初始化
- ADC1_Init(); //ADC初始化,用于測(cè)光照強(qiáng)度、風(fēng)向、PM2.5
- BMP_Init(); //氣壓驅(qū)動(dòng)初始化
- BMP_ReadCalibrationData(); //從BMP180的獲取計(jì)算參數(shù)
- Delay_Ms(1000); //延遲200ms
- printf("Init over !\r\n");
- main_Demo(); //顯示主界面
- /****************************第二部分連接WIFI連接服務(wù)器************************************/
- Lcd_Clear(BLACK);
- Gui_DrawFont_GBK16(0,60,WHITE,BLACK,"wait for wifi.");
- while(!CheckEsp())Delay_Ms(100);//檢測(cè)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);
- /****************************第三部分測(cè)量數(shù)據(jù)************************************/
- while(1)
- {
- /*****獲取溫度、濕度*****/
- // dht11_temp = dht11_read();
- // show_dht11(dht11_temp);
- // printf("Moisture :%u%% Temperature:%uC \r\n",temperature_val,humidity_val );
-
- /*****獲取風(fēng)速*****/
- // speed_val = speed_temp/30.0;
- // printf("speed:%0.2f\r\n",speed_val);
- // speed_temp = 0;
-
- /*****獲取光強(qiáng)*****/
- // light_val = Read_Light();
- // printf("light_val:%u\r\n",light_val);
-
- /*****獲取風(fēng)向*****/
- // 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);
-
- /*****獲取大氣壓強(qiáng)*****/
- // 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);
-
-
- /*****獲取所有數(shù)據(jù)*****/
- dht11_temp = dht11_read(); /*****獲取溫度、濕度*****/
- speed_val = speed_temp/30.0;speed_temp = 0; /*****獲取風(fēng)速*****/
- light_val = Read_Light(); /*****獲取光強(qiáng)*****/
- win_direction = Read_Wind();/*****獲取風(fēng)向*****/
- pm25_val = Read_PM25(); /*****獲取PM2.5*****/
- ID = BMP_ReadOneByte(0xd0);/*****獲取大氣壓強(qiáng)*****/
- BMP_UncompemstatedToTrue();
-
- //根據(jù)風(fēng)向的ADC值轉(zhuǎn)化成字符串
- 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="西南";
-
- //屏幕顯示數(shù)據(jù)
- show_data(dht11_temp,speed_val,light_val,win_str,bmp180.p,bmp180.altitude,pm25_val);
-
-
- if(send_flag)//TCP發(fā)送數(shù)據(jù) KEY控制開關(guān)
- {
- snprintf((char *)srr_temp1,sizeof(srr_temp1),
- "{\"Data\":[\"temp\":\"%u\",\"humi\":\"%u\",\"speed\":\"%0.1f\",\"light\":\"%d\",\"direction\":\"%s風(fēng)\",\"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--;}
復(fù)制代碼
51hei.png (5.13 KB, 下載次數(shù): 43)
下載附件
2021-5-2 16:23 上傳
下位機(jī)STM32源程序分享:
基于STM32大棚系統(tǒng).7z
(5.89 MB, 下載次數(shù): 82)
2021-5-2 16:20 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|