現(xiàn)在人們對大氣環(huán)境及室內(nèi)環(huán)境都比較關注。PM2.5在生活中也是常見的詞匯。在有些產(chǎn)品中就要求檢測PM2.5的數(shù)值。檢測PM2.5的手段多種多樣,在要求不高時我們通??梢圆捎眉す饽K。在這一篇中,我們將討論HLPM025K3 PM2.5傳感器驅(qū)動的設計與實現(xiàn)。
1、功能概述
??HLPM025K3傳感器采用激光散射原理。即令激光照射在空氣中的懸浮顆粒物上產(chǎn)生散射,同時在某一特定角度收集散射光,得到散射光強隨時間變化的曲線。通過穩(wěn)定的氣 體對流系統(tǒng),使外界空氣均勻的通過自主研發(fā)設計的風路,同時在風路中設有多個精密的光學傳感器,可以精確的獲得粒子的尺寸、速度和質(zhì)量等信息,加以統(tǒng)計學原理,繼而計算出總的粒子質(zhì)量,從而實時的得到空氣中所被關注的粒子的濃度,達到檢測PM2.5以及PM10的目的。其基本原理如下圖所示:
??HLPM025K3傳感器采用串行通訊,采用6腳通訊接口,其引腳定義如下圖所示:
??HLPM025K3傳感器采用TTL串行通訊,采用9600的波特率,8為數(shù)據(jù)位,1為停止位,無校驗的方式。HLPM025K3傳感器通訊采取主動發(fā)送模式,0.8到1.2秒發(fā)送一次數(shù)據(jù)。其數(shù)據(jù)包含7個字節(jié),具體格式如下:
??其中,校驗位=PM2.5(H)+PM2.5(L)+PM10(H)+PM10(L)
??接收到的數(shù)據(jù)按公式計算后得到 PM2.5 和 PM10 的值。
??PM2.5 = (PM2.5(H)×256 + PM2.5(L))×0.1;
??PM10 = (PM2.5(H)×256 + PM2.5(L))×0.1;
2、驅(qū)動設計與實現(xiàn)
??我們已經(jīng)了解了HLPM025K3型PM2.5傳感器的基本情況。在這一節(jié)中我們將設計并實現(xiàn)HLPM025K3型PM2.5傳感器的驅(qū)動。
2.1、對象定義
??在使用一個對象之前我們需要獲得一個對象。同樣的我們想要HLPM025K3 PM2.5傳感器就需要先定義HLPM025K3 PM2.5傳感器的對象。
2.1.1、對象的抽象
??我們要得到HLPM025K3 PM2.5傳感器對象,需要先分析其基本特性。一般來說,一個對象至少包含兩方面的特性:屬性與操作。接下來我們就來從這兩個方面思考一下HLPM025K3 PM2.5傳感器的對象。
??先來考慮屬性,作為屬性肯定是用于標識或記錄對象特征的東西。我們來考慮HLPM025K3 PM2.5傳感器對象屬性。我們將測量數(shù)據(jù)作為對象的屬性,因為他們表示了對象當前的狀態(tài)。
??接著我們還需要考慮HLPM025K3 PM2.5傳感器對象的操作問題。對象本身除了接受數(shù)據(jù)并沒有什么需要操作的。我們使用隊列來存儲接收到的數(shù)據(jù),所以入隊出隊過程可看作是其操作。
??根據(jù)上述我們對HLPM025K3 PM2.5傳感器的分析,我們可以定義HLPM025K3 PM2.5傳感器的對象類型如下:
/*定義HLPM025K3對象類型*/
typedef struct HlpmObject {
float pm25; //PM2.5測量值
float pm100; //PM10測量值
struct DwinRxBuffer{
uint8_t queue[HLPMRxBufferLength]; //鍵值存儲隊列
uint8_t pRead; //讀隊列指針
uint8_t pWrite; //寫隊列指針
uint16_t (*DeQueue)(struct HlpmObject *hlpm,uint8_t *rxBuf); //出隊操作
void (*EnQueue)(struct HlpmObject *hlpm,uint8_t rData); //入隊操作
}rxBuffer; //定義接收緩存隊列
}HlpmObjectType;
2.1.2、對象初始化
??我們知道,一個對象僅作聲明是不能使用的,我們需要先對其進行初始化,所以這里我們來考慮HLPM025K3 PM2.5傳感器對象的初始化函數(shù)。一般來說,初始化函數(shù)需要處理幾個方面的問題。一是檢查輸入參數(shù)是否合理;二是為對象的屬性賦初值;三是對對象作必要的初始化配置。據(jù)此我們設計HLPM025K3 PM2.5傳感器對象的初始化函數(shù)如下:
/*HLPM對象初始化函數(shù)*/
void HlpmInitialization(HlpmObjectType *hlpm)
{
if(hlpm==NULL)
{
return;
}
hlpm->pm25=0.0;
hlpm->pm100=0.0;
hlpm->rxBuffer.pRead=0;
hlpm->rxBuffer.pWrite=0;
hlpm->rxBuffer.EnQueue=BufferDataEnQueue;
hlpm->rxBuffer.DeQueue=BufferDataDeQueue;
}
2.2、對象操作
??我們已經(jīng)完成了HLPM025K3 PM2.5傳感器對象類型的定義和對象初始化函數(shù)的設計。但我們的主要目標是獲取對象的信息,接下來我們還要實現(xiàn)面向HLPM025K3 PM2.5傳感器的各類操作。
??由于HLPM025K3 PM2.5傳感器對象是自主發(fā)送,所以我們需要做的就是接收消息并解析。
/*解析PM2.5和PM10的數(shù)據(jù)*/
bool ParsingPMData(HlpmObjectType *hlpm)
{
uint16_t length=0;
uint8_t receivedData[7]={0};
bool isValid=false;
length=hlpm->rxBuffer.DeQueue(hlpm,receivedData);
if(length>0)
{
isValid=CheckDataIsValid(receivedData);
if(isValid)
{
hlpm->pm25=SynthesisPMValue(receivedData+1);
hlpm->pm100=SynthesisPMValue(receivedData+3);
}
}
return isValid;
}
3、驅(qū)動的使用
??我們已經(jīng)設計并實現(xiàn)了HLPM025K3 PM2.5傳感器對象的驅(qū)動程序。接下來我們設計一個簡單的應用來驗證這一驅(qū)動程序是否可行。
3.1、聲明并初始化對象
??使用基于對象的操作我們需要先得到這個對象,所以我們先要使用前面定義的HLPM025K3 PM2.5傳感器對象類型聲明一個HLPM025K3 PM2.5傳感器對象變量,具體操作格式如下:
??HlpmObjectType hlpm;
??聲明了這個對象變量并不能立即使用,我們還需要使用驅(qū)動中定義的初始化函數(shù)對這個變量進行初始化。這個初始化函數(shù)所需要的輸入?yún)?shù)如下:
??HlpmObjectType *hlpm,HLPM025K3 PM2.5傳感器對象
??這個對象變量我們已經(jīng)定義了,所以只需輸入這個對象就好了。于是我們可以調(diào)用初始化函數(shù)如下:
??HlpmInitialization(&hlpm);
??對于串口通訊,我們可以使用多種方式,我們在此使用中斷來接收數(shù)據(jù),具體實現(xiàn)如下:
//數(shù)據(jù)接收中斷處理函數(shù)
void HLPM_USART_ReceiveDataHandle(void)
{
uint8_t res;
// 接收寄存器為空,等待字節(jié)被對應的串口完全接收
if(__HAL_UART_GET_FLAG(&hlpmhuart,UART_FLAG_RXNE)!=RESET)
{
// 獲取接收到的字節(jié)數(shù)
HAL_UART_Receive(&hlpmhuart,&res,1,1000);
hlpm.rxBuffer.EnQueue(&hlpm,res);
__HAL_UART_CLEAR_FLAG(&hlpmhuart,UART_FLAG_RXNE);
}
}
3.2、基于對象進行操作
??我們定義了對象變量并使用初始化函數(shù)給其作了初始化。接著我們就來考慮操作這一對象獲取我們想要的數(shù)據(jù)。我們在驅(qū)動中已經(jīng)將獲取數(shù)據(jù)并轉換為轉換值的比例值,接下來我們使用這一驅(qū)動開發(fā)我們的應用實例。
/*數(shù)據(jù)獲取*/
void GetDataFromHLPM025K3(void)
{
float pm25Value;
float pm10Value;
ParsingPMData(&hlpm);
pm25Value=hlpm.pm25;
pm10Value=hlpm.pm100;
}
4、應用總結
??我們已經(jīng)設計并實現(xiàn)了HLPM025K3 PM2.5傳感器對象的驅(qū)動程序,并且設計了簡單的驗證程序。HLPM025K3 PM2.5傳感器的操作本身比較簡單,只需要通過串口獲取數(shù)據(jù)就可以了。
??驅(qū)動中采用了FIFO隊列存儲接收到的HLPM025K3 PM2.5傳感器數(shù)據(jù),主要是考慮到被動接收的情況下,能夠保證正確的解析數(shù)據(jù)。如果不使用也是沒有問題的,本身不是HLPM025K3 PM2.5傳感器對象所必需的。
評論