冬天我們大多會(huì)關(guān)閉門(mén)窗,而依靠暖通空調(diào)設(shè)備來(lái)維持室內(nèi)溫度。而在保證居室溫度的同時(shí),我們也希望保持居室內(nèi)大氣環(huán)境的健康度。鑒于此,我們?cè)O(shè)計(jì)了一個(gè)簡(jiǎn)單的室內(nèi)空氣質(zhì)量檢測(cè)器。
1、系統(tǒng)概述
??我們依靠暖通空調(diào)設(shè)備來(lái)維持室內(nèi)溫度、濕度和通風(fēng)水平,以保證居住者的健康和舒適。所以我們希望設(shè)計(jì)一個(gè)小巧的、簡(jiǎn)單的、低成本室內(nèi)空氣質(zhì)量檢測(cè)器來(lái)隨時(shí)監(jiān)測(cè)我們居室內(nèi)的空氣質(zhì)量。
??一般來(lái)說(shuō),我們關(guān)心的居室環(huán)境的溫度、濕度、可吸入顆粒物濃度、揮發(fā)性有機(jī)物的濃度等。當(dāng)然還有二氧化炭濃度等其它一些參數(shù),不過(guò)這次我們只考慮溫度、濕度、可吸入顆粒物濃度、揮發(fā)性有機(jī)物的濃度。
??對(duì)于這個(gè)室內(nèi)空氣檢測(cè)器,我們的基本想法是設(shè)計(jì)一個(gè)可以快速成型、監(jiān)測(cè)溫度、濕度、可吸入顆粒物濃度、揮發(fā)性有機(jī)物濃度的手持設(shè)備。這臺(tái)室內(nèi)空氣質(zhì)量檢測(cè)器溫濕度、可吸入顆粒物濃度、揮發(fā)性有機(jī)物濃度并可以實(shí)時(shí)顯示出來(lái),并可以將檢測(cè)出的數(shù)據(jù)向外傳送。
2、硬件設(shè)計(jì)
??根據(jù)前面的描述,我們使用一個(gè)溫濕度傳感器來(lái)監(jiān)測(cè)溫度和濕度、一個(gè)可吸入顆粒物激光檢測(cè)傳感器來(lái)檢測(cè)可吸入顆粒物濃度,一個(gè)VOC傳感器來(lái)檢測(cè)揮發(fā)性有機(jī)物濃度。
??為了快速實(shí)現(xiàn)一個(gè)室內(nèi)空氣質(zhì)量檢測(cè)器,我們采用我們所熟知的傳感器及其他相應(yīng)設(shè)備來(lái)實(shí)現(xiàn)。我們使用SHT20來(lái)實(shí)現(xiàn)溫濕度數(shù)據(jù)的檢測(cè);使用SGP40來(lái)檢測(cè)VOC濃度;使用HLPM025K3激光PM2.5傳感器來(lái)檢測(cè)可吸入顆粒物濃度;使用OLED來(lái)顯示數(shù)據(jù);使用串口來(lái)實(shí)現(xiàn)數(shù)據(jù)的傳送。而處理器我們采用STM32F103C8T6來(lái)實(shí)現(xiàn)。
??HLPM025K3激光PM2.5傳感器數(shù)據(jù)接口為T(mén)TL串行口,所以我們采用USART1端口來(lái)與之通訊。SHT20傳感器的數(shù)據(jù)接口為I2C接口,我們使用I2C1來(lái)與之通訊。SGP40傳感器數(shù)據(jù)接口為I2C接口,我們使用I2C2來(lái)與之通訊。顯示屏我們采用了SPI接口的0.96寸OLED,所以我們使用SPI1端口來(lái)與之通訊。數(shù)據(jù)傳輸我們采用USART2端口來(lái)實(shí)現(xiàn)。所以我們?cè)O(shè)計(jì)室內(nèi)空氣質(zhì)量檢測(cè)器的組成結(jié)構(gòu)圖如下:
??根據(jù)上述分析及結(jié)構(gòu)示意圖,我們就能很容易的設(shè)計(jì)出室內(nèi)空氣質(zhì)量檢測(cè)器的控制板。
3、軟件實(shí)現(xiàn)
??我們已經(jīng)描述了室內(nèi)空氣質(zhì)量檢測(cè)器的控制板及各部分組件,接下來(lái)我們需要實(shí)現(xiàn)相應(yīng)的軟件功能。
3.1、數(shù)據(jù)采集
??數(shù)據(jù)的采集主要包括三個(gè)方面:一是使用SHT20采集溫濕度數(shù)據(jù);二是使用SGP40來(lái)采集VOC濃度數(shù)據(jù);三是使用HLPM025K3激光PM2.5傳感器來(lái)檢測(cè)可吸入顆粒物濃度數(shù)據(jù)。這些數(shù)據(jù)的采集并不麻煩,在以前的文章中我們已經(jīng)簡(jiǎn)述多這些設(shè)備的驅(qū)動(dòng)程序的設(shè)計(jì)。在這里我們直接使用已經(jīng)封裝過(guò)的驅(qū)動(dòng)程序來(lái)實(shí)現(xiàn)就可以了。
??HLPM025K3激光PM2.5傳感器通過(guò)串口輸出數(shù)據(jù),包括PM2.5和PM10的數(shù)據(jù),我們使用封裝的驅(qū)動(dòng)程序可以很方便的獲取和解析對(duì)應(yīng)的數(shù)據(jù)。具體的實(shí)現(xiàn)程序如下:
HlpmObjectType hlpm; //聲明對(duì)象
/*PM25數(shù)據(jù)采集處理*/
void Ampm25DataProcess(void)
{
/*解析PM2.5和PM10的數(shù)據(jù)*/
ParsingPMData(&hlpm);
aPara.phyPara.pm10Value=hlpm.pm100;
aPara.phyPara.pm25Value=hlpm.pm25;
}
/*PM25數(shù)據(jù)采集配置*/
void Ampm25Configuration(void)
{
/* PM25相關(guān)GPIO初始化配置 */
Ampm25_GPIO_Initialization();
/* USART1端口初始化配置 */
USART1_Init_Configuration();
/*允許數(shù)據(jù)發(fā)送*/
AMPM25_RUNNING_ENABLE();
/*HLPM對(duì)象初始化函數(shù)*/
HlpmInitialization(&hlpm);
}
??需要注意的是HLPM025K3激光PM2.5傳感器有一個(gè)測(cè)量控制信號(hào),必須提供高電平才會(huì)工作。
??同樣測(cè)量其它的參數(shù)也是使用我們封裝的驅(qū)動(dòng)程序,如使用SHT20溫濕度傳感器獲取溫濕度數(shù)據(jù)也是一樣的。
/* 溫濕度數(shù)據(jù)處理 */
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對(duì)象變量
SHT2x_DPI_RH8_T12, //測(cè)量分辨率配置
SHT2x_End_High, //電池結(jié)束狀態(tài)配置
SHT2xHEATERDISABLE, //加熱器是否啟用配置
SHT2xOTPDISABLE, //是否加載OTP配置
WriteToSHT2x, //寫(xiě)操作指針
ReadFromSHT2x, //讀操作指針
HAL_Delay); //毫秒延時(shí)指針
}
3.2、數(shù)據(jù)顯示
??前述我們已經(jīng)提到了使用0.96寸的OLED來(lái)顯示相應(yīng)的數(shù)據(jù)。我們選用的是SPI接口的OLED顯示屏。其實(shí)0.96寸的OLED驅(qū)動(dòng)程序我們也是封裝過(guò)的,直接使用就好。具體實(shí)現(xiàn)代碼如下:
OledObjectType oled; //聲明OLED對(duì)象
/*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顯示控制相關(guān)GPIO初始化配置 */
Amoled_GPIO_Initialization();
/* SPI1端口初始化 */
SPI1_Init_Configuration();
/*OLED顯示屏對(duì)象初始化*/
OledInitialization(&oled, //OLED對(duì)象
OLED_SPI, //通訊端口
0xFF, //I2C設(shè)備地址
AmOledWrite, //寫(xiě)數(shù)據(jù)函數(shù)
AmOledChipReset, //復(fù)位信號(hào)操作函數(shù)指針
AmOledDCSelcet, //DC信號(hào)控制函數(shù)指針
NULL, //SPI片選信號(hào)函數(shù)指針
HAL_Delay //毫秒延時(shí)函數(shù)指針
);
}
3.3 、數(shù)據(jù)傳送
??數(shù)據(jù)的傳輸我們使用RS485的接口方式,應(yīng)用層協(xié)議采用Modbus RTU協(xié)議。因?yàn)槲覀円呀?jīng)封裝過(guò)Modbus協(xié)議棧,并且已經(jīng)開(kāi)源到GitHub,所以我們直接使用Modbus協(xié)議棧來(lái)實(shí)現(xiàn)我們的數(shù)據(jù)傳送。
/* 上位通訊處理函數(shù) */
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;
}
}
}
??關(guān)于數(shù)據(jù)傳送這塊,我們使用串口接收中斷來(lái)接收數(shù)據(jù)請(qǐng)求。當(dāng)然也可以直接使用定期上傳的方式發(fā)送數(shù)據(jù),則根據(jù)實(shí)際需求修改。
4、驗(yàn)證測(cè)試
??我們已經(jīng)設(shè)計(jì)了室內(nèi)空氣質(zhì)量檢測(cè)器的軟件和硬件,接下來(lái)我們運(yùn)行看看其結(jié)果如何。我們將其運(yùn)行起來(lái),在我們的OLED軟件中設(shè)置為一次能顯示4行數(shù)據(jù),具體結(jié)果如下圖:
??這只是一個(gè)小制作,實(shí)現(xiàn)了一些簡(jiǎn)單的功能。在后續(xù)我們實(shí)際上可以將其功能擴(kuò)展的更多。如將數(shù)據(jù)上傳到網(wǎng)絡(luò)實(shí)時(shí)查看居室內(nèi)的大氣環(huán)境;根據(jù)PM2.5的情況控制空氣凈化器的工作等。
-
傳感器
+關(guān)注
關(guān)注
2545文章
50445瀏覽量
751049 -
檢測(cè)器
+關(guān)注
關(guān)注
1文章
857瀏覽量
47623 -
硬件設(shè)計(jì)
+關(guān)注
關(guān)注
18文章
394瀏覽量
44517
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論