東阿網(wǎng)站建設(shè)百度seo流量
目錄
一、概述
二、單次數(shù)據(jù)采集模式的測(cè)量
1、配置說明
2、代碼實(shí)現(xiàn)方式
三、周期性數(shù)據(jù)采集模式的測(cè)量
1、配置說明
2、代碼實(shí)現(xiàn)方式
四、完整代碼下載鏈接
一、概述
????????SHT3X是Sensirion公司推出的一款高精度、完全校準(zhǔn)的溫濕度傳感器,基于CMOSens技術(shù)。它提供了線性化、溫度補(bǔ)償?shù)臄?shù)字輸出,具有寬電源電壓范圍、高速I2C接口以及可選的地址設(shè)置等特點(diǎn)。
- 高精度:SHT3X提供了高精度的溫濕度測(cè)量,濕度誤差在±3%(SHT30)或±2%(SHT31)以內(nèi),溫度誤差在±0.3℃(SHT30)或±0.2℃(SHT31)以內(nèi)。
- 寬電源電壓范圍:SHT3X的供電電壓范圍寬達(dá)2.4V至5.5V,確保了與各種組裝情況的兼容性。
- 高速I2C接口:SHT3X配備了高速I2C接口,通信速度可達(dá)1MHz,并支持兩個(gè)用戶可選地址,方便多個(gè)傳感器在同一總線上工作。
- 快速啟動(dòng)和測(cè)量時(shí)間:SHT3X具有非??斓膯?dòng)和測(cè)量時(shí)間,能夠快速響應(yīng)環(huán)境變化。
????????SHT3X的引腳包括供電引腳(VDD/VSS)、復(fù)位引腳(nRESET)、地址引腳(ADDR)、以及I2C通信引腳(SCL/SDA)。其中,ADDR引腳用于設(shè)置傳感器的地址,SCL和SDA引腳分別用于I2C通信的時(shí)鐘和數(shù)據(jù)線。
????????通過ADDR引腳的適當(dāng)接線,可以選擇I2C地址(見下表)。ADDR引腳可以連接到邏輯高電平或邏輯低電平。通過切換ADDR引腳上的電平,可以在運(yùn)行期間動(dòng)態(tài)改變傳感器的地址。
SHT3x-DIScomes采用8引腳DFN封裝,請(qǐng)參見下表所示。?
????????SHT3X內(nèi)部包含濕度傳感器和溫度傳感器,通過ADC模塊將模擬信號(hào)轉(zhuǎn)換為數(shù)字信號(hào)。校準(zhǔn)模塊結(jié)合ADC模塊輸出的數(shù)值進(jìn)行處理和線性化,然后通過I2C接口與外部通信。在傳輸過程中,每個(gè)數(shù)據(jù)值后面都會(huì)跟著CRC校驗(yàn)和,以確保數(shù)據(jù)的準(zhǔn)確性。
二、單次數(shù)據(jù)采集模式的測(cè)量
1、配置說明
????????在這種模式下,一個(gè)發(fā)出的測(cè)量命令觸發(fā)一個(gè)數(shù)據(jù)對(duì)的采集。每個(gè)數(shù)據(jù)對(duì)包括一個(gè)16位溫度值和一個(gè)16位濕度值(按此順序)。在傳輸過程中,每個(gè)數(shù)據(jù)值后面總是跟著一個(gè)CRC校驗(yàn)和(參見下圖所示)。在單次模式下,可以選擇不同的測(cè)量命令。16位命令(參見下圖所示)。它們?cè)诳芍貜?fù)性(低、中、高)和時(shí)鐘延伸(使能或禁用)方面有所不同。重復(fù)性設(shè)置會(huì)影響測(cè)量持續(xù)時(shí)間,從而影響傳感器的總能耗。
2、代碼實(shí)現(xiàn)方式
在main主函數(shù)中調(diào)用初始化后,通過調(diào)用下面的函數(shù)實(shí)現(xiàn)兩種方式的單次測(cè)量。
// 演示帶時(shí)鐘拉伸的單次測(cè)量error = SHT3X_GetTempAndHumi(&temperature, &humidity, REPEATAB_HIGH, MODE_CLKSTRETCH, 50);if(error != NO_ERROR){} // 在這里處理錯(cuò)誤 HAL_Delay(50);// 演示帶輪詢的單次測(cè)量,超時(shí)50毫秒error = SHT3X_GetTempAndHumi(&temperature, &humidity, REPEATAB_HIGH, MODE_POLLING, 50);if(error != NO_ERROR){} // 在這里處理錯(cuò)誤 HAL_Delay(50);
//----------------------------------------------------------------------------
// 獲取溫度和濕度
etError SHT3X_GetTempAndHumi(float* temperature, float* humidity,etRepeatability repeatability, etMode mode,uint8_t timeout)
{etError error; // 錯(cuò)誤代碼switch(mode){ case MODE_CLKSTRETCH: // 以時(shí)鐘拉伸模式獲取溫度和濕度error = SHT3X_GetTempAndHumiClkStretch(temperature, humidity,repeatability, timeout);break;case MODE_POLLING: // 以輪詢模式獲取溫度和濕度error = SHT3X_GetTempAndHumiPolling(temperature, humidity,repeatability, timeout);break;default: error = PARM_ERROR; // 參數(shù)錯(cuò)誤break;}return error; // 返回錯(cuò)誤代碼
}//----------------------------------------------------------------------------
// 使用時(shí)鐘拉伸獲取溫度和濕度
etError SHT3X_GetTempAndHumiClkStretch(float* temperature, float* humidity,etRepeatability repeatability,uint8_t timeout)
{etError error; // 錯(cuò)誤代碼uint16_t rawValueTemp; // 從傳感器獲取的溫度原始值uint16_t rawValueHumi; // 從傳感器獲取的濕度原始值// 以時(shí)鐘拉伸模式開始測(cè)量// 根據(jù)所需的可靠性使用相應(yīng)的命令switch(repeatability){case REPEATAB_LOW:error = SHT3X_WriteCommand(CMD_MEAS_CLOCKSTR_L);break;case REPEATAB_MEDIUM:error = SHT3X_WriteCommand(CMD_MEAS_CLOCKSTR_M);break;case REPEATAB_HIGH:error = SHT3X_WriteCommand(CMD_MEAS_CLOCKSTR_H);break;default:error = PARM_ERROR; // 參數(shù)錯(cuò)誤break;}// 如果沒有錯(cuò)誤,開始讀取訪問if(error == NO_ERROR) error = SHT3X_StartReadAccess();// 如果沒有錯(cuò)誤,讀取溫度原始值,讀取濕度原始值uint32_t rawValueTemp_rawValueHumi;if(error == NO_ERROR) error = SHT3X_Read4BytesAndCrc(&rawValueTemp_rawValueHumi, timeout);rawValueTemp = rawValueTemp_rawValueHumi>>16;rawValueHumi = rawValueTemp_rawValueHumi&0xffff;// 如果沒有錯(cuò)誤,計(jì)算溫度(℃)和濕度(%RH)if(error == NO_ERROR){*temperature = SHT3X_CalcTemperature(rawValueTemp);*humidity = SHT3X_CalcHumidity(rawValueHumi);}return error; // 返回錯(cuò)誤代碼
}//----------------------------------------------------------------------------
// 使用輪詢獲取溫度和濕度
etError SHT3X_GetTempAndHumiPolling(float* temperature, float* humidity,etRepeatability repeatability,uint8_t timeout)
{etError error; // 錯(cuò)誤代碼uint16_t rawValueTemp; // 從傳感器獲取的溫度原始值uint16_t rawValueHumi; // 從傳感器獲取的濕度原始值// 以輪詢模式開始測(cè)量// 根據(jù)所需的可靠性使用相應(yīng)的命令switch(repeatability){case REPEATAB_LOW:error = SHT3X_WriteCommand(CMD_MEAS_POLLING_L);break;case REPEATAB_MEDIUM:error = SHT3X_WriteCommand(CMD_MEAS_POLLING_M);break;case REPEATAB_HIGH:error = SHT3X_WriteCommand(CMD_MEAS_POLLING_H);break;default:error = PARM_ERROR; // 參數(shù)錯(cuò)誤break;}// 如果沒有錯(cuò)誤,等待直到測(cè)量完成if(error == NO_ERROR){// 每1毫秒輪詢一次,直到測(cè)量完成或超時(shí)while(timeout--){// 檢查測(cè)量是否完成error = SHT3X_StartReadAccess();// 如果測(cè)量已完成 -> 退出循環(huán)if(error == NO_ERROR) break;HAL_Delay(1);}// 檢查超時(shí)錯(cuò)誤if(timeout == 0) error = TIMEOUT_ERROR; // 發(fā)生超時(shí)錯(cuò)誤}// 如果沒有錯(cuò)誤,讀取溫度和濕度原始值if(error == NO_ERROR){uint32_t rawValueTemp_rawValueHumi;if(error == NO_ERROR) error = SHT3X_Read4BytesAndCrc(&rawValueTemp_rawValueHumi, 0);rawValueTemp = rawValueTemp_rawValueHumi>>16;rawValueHumi = rawValueTemp_rawValueHumi&0xffff;}// 如果沒有錯(cuò)誤,計(jì)算溫度(℃)和濕度(%RH)if(error == NO_ERROR){*temperature = SHT3X_CalcTemperature(rawValueTemp);*humidity = SHT3X_CalcHumidity(rawValueHumi);}return error; // 返回錯(cuò)誤代碼
}
三、周期性數(shù)據(jù)采集模式的測(cè)量
1、配置說明
????????在這種模式下,一個(gè)發(fā)出的測(cè)量命令產(chǎn)生一個(gè)數(shù)據(jù)對(duì)流。每個(gè)數(shù)據(jù)對(duì)包括一個(gè)16位溫度值和一個(gè)16位濕度值(按此順序)。在周期模式下,可以選擇不同的測(cè)量命令。相應(yīng)的16位命令(參見下圖所示)。它們?cè)诳芍貜?fù)性(低、中和高)和數(shù)據(jù)采集頻率(每秒0.5、1、2、4、10次測(cè)量)方面有所不同。在此模式下不能選擇時(shí)鐘拉伸。數(shù)據(jù)采集頻率和重復(fù)性設(shè)置會(huì)影響傳感器的測(cè)量持續(xù)時(shí)間和電流消耗。
????????測(cè)量數(shù)據(jù)的傳輸可以通過相應(yīng)的16位命令(參見下圖所示),啟動(dòng)讀取數(shù)據(jù)。如果沒有測(cè)量數(shù)據(jù),I2C讀取頭會(huì)響應(yīng)一個(gè)NACK時(shí),通信停止。
2、代碼實(shí)現(xiàn)方式
?在main主函數(shù)中調(diào)用初始化后,通過調(diào)用下面的函數(shù)實(shí)現(xiàn)兩種方式的連續(xù)測(cè)量。
error = SHT3X_StartPeriodicMeasurment(REPEATAB_HIGH, FREQUENCY_1HZ); // 讀取測(cè)量緩沖區(qū)
error = SHT3X_ReadMeasurementBuffer(&temperature, &humidity);if(error == NO_ERROR)
{// 點(diǎn)亮藍(lán)色LED以提示新溫度和濕度值//LedBlueOn();//DelayMicroSeconds(10000); // 延時(shí)10毫秒//LedBlueOff(); // 關(guān)閉藍(lán)色LED
}
else if (error == ACK_ERROR)
{// 如果緩沖區(qū)沒有新值,則忽略此錯(cuò)誤//error = NO_ERROR;
}
//----------------------------------------------------------------------------
// 啟動(dòng)周期性測(cè)量
etError SHT3X_StartPeriodicMeasurment(etRepeatability repeatability,etFrequency frequency)
{etError error; // 錯(cuò)誤代碼// 根據(jù)所需的可靠性和頻率使用相應(yīng)的命令switch(repeatability){case REPEATAB_LOW: // 低可靠性switch(frequency){case FREQUENCY_HZ5: // 低可靠性, 0.5 Hzerror = SHT3X_WriteCommand(CMD_MEAS_PERI_05_L);break; case FREQUENCY_1HZ: // 低可靠性, 1.0 Hzerror = SHT3X_WriteCommand(CMD_MEAS_PERI_1_L);break; case FREQUENCY_2HZ: // 低可靠性, 2.0 Hzerror = SHT3X_WriteCommand(CMD_MEAS_PERI_2_L);break; case FREQUENCY_4HZ: // 低可靠性, 4.0 Hzerror = SHT3X_WriteCommand(CMD_MEAS_PERI_4_L);break; case FREQUENCY_10HZ: // 低可靠性, 10.0 Hzerror = SHT3X_WriteCommand(CMD_MEAS_PERI_10_L);break; default:error = PARM_ERROR; // 參數(shù)錯(cuò)誤break;}break;case REPEATAB_MEDIUM: // 中等可靠性switch(frequency){case FREQUENCY_HZ5: // 中等可靠性, 0.5 Hzerror = SHT3X_WriteCommand(CMD_MEAS_PERI_05_M);break;case FREQUENCY_1HZ: // 中等可靠性, 1.0 Hzerror = SHT3X_WriteCommand(CMD_MEAS_PERI_1_M);break; case FREQUENCY_2HZ: // 中等可靠性, 2.0 Hzerror = SHT3X_WriteCommand(CMD_MEAS_PERI_2_M);break; case FREQUENCY_4HZ: // 中等可靠性, 4.0 Hzerror = SHT3X_WriteCommand(CMD_MEAS_PERI_4_M);break; case FREQUENCY_10HZ: // 中等可靠性, 10.0 Hzerror = SHT3X_WriteCommand(CMD_MEAS_PERI_10_M);break;default:error = PARM_ERROR; // 參數(shù)錯(cuò)誤break;}break;case REPEATAB_HIGH: // 高可靠性switch(frequency){case FREQUENCY_HZ5: // 高可靠性, 0.5 Hzerror = SHT3X_WriteCommand(CMD_MEAS_PERI_05_H);break;case FREQUENCY_1HZ: // 高可靠性, 1.0 Hzerror = SHT3X_WriteCommand(CMD_MEAS_PERI_1_H);break;case FREQUENCY_2HZ: // 高可靠性, 2.0 Hzerror = SHT3X_WriteCommand(CMD_MEAS_PERI_2_H);break;case FREQUENCY_4HZ: // 高可靠性, 4.0 Hzerror = SHT3X_WriteCommand(CMD_MEAS_PERI_4_H);break;case FREQUENCY_10HZ: // 高可靠性, 10.0 Hzerror = SHT3X_WriteCommand(CMD_MEAS_PERI_10_H);break;default:error = PARM_ERROR; // 參數(shù)錯(cuò)誤break;}break;default:error = PARM_ERROR; // 參數(shù)錯(cuò)誤break;}return error; // 返回錯(cuò)誤代碼
}//----------------------------------------------------------------------------
// 讀取測(cè)量緩沖區(qū)
etError SHT3X_ReadMeasurementBuffer(float* temperature, float* humidity)
{etError error; // 錯(cuò)誤代碼uint16_t rawValueTemp; // 從傳感器獲取的溫度原始值uint16_t rawValueHumi; // 從傳感器獲取的濕度原始值// 讀取測(cè)量值error = SHT3X_WriteCommand(CMD_FETCH_DATA);if(error == NO_ERROR) error = SHT3X_StartReadAccess(); uint32_t rawValueTemp_rawValueHumi;if(error == NO_ERROR) error = SHT3X_Read4BytesAndCrc(&rawValueTemp_rawValueHumi, 100);rawValueTemp = rawValueTemp_rawValueHumi>>16;rawValueHumi = rawValueTemp_rawValueHumi&0xffff;// 如果沒有錯(cuò)誤,計(jì)算溫度(℃)和濕度(%RH)if(error == NO_ERROR){*temperature = SHT3X_CalcTemperature(rawValueTemp);*humidity = SHT3X_CalcHumidity(rawValueHumi);}return error; // 返回錯(cuò)誤代碼
}
四、完整代碼下載鏈接
完整代碼下載鏈接:https://download.csdn.net/download/qq_26043945/89982127
數(shù)據(jù)手冊(cè):https://sensirion.com/media/documents/213E6A3B/63A5A569/Datasheet_SHT3x_DIS.pdf