STM32HAL庫傳感器篇之SHT30溫濕度

傳感器介紹

SHT30是瑞士Sensirion公司推出的一款高精度數(shù)字溫濕度傳感器。以下是根據(jù)手冊(cè)對(duì)其的重點(diǎn)介紹:

  • 主要特性
    • 高精度測(cè)量:溫度測(cè)量范圍為-40℃125℃,在0℃65℃區(qū)間內(nèi)精度可達(dá)±0.2℃;濕度測(cè)量范圍為0%RH100%RH,在20%RH80%RH區(qū)間內(nèi)精度可達(dá)±2%RH。
    • 數(shù)字輸出接口:采用I2C總線接口,支持標(biāo)準(zhǔn)模式(100kHz)和快速模式(400kHz),可直接與微控制器通信,簡(jiǎn)化硬件設(shè)計(jì)。
    • 低功耗設(shè)計(jì):支持單次測(cè)量模式和周期性測(cè)量模式,單次測(cè)量后可自動(dòng)進(jìn)入休眠模式,休眠電流僅0.1μA,周期性測(cè)量時(shí)平均電流最低可至0.5μA。
    • 穩(wěn)定性與可靠性:采用CMOSens?技術(shù),集成了溫度補(bǔ)償功能,有效降低環(huán)境溫度對(duì)濕度測(cè)量的影響,同時(shí)具備抗干擾能力,使用壽命可達(dá)10年以上。
    • 小巧封裝:提供DFN封裝(2.5mm×2.5mm×0.9mm)和TO-92封裝,適合空間受限的場(chǎng)景。
  • 工作原理
    • 濕度測(cè)量原理:濕度感應(yīng)元件采用高分子聚合物電容結(jié)構(gòu),當(dāng)環(huán)境濕度變化時(shí),聚合物薄膜吸收或釋放水分子,導(dǎo)致其介電常數(shù)發(fā)生改變,進(jìn)而使電容器的容量產(chǎn)生對(duì)應(yīng)變化,信號(hào)處理電路將電容容量變化轉(zhuǎn)換為數(shù)字信號(hào)。
    • 溫度測(cè)量原理:溫度感應(yīng)元件采用高精度鉑電阻或NTC熱敏電阻,傳感器內(nèi)部向其施加恒定微小電流,隨著環(huán)境溫度變化,鉑電阻的電阻值發(fā)生線性變化,根據(jù)歐姆定律,電阻兩端的電壓也會(huì)隨之變化,電壓信號(hào)經(jīng)過處理后轉(zhuǎn)換為數(shù)字信號(hào)。
  • 工作模式
    • 單次測(cè)量模式:發(fā)送測(cè)量命令后執(zhí)行單次測(cè)量,支持不同重復(fù)性等級(jí),如高重復(fù)性(0x2C06/0x2400)、中重復(fù)性(0x2C0D/0x240B)、低重復(fù)性(0x2C10/0x2416)。
    • 周期測(cè)量模式:可配置測(cè)量頻率,如0.5mps(0.5次/秒)、1mps(1次/秒)、2mps(2次/秒)、4mps(4次/秒)、10mps(10次/秒)。
  • 其他特點(diǎn)
    • 寬電源電壓范圍:工作電壓范圍為2.4V~5.5V,適合各類應(yīng)用。
    • 兩個(gè)獨(dú)特和用戶可選I2C地址:方便在同一I2C總線上連接多個(gè)傳感器。
    • 報(bào)警模式:具有可編程溫濕度極限的報(bào)警模式,可用于特定場(chǎng)景的監(jiān)控。

手冊(cè)下載:
SHT30-DIS-B2.5KS -PDF數(shù)據(jù)手冊(cè)-參考資料-立創(chuàng)商城

代碼配置演示

#include "SHT30.h"

/**
 * @brief  SHT30 初始化(軟件復(fù)位)
 * @param  hi2c:IIC句柄指針
 * @retval 0:初始化成功 1:初始化失敗
 */
uint8_t SHT30_Init(I2C_HandleTypeDef *hi2c)
{
    // 軟件復(fù)位,確保傳感器處于初始狀態(tài)
    if (SHT30_SoftReset(hi2c) != 0)
    {
        return 1;
    }
    HAL_Delay(10);  // 復(fù)位后等待穩(wěn)定
    return 0;
}

/**
 * @brief  SHT30 軟件復(fù)位
 * @param  hi2c:IIC句柄指針
 * @retval 0:復(fù)位成功 1:復(fù)位失敗
 */
uint8_t SHT30_SoftReset(I2C_HandleTypeDef *hi2c)
{
    uint8_t ucCmd[2] = {0};
    ucCmd[0] = (SHT30_CMD_SOFT_RESET >> 8) & 0xFF;  // 命令高位字節(jié)
    ucCmd[1] = SHT30_CMD_SOFT_RESET & 0xFF;         // 命令低位字節(jié)

    // 發(fā)送復(fù)位命令
    if (HAL_I2C_Master_Transmit(hi2c, SHT30_ADDR, ucCmd, 2, 100) != HAL_OK)
    {
        return 1;
    }
    return 0;
}

/**
 * @brief  SHT30 CRC8 校驗(yàn)(官方標(biāo)準(zhǔn)算法)
 * @param  pucData:待校驗(yàn)數(shù)據(jù)指針
 * @param  ucLen:待校驗(yàn)數(shù)據(jù)長(zhǎng)度
 * @retval 計(jì)算得到的CRC值
 */
