这次分享stm32驱动sht30温湿度传感器的方法和代码,这款传感器是仪器仪表行业上常用的一款型号。
目录
1.配置IO
2.写上通用的IIC协议
3.主函数获取数据
1.配置IO
我用到的IO口是
PB15---SCL
PB14---SDA
IIC中SDA和SCL引脚是开漏电路形式,所以SDA和SCL都要接上拉电阻,当总线空闲,SDA和SCL都是高电平
2.写上通用的IIC协议
//读出温湿度
void SHT30_read_result(u8 addr,u8 type)
{
int ret = 0;
u16 tem,hum;
u16 buff[6];
//发送指令为0x2C06(默认)
IIC_Start();
IIC_SendByte(addr<<1 | write);//写7位I2C设备地址加0作为写取位,1为写取位
IIC_wait_ACK();
if(type == TYPE_SHT40)
{
//SHT40
IIC_SendByte(0xFD);
IIC_wait_ACK();
}
else
{
//SHT30
IIC_SendByte(0x2c);
IIC_wait_ACK();
IIC_SendByte(0x06);
IIC_wait_ACK();
}
IIC_Stop();
Delay_ms(50);
IIC_Start();
IIC_SendByte(addr<<1 | read);//写7位I2C设备地址加1作为读取位,1为读取位
ret = IIC_wait_ACK();
if(!ret)
{
Delay_ms(1);
buff[0]=IIC_RcvByte();//返回温度高8位
IIC_ACK();
buff[1]=IIC_RcvByte();//返回温度低8位
IIC_ACK();
buff[2]=IIC_RcvByte();//温度crc校验位
IIC_ACK();
buff[3]=IIC_RcvByte();//返回湿度高8位
IIC_ACK();
buff[4]=IIC_RcvByte();//返回湿度低8位
IIC_ACK();
buff[5]=IIC_RcvByte();//湿度crc校验位
IIC_NACK();
IIC_Stop();
}
tem = ((buff[0]<<8) | buff[1]);
hum = ((buff[3]<<8) | buff[4]);
if(type == TYPE_SHT40)
{
//温湿度的计算方法如下
Temperature= 175.0*(float)tem/65535.0-45.0 ;
Humidity= 125.0*(float)hum/65535.0 - 6;
}
else
{
//温湿度的计算方法如下
Temperature= 175.0*(float)tem/65535.0-45.0 ;
Humidity= 100.0*(float)hum/65535.0;
}
hum=0;
tem=0;
}