快速实现一个室内空气质量检测仪
??冬天我們大多會關閉門窗,而依靠暖通空調設備來維持室內溫度。而在保證居室溫度的同時,我們也希望保持居室內大氣環境的健康度。鑒于此,我們設計了一個簡單的室內空氣質量檢測器。
1、系統概述
??我們依靠暖通空調設備來維持室內溫度、濕度和通風水平,以保證居住者的健康和舒適。所以我們希望設計一個小巧的、簡單的、低成本室內空氣質量檢測器來隨時監測我們居室內的空氣質量。
??一般來說,我們關心的居室環境的溫度、濕度、可吸入顆粒物濃度、揮發性有機物的濃度等。當然還有二氧化炭濃度等其它一些參數,不過這次我們只考慮溫度、濕度、可吸入顆粒物濃度、揮發性有機物的濃度。
??對于這個室內空氣檢測器,我們的基本想法是設計一個可以快速成型、監測溫度、濕度、可吸入顆粒物濃度、揮發性有機物濃度的手持設備。這臺室內空氣質量檢測器溫濕度、可吸入顆粒物濃度、揮發性有機物濃度并可以實時顯示出來,并可以將檢測出的數據向外傳送。
2、硬件設計
??根據前面的描述,我們使用一個溫濕度傳感器來監測溫度和濕度、一個可吸入顆粒物激光檢測傳感器來檢測可吸入顆粒物濃度,一個VOC傳感器來檢測揮發性有機物濃度。
??為了快速實現一個室內空氣質量檢測器,我們采用我們所熟知的傳感器及其他相應設備來實現。我們使用SHT20來實現溫濕度數據的檢測;使用SGP40來檢測VOC濃度;使用HLPM025K3激光PM2.5傳感器來檢測可吸入顆粒物濃度;使用OLED來顯示數據;使用串口來實現數據的傳送。而處理器我們采用STM32F103C8T6來實現。
??HLPM025K3激光PM2.5傳感器數據接口為TTL串行口,所以我們采用USART1端口來與之通訊。SHT20傳感器的數據接口為I2C接口,我們使用I2C1來與之通訊。SGP40傳感器數據接口為I2C接口,我們使用I2C2來與之通訊。顯示屏我們采用了SPI接口的0.96寸OLED,所以我們使用SPI1端口來與之通訊。數據傳輸我們采用USART2端口來實現。所以我們設計室內空氣質量檢測器的組成結構圖如下:
??根據上述分析及結構示意圖,我們就能很容易的設計出室內空氣質量檢測器的控制板。
3、軟件實現
??我們已經描述了室內空氣質量檢測器的控制板及各部分組件,接下來我們需要實現相應的軟件功能。
3.1、數據采集
??數據的采集主要包括三個方面:一是使用SHT20采集溫濕度數據;二是使用SGP40來采集VOC濃度數據;三是使用HLPM025K3激光PM2.5傳感器來檢測可吸入顆粒物濃度數據。這些數據的采集并不麻煩,在以前的文章中我們已經簡述多這些設備的驅動程序的設計。在這里我們直接使用已經封裝過的驅動程序來實現就可以了。
??HLPM025K3激光PM2.5傳感器通過串口輸出數據,包括PM2.5和PM10的數據,我們使用封裝的驅動程序可以很方便的獲取和解析對應的數據。具體的實現程序如下:
HlpmObjectType hlpm; //聲明對象/*PM25數據采集處理*/ void Ampm25DataProcess(void) {/*解析PM2.5和PM10的數據*/ParsingPMData(&hlpm);aPara.phyPara.pm10Value=hlpm.pm100;aPara.phyPara.pm25Value=hlpm.pm25; }/*PM25數據采集配置*/ void Ampm25Configuration(void) {/* PM25相關GPIO初始化配置 */Ampm25_GPIO_Initialization();/* USART1端口初始化配置 */USART1_Init_Configuration();/*允許數據發送*/AMPM25_RUNNING_ENABLE();/*HLPM對象初始化函數*/HlpmInitialization(&hlpm); }??需要注意的是HLPM025K3激光PM2.5傳感器有一個測量控制信號,必須提供高電平才會工作。
??同樣測量其它的參數也是使用我們封裝的驅動程序,如使用SHT20溫濕度傳感器獲取溫濕度數據也是一樣的。
/* 溫濕度數據處理 */ void AmShtDataProcess(void) {aPara.phyPara.temperature=GetSHT2xTemperatureValue(&sht,MEASURE_T_COMMAND_NOHOST);aPara.phyPara.humidity=GetSHT2xHumidityValue(&sht,MEASURE_RH_COMMAND_NOHOST); }/* 溫濕度配置 */ void AmShtConfiguration(void) {/* I2C1端口初始化 */I2C1_Init_Configuration();/* 初始化配置SHT2x */SHT2xInitialization(&sht, //SHT2X對象變量SHT2x_DPI_RH8_T12, //測量分辨率配置SHT2x_End_High, //電池結束狀態配置SHT2xHEATERDISABLE, //加熱器是否啟用配置SHT2xOTPDISABLE, //是否加載OTP配置WriteToSHT2x, //寫操作指針ReadFromSHT2x, //讀操作指針HAL_Delay); //毫秒延時指針 }3.2、數據顯示
??前述我們已經提到了使用0.96寸的OLED來顯示相應的數據。我們選用的是SPI接口的OLED顯示屏。其實0.96寸的OLED驅動程序我們也是封裝過的,直接使用就好。具體實現代碼如下:
OledObjectType oled; //聲明OLED對象/*OLED顯示處理*/ void AmoledDisplayProcess(void) {char temp[]="temp=%.2f";char humi[]="humi=%.2f";char pm25[]="PM2.5=%.2f";char pm10[]="PM10=%.2f";OledShowString(&oled,OLED_FONT_8x16,0,0,temp,aPara.phyPara.temperature);OledShowString(&oled,OLED_FONT_8x16,2,0,humi,aPara.phyPara.humidity);OledShowString(&oled,OLED_FONT_8x16,4,0,pm25,aPara.phyPara.pm25Value);OledShowString(&oled,OLED_FONT_8x16,6,0,pm10,aPara.phyPara.pm10Value);}/*OLED初始化配置*/ void AmoledConfiguration(void) {/* OLED顯示控制相關GPIO初始化配置 */Amoled_GPIO_Initialization();/* SPI1端口初始化 */SPI1_Init_Configuration();/*OLED顯示屏對象初始化*/OledInitialization(&oled, //OLED對象OLED_SPI, //通訊端口0xFF, //I2C設備地址AmOledWrite, //寫數據函數AmOledChipReset, //復位信號操作函數指針AmOledDCSelcet, //DC信號控制函數指針NULL, //SPI片選信號函數指針HAL_Delay //毫秒延時函數指針); }3.3**、數據傳送**
??數據的傳輸我們使用RS485的接口方式,應用層協議采用Modbus RTU協議。因為我們已經封裝過Modbus協議棧,并且已經開源到GitHub,所以我們直接使用Modbus協議棧來實現我們的數據傳送。
/* 上位通訊處理函數 */ void AmUpperCommunication(void) {uint16_t respondLength=0;if(amupcRxLength>=8){uint8_t respondBytes[AMUPCRECEIVELENGTH];respondLength=ParsingMasterAccessCommand(amupcRxBuffer,respondBytes,amupcRxLength,aPara.phyPara.activeAddress);if(respondLength!=65535){if(respondLength > 0){AmupcSendByte(respondBytes,respondLength);}amupcRxLength=0;}} }??關于數據傳送這塊,我們使用串口接收中斷來接收數據請求。當然也可以直接使用定期上傳的方式發送數據,則根據實際需求修改。
4、驗證測試
??我們已經設計了室內空氣質量檢測器的軟件和硬件,接下來我們運行看看其結果如何。我們將其運行起來,在我們的OLED軟件中設置為一次能顯示4行數據,具體結果如下圖:
??這只是一個小制作,實現了一些簡單的功能。在后續我們實際上可以將其功能擴展的更多。如將數據上傳到網絡實時查看居室內的大氣環境;根據PM2.5的情況控制空氣凈化器的工作等。
歡迎關注:
總結
以上是生活随笔為你收集整理的快速实现一个室内空气质量检测仪的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux gentoo安装,Gento
- 下一篇: STM32利用光敏二极管实现光度测量