基本数据:
供电范围:2.4V~5.5V,湿度误差±1.5,温度误差±0.2。
设备地址选择脚,ADDR(PIN2)接GND,设备写地址为0x88(0x44<<1),读地址为0x89(0x45<<1)。
读取的信息顺序是:温度数据(16位)+校验和(8位)+适度数据(16位)+校验和(8位)。
湿度:RH=100*(1.0*SRH / 65535),摄氏温度:T=-45+175*(1.0*ST / 65535);
单次数据采集模式:
可设置重复性和时钟延展。数据采集频率和重复性影响传感器测量时间和功耗。
例如:指令0x2c06,启用高重复性测量和时钟延展。
单次模式读取数据:注意单次下传感器测量时间间隙,
例如:发送0x2c06指令后,传感器工作(大概10ms)→发送“读报头”→传感器响应→SDA被拉低(大概2ms)→读出数据。
备注:时钟延展只适用于单次采集模式。
周期数据采集模式:
采用固定周期测量数据,有0.5mps,1mps,2mps,4mps,10mps。1mps采样频率,即1s采集一次。
循环模式读取数据:读取数据前要开启循环采集(指令0x2130,1mps,高重复性),
再重新发送指令0xE000,每次读完传感器数据寄存器都会清除。
如果传感器处于此模式,且正在采集数据,发送中断指令(0x3903),传感器将完成此次测量,进入单次采集模式。
下面是主要部分代码
#define SHT30_ADDR_WRITE 0x88
#define SHT30_ADDR_READ 0x89
#define ONE_SHOT 0x2c06
/*******************************************************/
#define PERIODIC_MODE_05S 0x2032// 0.5mps
#define PERIODIC_MODE_1S 0x2130// 1mps
#define PERIODIC_MODE_2S 0x2236// 2mps
#define PERIODIC_MODE_4S 0x2334// 4mps
#define PERIODIC_MODE_10S 0x2737// 10mps
#define FETCH_DATA 0xe000
/********************************************************/
void sht30_single_mode();
void sht30_periodic_readdata();
void sht30_periodic_init();
void sht30_readdata(uchar msb,uchar lsb);
uint sht30_data[4];
extern uchar flag_1s;
//1s读取一次数据发送到串口
int main()
{
usart_init();
sda=1;
scl=0;
delayms(10);
sht30_periodic_init();
//sht30_single_mode();
while(1)
{
if(flag_1s==1)
{
flag_1s=0;
sht30_readdata(0xe0,0x00);
}
}
}
void sht30_periodic_init()
{
i2c_start();
i2c_write_byte(SHT30_ADDR_WRITE);
i2c_write_byte(0x21);
i2c_write_byte(0x30);
i2c_stop();
}
void sht30_readdata(uchar msb,uchar lsb)
{
float RH,T;
i2c_start();
i2c_write_byte(SHT30_ADDR_WRITE);
i2c_write_byte(msb);
i2c_write_byte(lsb);
i2c_stop();
i2c_start();
i2c_write_byte(SHT30_ADDR_READ);
sht30_data[0]=i2c_read_byte(1);
sht30_data[0]<<=8;
sht30_data[0]|=i2c_read_byte(1);
sht30_data[1]=i2c_read_byte(1);
sht30_data[2]=i2c_read_byte(1);
sht30_data[2]<<=8;
sht30_data[2]|=i2c_read_byte(1);
sht30_data[3]=i2c_read_byte(0);
i2c_stop();
T=-45+175*(1.0*sht30_data[0] / 65535);
RH=100*(1.0*sht30_data[2] / 65535);
ES=0;
TI=1;
printf("温度:%2.2f ℃,湿度:%2.2f %%RH\n",T,RH);
while(!TI);
TI=0;
ES=1;
}