概述
STHS34PF80傳感器項(xiàng)目種修改 Arduino 腳本,重新移植到STM32的MCU中。
該項(xiàng)目基于STHS34PF80 IR溫度傳感器,能夠檢測(cè)環(huán)境和物體溫度,并且在最大4米范圍內(nèi)檢測(cè)存在和運(yùn)動(dòng)。有一個(gè)Arduino腳本,顯示如何為基本環(huán)境和物體溫度測(cè)量配置傳感器,并如何配置嵌入式功能算法,并使用它們檢測(cè)存在和運(yùn)動(dòng)。腳本允許連續(xù)或一次性模式,允許更改低通濾波器和檢測(cè)閾值以實(shí)現(xiàn)各種檢測(cè)行為。腳本利用內(nèi)嵌的中斷引擎來(lái)檢測(cè)溫度數(shù)據(jù)的就緒狀態(tài),以及通知存在和運(yùn)動(dòng)事件。
本節(jié)將在上節(jié)代碼中繼續(xù)配置,通過獲取模塊的狀態(tài)標(biāo)志位來(lái)檢測(cè)是否有人體存在。
最近在弄ST和瑞薩RA的課程,需要樣片的可以加群申請(qǐng):6_15061293 。
視頻教學(xué)
[https://www.bilibili.com/video/BV1dp4y1P7g9/]
樣品申請(qǐng)
[https://www.wjx.top/vm/OhcKxJk.aspx#](
參考Demo
[hthttps://github.com/kriswiner/STHS34PF80/tree/main](
完整代碼下載
[https://download.csdn.net/download/qq_24312945/88257572](
參考程序獲取數(shù)據(jù)
獲取數(shù)據(jù)標(biāo)志位
使用狀態(tài)寄存器(STATUS,地址為23h)來(lái)檢查何時(shí)有新的數(shù)據(jù)集可用。這里的數(shù)據(jù)集可能包括多種數(shù)據(jù)輸出:物體溫度、環(huán)境溫度,以及可能的其他幾個(gè)由嵌入式智能算法生成的輸出(如存在檢測(cè)、動(dòng)作檢測(cè)和環(huán)境溫度沖擊檢測(cè))。
參考文檔設(shè)置如下所示。
修改如下。
/**
* @brief 獲取DRDY
*
* @param add 設(shè)備地址
* @param val 設(shè)備ID.
* @retval ret 正常返回HAL_OK
*
*/
uint8_t STHS34PF80_getDataReadyStatus(uint8_t add)
{
uint8_t temp = 0;//STHS34PF80_STATUS- >0x23
sths34pf80_read_reg(add, STHS34PF80_STATUS, (uint8_t *)&temp, 1);
return temp;
}
使用數(shù)據(jù)準(zhǔn)備就緒信號(hào)
FUNC_STATUS 寄存器(地址為25h)是一個(gè)只讀寄存器,它包含了設(shè)備的嵌入式智能算法的狀態(tài)標(biāo)志。
PRES_FLAG: 這是一個(gè)存在檢測(cè)標(biāo)志。當(dāng)檢測(cè)到存在時(shí),此位變?yōu)?;當(dāng)沒有檢測(cè)到存在時(shí),此位變回0。默認(rèn)值為0。
(0: 沒有檢測(cè)到存在;1: 檢測(cè)到存在)
MOT_FLAG: 這是一個(gè)運(yùn)動(dòng)檢測(cè)標(biāo)志。當(dāng)檢測(cè)到運(yùn)動(dòng)時(shí),此位變?yōu)?;當(dāng)沒有檢測(cè)到運(yùn)動(dòng)時(shí),此位變回0。默認(rèn)值為0。
(0: 沒有檢測(cè)到運(yùn)動(dòng);1: 檢測(cè)到運(yùn)動(dòng))
TAMB_SHOCK_FLAG: 這是一個(gè)環(huán)境溫度沖擊檢測(cè)標(biāo)志。當(dāng)檢測(cè)到環(huán)境溫度沖擊時(shí),此位變?yōu)?;當(dāng)沒有檢測(cè)到環(huán)境溫度沖擊時(shí),此位變回0。默認(rèn)值為0。
(0: 沒有檢測(cè)到環(huán)境溫度沖擊;1: 檢測(cè)到環(huán)境溫度沖擊)
參考文檔設(shè)置如下所示。
獲取代碼如下所示。
/**
* @brief 清零DRDY
*
* @param add 設(shè)備地址
* @param val 設(shè)備ID.
* @retval ret 正常返回HAL_OK
*
*/
uint8_t STHS34PF80_getFuncStatus(uint8_t add)
{
uint8_t temp = 0;//STHS34PF80_FUNC_STATUS- >0x25
sths34pf80_read_reg(add, STHS34PF80_FUNC_STATUS, (uint8_t *)&temp, 1);
return temp;
}
嵌入式智能數(shù)字算法的輸出數(shù)據(jù)
在4.5.4節(jié)中,描述了嵌入式智能數(shù)字算法的輸出數(shù)據(jù)。這些數(shù)據(jù)包括存在檢測(cè)、運(yùn)動(dòng)檢測(cè)和環(huán)境沖擊檢測(cè)的輸出數(shù)據(jù),分別發(fā)送到TPRESENCE_H (3Bh) 和 TPRESENCE_L (3Ah) 寄存器,TMOTION_H (3Dh) 和 TMOTION_L (3Ch) 寄存器,以及 TAMB_SHOCK_H (3Fh) 和 TAMB_SHOCK_L (3Eh) 寄存器。
這些數(shù)據(jù)沒有內(nèi)在的物理意義,只是嵌入式智能數(shù)字算法用來(lái)斷言相應(yīng)的標(biāo)志。
獲取代碼如下所示。
/**
* @brief 嵌入式智能數(shù)字算法產(chǎn)生的存在檢測(cè)輸出數(shù)據(jù)
*
* @param add 設(shè)備地址
* @param val 設(shè)備ID.
* @retval ret 正常返回HAL_OK
*
*/
int16_t STHS34PF80_readPresence(uint8_t add)
{
uint8_t rawData[2]; //STHS34PF80_TPRESENCE_L- >0x3A
sths34pf80_read_reg(add, STHS34PF80_TPRESENCE_L, (uint8_t *)&rawData[0], 2);
return (int16_t)(((int16_t)rawData[1]) < < 8 | rawData[0]);
}
/**
* @brief 嵌入式智能數(shù)字算法產(chǎn)生的運(yùn)動(dòng)檢測(cè)輸出數(shù)據(jù)
*
* @param add 設(shè)備地址
* @param val 設(shè)備ID.
* @retval ret 正常返回HAL_OK
*
*/
int16_t STHS34PF80_readMotion(uint8_t add)
{
uint8_t rawData[2]; //STHS34PF80_TMOTION_L- >0x3C
sths34pf80_read_reg(add, STHS34PF80_TMOTION_L, (uint8_t *)&rawData[0], 2);
return (int16_t)(((int16_t)rawData[1]) < < 8 | rawData[0]);
}
/**
* @brief 嵌入式智能數(shù)字算法產(chǎn)生的環(huán)境沖擊輸出數(shù)據(jù)
*
* @param add 設(shè)備地址
* @param val 設(shè)備ID.
* @retval ret 正常返回HAL_OK
*
*/
int16_t STHS34PF80_readAmbShock(uint8_t add)
{
uint8_t rawData[2]; //STHS34PF80_TAMB_SHOCK_L- >0x3E
sths34pf80_read_reg(add, STHS34PF80_TAMB_SHOCK_L, (uint8_t *)&rawData[0], 2);
return (int16_t)(((int16_t)rawData[1]) < < 8 | rawData[0]);
}
4.5.3節(jié)中提供了一個(gè)簡(jiǎn)單的例子,展示了如何從傳感器獲取物體溫度數(shù)據(jù)(以最低有效位LSB表示)并將其轉(zhuǎn)換為攝氏度°C。
該例子的過程也適用于獲取環(huán)境溫度數(shù)據(jù)。
代碼如下所示。
/**
* @brief
*
* @param add 視場(chǎng)內(nèi)對(duì)象發(fā)出的紅外輻射量(未補(bǔ)償)
* @param val 設(shè)備ID.
* @retval ret 正常返回HAL_OK
*
*/
int16_t STHS34PF80_readObjTemp(uint8_t add)
{
uint8_t rawData[2]; //STHS34PF80_TOBJECT_L- >0x26
sths34pf80_read_reg(add, STHS34PF80_TOBJECT_L, (uint8_t *)&rawData[0], 2);
return (int16_t)(((int16_t)rawData[1]) < < 8 | rawData[0]);
}
4.5.2節(jié)描述了如何獲取環(huán)境溫度數(shù)據(jù),并在哪些寄存器中這些數(shù)據(jù)可以被找到。
寄存器存儲(chǔ):環(huán)境溫度數(shù)據(jù)被發(fā)送到TAMBIENT_H(29h)和TAMBIENT_L(28h)寄存器中。其中,TAMBIENT_H存儲(chǔ)了環(huán)境溫度值的最高有效字節(jié)(MSB),而TAMBIENT_L存儲(chǔ)了最低有效字節(jié)(LSB)。
數(shù)據(jù)格式:通過拼接TAMBIENT_H和TAMBIENT_L,可以得到完整的環(huán)境溫度輸出數(shù)據(jù)。這個(gè)值被表示為一個(gè)16位的有符號(hào)二進(jìn)制補(bǔ)碼數(shù)字。
單位轉(zhuǎn)換:每個(gè)環(huán)境溫度輸出樣本可以通過一個(gè)靈敏度值(在這個(gè)例子里是100 LSB/°C)來(lái)轉(zhuǎn)換成攝氏度。公式如下:
應(yīng)用場(chǎng)景:環(huán)境溫度數(shù)據(jù)代表了與設(shè)備熱耦合的環(huán)境的實(shí)際溫度。這些數(shù)據(jù)可用于校正由于與傳感器熱耦合的環(huán)境溫度變化而導(dǎo)致的物體溫度輸出數(shù)據(jù)的變化(詳見4.6節(jié))。
代碼如下所示。
/**
* @brief
*
* @param add 環(huán)境溫度數(shù)據(jù)
* @param val 設(shè)備ID.
* @retval ret 正常返回HAL_OK
*
*/
int16_t STHS34PF80_readAmbTemp(uint8_t add)
{
uint8_t rawData[2];//STHS34PF80_TAMBIENT_L- >0x28
sths34pf80_read_reg(add, STHS34PF80_TAMBIENT_L, (uint8_t *)&rawData[0], 2);
return (int16_t)(((int16_t)rawData[1]) < < 8 | rawData[0]);
}
補(bǔ)償后的物體溫度數(shù)據(jù)存儲(chǔ)在TOBJ_COMP_L(38h)和TOBJ_COMP_H(39h)寄存器中。其中,TOBJ_COMP_H包含最高有效字節(jié)(MSB),TOBJ_COMP_L包含最低有效字節(jié)(LSB)。
需要注意的是,即使補(bǔ)償算法處于活動(dòng)狀態(tài),26h和27h寄存器中仍然包含原始物體溫度數(shù)據(jù)。如果補(bǔ)償沒有激活,38h和39h寄存器會(huì)與26h和27h寄存器對(duì)齊。
補(bǔ)償后的物體溫度數(shù)據(jù)(以LSB為單位)與使用的光學(xué)系統(tǒng)的透射率成比例。您可以通過實(shí)際的靈敏度值來(lái)轉(zhuǎn)換這些補(bǔ)償后的數(shù)據(jù),以獲得相應(yīng)的攝氏度值。不過,這些補(bǔ)償后的數(shù)據(jù)并不實(shí)際代表視場(chǎng)內(nèi)物體的溫度。
如果啟用了增益減小功能(見第4.7節(jié)),則不能啟用嵌入式補(bǔ)償算法。
代碼如下所示。
/**
* @brief 嵌入式智能數(shù)字算法產(chǎn)生的視場(chǎng)內(nèi)物體發(fā)射的紅外輻射量輸出數(shù)據(jù)(已經(jīng)經(jīng)過環(huán)境溫度補(bǔ)償)
*
* @param add 設(shè)備地址
* @param val 設(shè)備ID.
* @retval ret 正常返回HAL_OK
*
*/
int16_t STHS34PF80_readCompObjTemp(uint8_t add)
{
uint8_t rawData[2];//STHS34PF80_TOBJ_COMP_L- >0x38
sths34pf80_read_reg(add, STHS34PF80_TOBJ_COMP_L, (uint8_t *)&rawData[0], 2);
return (int16_t)(((int16_t)rawData[1]) < < 8 | rawData[0]);
}
主程序
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
// printf("PA7=%d",HAL_GPIO_ReadPin ( GPIOA, GPIO_PIN_7));
// if(HAL_GPIO_ReadPin ( GPIOA, GPIO_PIN_7))
// {
status = STHS34PF80_getDataReadyStatus(STHS34PF80_ADDRESS);
if(FUNCTIONS)
{
funcstatus = STHS34PF80_getFuncStatus(STHS34PF80_ADDRESS);
if(funcstatus & 0x04) printf("(存在)Presence detected !n");
if(funcstatus & 0x02) printf("(運(yùn)動(dòng))Motion detected !n");
if(funcstatus & 0x01) printf("(環(huán)境溫度沖擊)T Shock detected !n");
}
if(status & 0x04) // when data ready
{
Presence = STHS34PF80_readPresence(STHS34PF80_ADDRESS);//嵌入式智能數(shù)字算法產(chǎn)生的存在檢測(cè)輸出數(shù)據(jù)
Motion = STHS34PF80_readMotion(STHS34PF80_ADDRESS); // 嵌入式智能數(shù)字算法產(chǎn)生的運(yùn)動(dòng)檢測(cè)輸出數(shù)據(jù)
AmbTemp = STHS34PF80_readAmbTemp(STHS34PF80_ADDRESS);//環(huán)境溫度數(shù)據(jù)
ObjTemp = STHS34PF80_readObjTemp(STHS34PF80_ADDRESS);//視場(chǎng)內(nèi)對(duì)象發(fā)出的紅外輻射量(未補(bǔ)償)
CompObjTemp = STHS34PF80_readCompObjTemp(STHS34PF80_ADDRESS);//嵌入式智能數(shù)字算法產(chǎn)生的視場(chǎng)內(nèi)物體發(fā)射的紅外輻射量輸出數(shù)據(jù)(已經(jīng)經(jīng)過環(huán)境溫度補(bǔ)償)
AmbShock = STHS34PF80_readAmbShock(STHS34PF80_ADDRESS);//嵌入式智能數(shù)字算法產(chǎn)生的環(huán)境沖擊輸出數(shù)據(jù)
printf("(原始數(shù)據(jù))Raw countsn");
printf("(視場(chǎng)內(nèi)對(duì)象發(fā)出的紅外輻射量(未補(bǔ)償))STHS34PF80 ObjTemp = %dn",ObjTemp);
printf("(視場(chǎng)內(nèi)物體發(fā)射的紅外輻射量輸出(經(jīng)過環(huán)境溫度補(bǔ)償))STHS34PF80 Compensated ObjTemp = %dn",CompObjTemp);
printf("(環(huán)境溫度)STHS34PF80 AmbTemp = %dn",AmbTemp);
printf("(存在檢測(cè))STHS34PF80 Presence = %dn",Presence);
printf("(運(yùn)動(dòng)檢測(cè)輸出)STHS34PF80 Motion = %dn",Motion);
printf("(環(huán)境沖擊輸出)STHS34PF80 AmbShock = %dn",AmbShock);
printf("(環(huán)境溫度)STHS34PF80 Ambient Temperature = %.2fn",(float)(AmbTemp) / 100.0f); //環(huán)境溫度數(shù)據(jù)
printf("(對(duì)象溫度)STHS34PF80 Object Temperature = %.2fn",((float)(ObjTemp) / (float)(ObjSense) ) );
}
// }
HAL_Delay(1000);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
-
模塊
+關(guān)注
關(guān)注
7文章
2696瀏覽量
47439 -
數(shù)據(jù)
+關(guān)注
關(guān)注
8文章
7006瀏覽量
88958 -
stm32cubemx
+關(guān)注
關(guān)注
5文章
283瀏覽量
14792
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論