static uint8_t SHT30_CRC8(uint8_t *pucData, uint8_t ucLen)
{
    const uint8_t ucPolynomial = 0x31;  // CRC多項(xiàng)式
    uint8_t ucCrc = 0xFF;               // 初始值

    for (uint8_t i = 0; i < ucLen; i++)
    {
        ucCrc ^= pucData[i];
        for (uint8_t j = 0; j < 8; j++)
        {
            ucCrc = (ucCrc & 0x80) ? (ucCrc << 1) ^ ucPolynomial : (ucCrc << 1);
        }
    }
    return ucCrc;
}

/**
 * @brief  SHT30 讀取溫濕度(帶CRC校驗(yàn))
 * @param  hi2c:IIC句柄指針
 * @param  pfTemp:溫度存儲(chǔ)指針
 * @param  pfHumi:濕度存儲(chǔ)指針
 * @retval 0:讀取成功 1:讀取失敗 2:CRC校驗(yàn)失敗
 */
uint8_t SHT30_ReadTempHumi(I2C_HandleTypeDef *hi2c, float *pfTemp, float *pfHumi)
{
    uint8_t ucCmd[2] = {0};
    uint8_t ucData[6] = {0};  // 存儲(chǔ):溫度高位、溫度低位、溫度CRC、濕度高位、濕度低位、濕度CRC
    uint16_t usTemp = 0, usHumi = 0;

    // 1. 發(fā)送高重復(fù)性測(cè)量命令
    ucCmd[0] = (SHT30_CMD_MEAS_HIGH_REP >> 8) & 0xFF;
    ucCmd[1] = SHT30_CMD_MEAS_HIGH_REP & 0xFF;
    if (HAL_I2C_Master_Transmit(hi2c, SHT30_ADDR, ucCmd, 2, 100) != HAL_OK)
    {
        return 1;
    }
    HAL_Delay(20);  // 等待測(cè)量完成(高重復(fù)性測(cè)量最大耗時(shí)15ms)

    // 2. 讀取6字節(jié)數(shù)據(jù)(溫濕度+CRC)
    if (HAL_I2C_Master_Receive(hi2c, SHT30_ADDR, ucData, 6, 100) != HAL_OK)
    {
        return 1;
    }

    // 3. CRC校驗(yàn)(分別校驗(yàn)溫度和濕度數(shù)據(jù))
    if (SHT30_CRC8(&ucData[0], 2) != ucData[2] || SHT30_CRC8(&ucData[3], 2) != ucData[5])
    {
        return 2;  // 校驗(yàn)失敗
    }

    // 4. 計(jì)算溫濕度(按官方公式轉(zhuǎn)換)
    usTemp = (ucData[0] << 8) | ucData[1];
    usHumi = (ucData[3] << 8) | ucData[4];
    *pfTemp = -45.0f + (175.0f * usTemp) / 65535.0f;  // 溫度范圍:-45~125℃
    *pfHumi = (100.0f * usHumi) / 65535.0f;            // 濕度范圍:0~100%RH

    return 0;
}
#ifndef __SHT30_H
#define __SHT30_H

#include "stm32f1xx_hal.h"
#include <stdio.h>

// SHT30 設(shè)備地址(根據(jù)硬件接線選擇,ADDR接GND為0x44,接VCC為0x45)
#define SHT30_ADDR 0x44 << 1  // IIC地址左移1位,兼容HAL庫IIC函數(shù)格式

// SHT30 命令定義
#define SHT30_CMD_MEAS_HIGH_REP 0x2400  // 高重復(fù)性測(cè)量
#define SHT30_CMD_MEAS_MID_REP  0x240B  // 中重復(fù)性測(cè)量
#define SHT30_CMD_MEAS_LOW_REP  0x2416  // 低重復(fù)性測(cè)量
#define SHT30_CMD_SOFT_RESET    0x30A2  // 軟件復(fù)位

// 函數(shù)聲明
uint8_t SHT30_Init(I2C_HandleTypeDef *hi2c);
uint8_t SHT30_SoftReset(I2C_HandleTypeDef *hi2c);
uint8_t SHT30_ReadTempHumi(I2C_HandleTypeDef *hi2c, float *pfTemp, float *pfHumi);
static uint8_t SHT30_CRC8(uint8_t *pucData, uint8_t ucLen);

#endif

//初始化
//需要在Cubemx軟件中配置IIC1
        ucRet = SHT30_Init(&hi2c1);
        if (ucRet == 0)
        {
        printf("SHT30初始化成功\r\n");
        }
        else
        {
        printf("SHT30初始化失敗,錯(cuò)誤碼:%d\r\n", ucRet);
        }

//死循環(huán)
  while (1)
  {
    ucRet = SHT30_ReadTempHumi(&hi2c1, &fShtTemp, &fShtHumi);
    if (ucRet == 0)
    {
        printf("溫度:%.2f℃,濕度:%.2f%%RH\r\n", fShtTemp, fShtHumi);
    }
    else if (ucRet == 2)
    {
        printf("SHT30數(shù)據(jù)CRC校驗(yàn)失敗\r\n");
    }
    else
    {
        printf("SHT30數(shù)據(jù)讀取失敗\r\n");
    }
    

    HAL_Delay(1000); // 每隔1秒讀取一次
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }

測(cè)試結(jié)果

上位機(jī)測(cè)試結(jié)果

結(jié)語

主要是給學(xué)弟提供一個(gè)參考的跑的通的模板程序,僅供參考學(xué)習(xí)!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容