流水源 发表于 2026-8-9 16:04:43

【瑞萨RA-eco-RA6M4评测】读取I2C接口温湿度传感器SHTC3

本次继续实现另一个传感器驱动:温湿度传感器SHTC3的数据读取。

### SHTC3简单说明

* SHTC3是一个检测温度和湿度的传感器,可以检测-40℃\~125℃的温度范围和0%\~100%的湿度范围,典型精度为±2 %RH和±0.2°C。
* SHTC3的工作电压范围为:1.62V\~3.6V。
* SHTC3使用的通讯方式是I2C,通讯速率可以达到400KHz。
* SHTC3只有4个引脚,电源和地、2个I2C通讯引脚。
* SHTC3的I2C设备地址为0x70。

!(https://www.eefocus.com/forum/data/attachment/forum/202608/09/155319psdvkxkbqdbyzvwz.png)

传感器与开发板连接:
!(https://www.eefocus.com/forum/data/attachment/forum/202608/09/155602mn9n9t5bb2o4j62n.png)

!(https://www.eefocus.com/forum/data/attachment/forum/202608/09/155648c8bbayaz4npgacyx.png)



**下面就是SHTC3的驱动程序。要注意SHTC3的寄存器是16位的2个字节。**

```
/*=========================================================================
    I2C ADDRESS/BITS
    -----------------------------------------------------------------------*/
    #define SHTC3_ADDRESS               (0x70)   
   
    #define SHTC3_CRC_POLYNOMIAL      0x131 // P(x) = x^8 + x^5 + x^4 + 1 = 100110001
/*=========================================================================*/

/*=========================================================================
    REGISTERS
    -----------------------------------------------------------------------*/
    //ID16BIT:B15 to 12 & 10 to 6: unspecified info.bits 11 & 5 to 0: SHTC3 identifier
    #define SHTC3_REG_ID                  (0xEFC8)    //xxxx 1xxx xx00 0111
    #define SHTC3_REG_SLEEP               (0xB098)    //
    #define SHTC3_REG_WAKEUP                (0x3517)    //
    #define SHTC3_REG_RESET               (0x805D)    //

//Mode1
    #define SHTC3_REG_CENM_TEMP_RH          (0x7CA2)    //普通模式测量时间长:>10ms
    #define SHTC3_REG_CENM_RH_TEMP          (0x5C24)    //
    #define SHTC3_REG_CELPM_TEMP_RH         (0x6458)    //低功耗模式测量时间短: <1ms
    #define SHTC3_REG_CELPM_RH_TEMP         (0x44DE)    //

//Mode2
    #define SHTC3_REG_CDNM_TEMP_RH          (0x7866)    //
    #define SHTC3_REG_CDNM_RH_TEMP          (0x58E0)    //
    #define SHTC3_REG_CDLPM_TEMP_RH         (0x609C)    //
    #define SHTC3_REG_CDLPM_RH_TEMP         (0x401A)    //
   
//==============================================================================
uint16_t SHTC3_Init(void);
uint8_t SHTC3_GetMode1_TempRH(int *temp, int *humi);
```

```
#include "drv_shtc3.h"

#define   I2C_NUM   0

void SHTC3_WriteCmd(uint16_t cmd)
{
    uint8_t cbuf;
    cbuf=cmd>>8;
    cbuf=cmd&0xff;
    I2C_Write(I2C_NUM,SHTC3_ADDRESS,cbuf,2,cbuf,0);
}

void SHTC3_ReadData(uint16_t cmd,uint8_t *buff,uint32_t len)
{
    uint8_t cbuf;
    cbuf=cmd>>8;
    cbuf=cmd&0xff;
    I2C_Read(I2C_NUM,SHTC3_ADDRESS,cbuf,2,buff,len);
}

int SHTC3_CalcTemperature(uint32_t rawValue)
{
// calculate temperature
// T = -45 + 175 * rawValue / 2^16
return (((175*1 * rawValue)>>16) - 45*1);   //放大1倍
}

int SHTC3_CalcHumidity(uint32_t rawValue)
{
// calculate relative humidity
// RH = rawValue / 2^16 * 100
return ((100 * 1 * rawValue)>>16);   //放大1倍
}

static uint8_t SHTC3_CheckCRC(uint8_t *buff, uint32_t nbyte)
{
    uint32_t i;            // byte counter   
    uint8_tbit;          // bit mask
    uint8_tcrc = 0xFF;   // calculated checksum

    // calculates 8-Bit checksum with given polynomial
    for(i = 0; i < nbyte; i++)
    {
      crc ^= (buff);
      for(bit = 8; bit > 0; --bit)
      {
            if(crc & 0x80) {
                crc = (crc << 1) ^ SHTC3_CRC_POLYNOMIAL;
            } else {
                crc = (crc << 1);
            }
      }
    }
    return crc;
}


uint16_t shtc3_id;
uint16_t SHTC3_Init(void)
{
    uint8_t buff;
    shtc3_id = 0;
    shtc3_gpio_init();

    SHTC3_ReadData(SHTC3_REG_ID,buff,3);
    if(buff != SHTC3_CheckCRC(buff,2))
    {
      return -1;
    }
    delay_ms(10);
    SHTC3_WriteCmd(SHTC3_REG_WAKEUP);
    shtc3_id = (buff<<8)|buff;
    return shtc3_id;
}

uint8_t SHTC3_GetMode1_TempRH(int *temp, int *humi)
{
    uint8_t buff;
   
    SHTC3_ReadData(SHTC3_REG_CELPM_TEMP_RH,buff,6);
    if((buff != SHTC3_CheckCRC(buff,2))||(buff != SHTC3_CheckCRC(&buff,2)))
    {
      return 1;
    }
    *temp = SHTC3_CalcTemperature((buff<<8)|buff);
    *humi = SHTC3_CalcHumidity((buff<<8)|buff);
    return 0;
}

#if UART_SHELL == 2
#include "nr_micro_shell.h"

void shtc3_read(char argc, char *argv)
{
    int    temperature,rh;
   
    printf("SHTC3:%d\r\n",SHTC3_Init());
    SHTC3_GetMode1_TempRH(&temperature, &rh);
    printf("temperature=%d,\t rh=%d.\r\n",temperature,rh);
}

NR_SHELL_CMD_EXPORT(shtc3,   shtc3_read,   "get temperature senser shtc3 data");

#endif
```

接着就是在hal_entry.c中添加初始化传感器和读取数值并在oled上显示。
!(https://www.eefocus.com/forum/data/attachment/forum/202608/09/160317fee7eaj747x17747.png)

编译下载之后就可以在oled上看到温湿度显示了。

!(https://www.eefocus.com/forum/data/attachment/forum/202608/09/160354ojlcn2oowzg7kc2f.png)

工程代码:



页: [1]
查看完整版本: 【瑞萨RA-eco-RA6M4评测】读取I2C接口温湿度传感器SHTC3