【瑞萨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]