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