STM32与SHT1X温湿度传感器通讯
在這次項目開發中應用到了SHT1X溫濕度傳感器,該系列有SHT10、SHT11和SHT15,屬于Sersirion溫濕度傳感器家族中的貼片封裝系列。包括一個電容性聚合體測濕敏感元件、一個用能隙材料制成的測溫元件,傳感器內部有一個精度高達14為位的A/D轉換器。更詳細資料請參考說明書。
1、硬件介紹
現在對本次使用的SHT15作簡要介紹。其引腳定義如下:
| 引腳 | 名稱 | 描述 | |
| 1 | GND | 地 | |
| 2 | DATA | 串行數據, 雙向 | |
| 3 | SCK | 串行時鐘, 輸入口 | |
| 4 | VDD | 電源 | |
| NC | NC | 必須為空 |
SHT1X溫濕度傳感器使用的2線通訊,類是于I2C總線,但并不相同,使用普通的GPIO就可實現通訊。此次采用STM32F103VET6來操作SHT15,具體的連接方式如下:
SCK 用于微處理器與SHT1x 之間的通訊同步。由于接口包含了完全靜態邏輯,因而不存在最小SCK 頻率。
DATA 引腳為三態結構,用于讀取傳感器數據 . 當向傳感器發送命令時, DATA 在 SCK 上升沿有效且在 SCK 高電平時必須保持穩定。 DATA 在 SCK 下降沿之后改變。為避免信號沖突,微處理器應驅動DATA 在低電平。需要一個外部的上拉電阻(例如: 10kΩ)將信號提拉至高電平。上拉電阻通常已包含在微處理器的I/O 電路中。
2、通訊實現
現在說明一下傳感器通訊的實現。首先看一看其操作命令。傳感器的命令包含三個地址位(目前只支持000,這就是只能掛接在空閑的IIC總線上的原因)和五個命令位。SHT1x 會以下述方式表示已正確地接收到指令:在第8個SCK 時鐘的下降沿之后,將DATA 下拉為低電平(ACK 位)。在第9個SCK 時鐘的下降沿之后,釋放DATA(恢復高電平)。命令集如下:
| 命令 | 代碼 |
| 預留 | 0000x |
| 溫度測量 | 00011 |
| 濕度測量 | 00101 |
| 讀狀態寄存器 | 00111 |
| 寫狀態寄存器 | 00110 |
| 預留 | 0101x-1110x |
| 軟復位, 接口復位, 狀態寄存器復位即恢復為默認狀態.在要發送下一個命令前,至少等待 11ms. | 11110 |
接下來具體說說各種該命令操作的實現:
2.1、啟動時序
用一組“啟動傳輸”時序來完成數據傳輸的初始化。它包括:當SCK時鐘高電平時DATA翻轉為低電平,緊接著SCK變成低電平,隨后是在SCK時鐘高電平,隨后是在SCK時鐘高電平DATA翻轉位高電平。時序如下:
具體的編碼實現如下:
/*SHT1X啟動時序操作*/ void StartSHT1XOperation(BusPinOperation *SetBusPin) {/*將data線設置為輸出模式*/SetDataPineDirection(Out);SetBusPin[DataPin](Set);SetBusPin[SckPin](Reset);Delayus(10);SetBusPin[SckPin](Set);Delayus(5);SetBusPin[DataPin](Reset);Delayus(5);SetBusPin[SckPin](Reset);Delayus(10);SetBusPin[SckPin](Set);Delayus(5);SetBusPin[DataPin](Set);Delayus(10);SetBusPin[SckPin](Reset); }2.2、通訊復位
如果與SHT1x 通訊中斷,可通過下列信號時序復位:當DATA 保持高電平時,觸發SCK 時鐘9 次或更多。時序圖如下:
具體的編碼實現如下:
/*SHT1X通訊復位*/ void ResetSHT1XCommunication(BusPinOperation *SetBusPin) {/*將data線設置為輸出模式*/SetDataPineDirection(Out);Delayms(1);SetBusPin[DataPin](Set);SetBusPin[SckPin](Reset);for(int i=0;i<9;i++){SetBusPin[SckPin](Set);Delayus(10);SetBusPin[SckPin](Reset);Delayus(10);}StartSHT1XOperation(SetBusPin); }同時也可以實現軟件復位,狀態寄存器復位為默認狀態。在要發送下一個命令前,至少等待 11ms。具體實現如下:
/*對SHT1X實現軟件復位*/ uint8_t Sht1xSoftwareReset(BusPinOperation *SetBusPin) {uint8_t err = 0;ResetSHT1XCommunication(SetBusPin);err=err+WriteByteT0Sht1x(SOFTWARE_RESET,SetBusPin);return err; }2.3、操作狀態寄存器
SHT1x 的某些高級功能可以通過給狀態寄存器發送指令來實現,如選擇測量分辨率,電量不足提醒,使用 OTP 加載或啟動加熱功能等。
/*讀狀態寄存器*/ uint8_t ReadStatusRegister(uint8_t *pValue,uint8_t *pCheckSum,BusPinOperation *SetBusPin) {uint8_t err=0;StartSHT1XOperation(SetBusPin);err=WriteByteT0Sht1x(READ_STATUS_REGISTER,SetBusPin);*pValue=ReadByteFromSht1x( Ack,SetBusPin);*pCheckSum=ReadByteFromSht1x( noAck,SetBusPin);return err; }/*寫狀態寄存器*/ uint8_t WriteStatusRegister(uint8_t *pValue,BusPinOperation *SetBusPin) {uint8_t err=0;StartSHT1XOperation(SetBusPin);err +=WriteByteT0Sht1x(WRITE_STATUS_REGISTER,SetBusPin);err +=WriteByteT0Sht1x(*pValue,SetBusPin);return err; }2.4、溫濕度的讀取和計算
發布一組測量命令(‘00000101’表示相對濕度RH,‘00000011’表示溫度T)后,控制器要等待測量結束。這個過程需要大約20/80/320ms,分別對應8/12/14bit 測量。根據本人測試8位時,15ms可以;12位時,70ms可以;14位時240ms可以。 SHT1x 通過下拉DATA 至低電平并進入空閑模式,表示測量的結束。控制器在再次觸發SCK 時鐘前,必須等待這個“數據備妥”信號來讀出數據。檢測數據可以先被存儲,這樣控制器可以繼續執行其它任務在需要時再讀出數據。
/*獲取SHT1X的溫度值*/ float GetSht1xTemperatureValue(float vdd,BusPinOperation *SetBusPin) {float tempValue=0.0;uint16_t sot=0;uint8_t err=0;uint8_t highByte=0;uint8_t lowByte=0;uint8_t checkSum=0;StartSHT1XOperation(SetBusPin);WriteByteT0Sht1x(TEMP_MEAS_COMMAND,SetBusPin);SetDataPineDirection(In);Delayms(240);if(ReadDataPinBit() == 1){err += 1;}highByte=ReadByteFromSht1x(Ack,SetBusPin);lowByte=ReadByteFromSht1x(Ack,SetBusPin);checkSum=ReadByteFromSht1x(noAck,SetBusPin);sot=(uint16_t)highByte;sot=(sot*256)+(uint16_t)lowByte;if(err != 0){ResetSHT1XCommunication(SetBusPin);}else{tempValue=ConvertTemperatureData(sot,vdd);}return tempValue; }/*獲取SHT1X的濕度值*/ float GetSht1xHumidityValue(float temp,BusPinOperation *SetBusPin) {float humiValue=0.0;uint16_t sorh=0;uint8_t err=0;uint8_t highByte=0;uint8_t lowByte=0;uint8_t checkSum=0;StartSHT1XOperation(SetBusPin);WriteByteT0Sht1x(HUMI_MEAS_COMMAND,SetBusPin);SetDataPineDirection(In);Delayms(70);if(ReadDataPinBit() == 1){err += 1;}highByte=ReadByteFromSht1x(Ack,SetBusPin);lowByte=ReadByteFromSht1x(Ack,SetBusPin);checkSum=ReadByteFromSht1x(noAck,SetBusPin);sorh=(highByte<<8)|lowByte;if(err != 0){ResetSHT1XCommunication(SetBusPin);}else{humiValue=ConvertHumidityData(sorh,temp);}return humiValue; }對于其他的計算部分直接按公式便寫即可。
歡迎關注:
總結
以上是生活随笔為你收集整理的STM32与SHT1X温湿度传感器通讯的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mybatis调用oracle过程,使用
- 下一篇: powershell 遍历json_如何