MM32W無線MCU系列產(chǎn)品應(yīng)用筆記 —— 溫濕度監(jiān)測儀方案
在本章節(jié)我們將繼續(xù)給大家介紹一個使用場景較為豐富的藍(lán)牙應(yīng)用方案——基于MM32W系列開發(fā)的溫濕度監(jiān)測儀。圖1 方案應(yīng)用圖
溫度、濕度與我們的生活息息相關(guān),科研實驗室、農(nóng)業(yè)大棚、食品儲存室、疫苗存儲及配送、貯藏室等對環(huán)境的溫度、濕度有著嚴(yán)格的控制標(biāo)準(zhǔn),溫度、濕度的異常變化都可能會給其造成嚴(yán)重的影響。傳統(tǒng)的人工巡查和記錄環(huán)境溫濕度變化并非易事,隨著時代的發(fā)展,可實現(xiàn)智能化監(jiān)測環(huán)境溫濕度的溫濕度傳感器出現(xiàn)了。如今,科研、農(nóng)業(yè)、暖通、機(jī)房、航天航空、電力等工業(yè)部門都開始采用智能化的溫濕度傳感器監(jiān)測環(huán)境的溫濕度。利用溫濕度傳感器對環(huán)境的溫濕度進(jìn)行實時監(jiān)測,不僅能夠及時發(fā)現(xiàn)環(huán)境溫濕度的異常,進(jìn)而做出應(yīng)對措施,避免或減少損失,還能夠減少員工工作量,降低人力成本。
硬件資源如下:
本方案基于MM32 BLE_Test Board進(jìn)行測試驗證,搭配上溫濕度傳感器DHT11作為采集環(huán)境中溫濕度數(shù)據(jù),再加上一款小型的OLED屏幕作為本地式數(shù)據(jù)輸出顯示窗口,另外可以通過手機(jī)APP獲取溫濕度變化情況。在硬件原理上,本方案的DHT11模塊的單線數(shù)據(jù)傳輸引腳連接到MCU的PA7,為了解析模塊的數(shù)據(jù)時序,該引腳復(fù)用為TIM3_CH2輸入捕獲功能;使用硬件IIC接口連接到OLED屏上去,引腳為PB6(SCL)、PB7(SDA),可以將溫濕度數(shù)據(jù)顯示在OLED;藍(lán)牙相關(guān)的功能引腳與前面介紹的方案一致,此處不做過多展開。
軟件資源如下:
結(jié)合上述使用到的硬件資源,下面我們著重介紹軟件實現(xiàn)流程以及相關(guān)配置代碼。使用MCU的引腳復(fù)用為TIM3_CH2輸入捕獲功能DHT11模塊,在開啟捕獲時將PA7配置為浮空輸入模式,復(fù)用功能選擇AF1配置為TIM3的CH2輸入捕獲通道,并且將TIM3開啟;在停止捕獲時將PA7配置為推挽輸出模式,并且將TIM3關(guān)閉。由于DHT11模塊限制,溫濕度采樣周期間隔必須大于1S,本方案采樣和顯示周期為2S。
在使用OLED屏幕需要用到硬件IIC外設(shè)接口,需要將對應(yīng)的PB6 PB7配置為復(fù)用開漏輸出模式,初始化時還需要根據(jù)不同的OLED模塊在函數(shù)IIC_Init()中修改slave設(shè)備地址,使能IIC接口后即可以開始傳輸工作了。由于數(shù)據(jù)采集和定時顯示需要,本方案的低功耗模式采用STOP模式。
以下為主函數(shù)初始化配置內(nèi)容,主要將所有的外設(shè)資源和藍(lán)牙協(xié)議棧初始化,并且以中斷服務(wù)程序的方式運行藍(lán)牙,代碼如下:
主函數(shù)的循環(huán)中主要實現(xiàn)的功能為定時采集和顯示當(dāng)前環(huán)境的溫濕度數(shù)據(jù),而該數(shù)據(jù)也將在藍(lán)牙服務(wù)中發(fā)送到APP端顯示,代碼如下:
下面簡單介紹一下OLED操作相關(guān)的幾個函數(shù):
//初始化IIC
void IIC_Init(I2C_TypeDef* I2Cx);
//發(fā)送命令函數(shù)
static void Write_Command(unsigned char Command);
//發(fā)送數(shù)據(jù)顯示在屏幕
static void Write_DataBuff(unsigned char *Data, unsigned char Len);
//OLED屏初始化
void OLED_Init(void);
//設(shè)置坐標(biāo)
void OLED_SetPos(unsigned char x, unsigned char y);
//字符串顯示
void OLED_DispStr(unsigned char x, unsigned char y, char *ch);
//顯示logo
void OLED_DispLogo(void);
//清屏操作
void OLED_Clear(void);
下面簡單介紹一下DHT11模塊操作相關(guān)的幾個函數(shù):
// TIM3_CH2輸入捕獲初始化
void CaptureInit(void); //用TIM3_CH2 PB5 AF3
//啟動捕獲
void CaptureStart(void);
//停止捕獲
void CaptureStop(void);
在TIM3_IRQHandler()中針對捕獲的數(shù)據(jù)進(jìn)行解析和處理。
我們在gatt_user_send_notify_data_callback函數(shù)中給手機(jī)發(fā)送數(shù)據(jù),該函數(shù)屬于回調(diào)函數(shù),協(xié)議棧會在系統(tǒng)允許的時候(異步)回調(diào)本函數(shù),該函數(shù)可用于藍(lán)牙模塊端主動發(fā)送數(shù)據(jù)之用,函數(shù)內(nèi)部不得增加阻塞代碼。該應(yīng)用中我們在此函數(shù)中實現(xiàn)將采集轉(zhuǎn)換好的溫濕度數(shù)據(jù)傳輸給手機(jī)APP。詳細(xì)實現(xiàn)代碼如下:
//藍(lán)牙連接成功后協(xié)議在空閑的時候會調(diào)用本回調(diào)函數(shù)
void gatt_user_send_notify_data_callback(void){
static u8 notiCnt = 0;//回調(diào)次數(shù)計數(shù)器
u16 humiBat ,tempBpm = 0;
unsigned char DHTData[3]={0x00,0x00,0x01};
notiCnt++; //每進(jìn)一次該函數(shù)回調(diào)次數(shù)計數(shù)器+1
if(CaptureDataMon(&humiBat, &tempBpm) == 0) return;//未成功采集到溫濕度數(shù)據(jù)立即返回
tempBpm %= 512;//初步判斷溫度數(shù)據(jù)大小
humiBat /= 10;//初步判斷濕度數(shù)據(jù)大小
if (notiCnt >= 20) {//每進(jìn)入該回調(diào)函數(shù)20次才發(fā)送一次溫度數(shù)據(jù)
notiCnt = 0;
cur_notifyhandle = 0x12;//溫度數(shù)據(jù)回復(fù)句柄值
if (tempBpm < 0x100){
DHTData[0] = 0; //1Byte
DHTData[1] = tempBpm;
sconn_notifydata(DHTData,2);//換算處理好溫度數(shù)據(jù)后通過藍(lán)牙發(fā)出
}
else {
DHTData[0] = 1; //2Byte
DHTData[1] = tempBpm;
DHTData[2] = tempBpm>>8;
sconn_notifydata(DHTData,3);//換算處理好溫度數(shù)據(jù)后通過藍(lán)牙發(fā)出
}
}
else if (10 == notiCnt) {//每進(jìn)入該回調(diào)函數(shù)10次才發(fā)送一次濕度數(shù)據(jù)
SimBatt = humiBat; //0~100
cur_notifyhandle = 0x18;//濕度數(shù)據(jù)回復(fù)句柄值
sconn_notifydata(&SimBatt,1);//換算處理好濕度數(shù)據(jù)后通過藍(lán)牙發(fā)出
}
}
除了上述關(guān)鍵的藍(lán)牙數(shù)據(jù)發(fā)送函數(shù)外,下面再簡單介紹一些與藍(lán)牙相關(guān)的特征值定義:
手機(jī)操作流程如下:
打開手機(jī)藍(lán)牙并打開App,選擇HRM進(jìn)入,點擊Connect按鈕開始搜索溫濕度藍(lán)牙設(shè)備。
選擇對應(yīng)名稱(MM32W0_DHT)的藍(lán)牙設(shè)備并進(jìn)行配對,等待連接成功。連接成功后會有相應(yīng)提示,按鈕Connect名字會變成Disconnect。
連接成功后,在App界面上電池圖標(biāo)會顯示從DHT11傳感器獲取的濕度信息(百分比)Finger和圖表會顯示從DHT11傳感器獲取的溫度信息(原始數(shù)據(jù),溫度值x10)。
圖2 手機(jī)APP圖
編輯:ls 最后修改時間:2022-06-14