sht10温湿度传感器 发表于 2007-11-8 14:18:35 最近在用瑞士的SENSIRION的SHT10温湿度传感器,感觉用起来还不错,挺方便的。就是价格高一些。也有人建议用湿敏电阻,有机会试一下。下面是51的c语言代码。参考一下。后面附有原厂提供的c代码的pdf文件 /****************************************************************************************** * 函数名称 :Transstart * 功能描述 : * 参数 : 参数名称: 输入/输出? 类型 描述 * * 返回值 : * 作者 : * 创建日期 :2006-12-19 * 全局变量 : * 全局静态变量: * 局部静态变量: *----------------------------------------修改历史------------------------------------------ * 当前版本 : 修改人: 修改日期: * 修改说明 : ******************************************************************************************/ void Transstart(void) {
DQ=1; SCK=0; NOP(); SCK="1"; NOP(); DQ="0"; NOP(); SCK="0"; NOP(); NOP(); NOP(); SCK="1"; NOP(); DQ="1"; NOP(); SCK="0"; } /****************************************************************************************** * 函数名称 :Hum_write_byte * 功能描述 :写字节函数 * 参数 : 参数名称: 输入/输出? 类型 描述 * * 返回值 : * 作者 : * 创建日期 :2006-12-19 * 全局变量 : * 全局静态变量: * 局部静态变量: *----------------------------------------修改历史------------------------------------------ * 当前版本 : 修改人: 修改日期: * 修改说明 : ******************************************************************************************/ char Hum_write_byte(unsigned char value) { unsigned char i,error=0; for (i=0x80;i>0;i/=2) //高位为1,循环右移 { if (i & value) DQ="1"; //和要发送的数相与,结果为发送的位 else DQ="0"; SCK=1; NOP();NOP();NOP(); SCK=0; } DQ="1"; //释放数据线
SCK="1"; error="DQ"; //检查应答信号,确认通讯正常 SCK="0"; return error; //error=1 通讯错误 } /****************************************************************************************** * 函数名称 :Hum_read_byte * 功能描述 :读数据 * 参数 : 参数名称: 输入/输出? 类型 描述 * * 返回值 : * 作者 : * 创建日期 :2006-12-19 * 全局变量 : * 全局静态变量: * 局部静态变量: *----------------------------------------修改历史------------------------------------------ * 当前版本 : 修改人: 修改日期: * 修改说明 : ******************************************************************************************/ char Hum_read_byte(unsigned char ack)
{ unsigned char i,val=0;
DQ=1; //数据线为高 for (i=0x80;i>0;i/=2) //右移位 { SCK=1; if (DQ) val=(val | i); //读数据线的值 SCK=0; }
DQ=!ack; //如果是校验,读取完后结束通讯; SCK=1; NOP();NOP();NOP(); SCK=0; DQ=1; //释放数据线 return val; } /****************************************************************************************** * 函数名称 :RESET_SHT10 * 功能描述 :复位湿度传感器 * 参数 : 参数名称: 输入/输出? 类型 描述 * * 返回值 : * 作者 : * 创建日期 :2006-12-19 * 全局变量 : * 全局静态变量: * 局部静态变量: *----------------------------------------修改历史------------------------------------------ * 当前版本 : 修改人: 修改日期: * 修改说明 : ******************************************************************************************/ void RESET_SHT10(void) { unsigned char i; DQ = 1; SCK = 0; //准备 for(i=0;i<9;i++) //DATA保持高,SCK时钟触发9次,发送启动传输,通迅即复位 { SCK=1; SCK=0; } Transstart(); //启动传输 }
/****************************************************************************************** * 函数名称 :Hum_measure * 功能描述 :进行温度或者湿度转换,由参数mode决定转换内容; * 参数 : 参数名称: 输入/输出? 类型 描述 * * 返回值 : * 作者 : * 创建日期 :2006-12-19 * 全局变量 : * 全局静态变量: * 局部静态变量: *----------------------------------------修改历史------------------------------------------ * 当前版本 : 修改人: 修改日期: * 修改说明 : ******************************************************************************************/ char Hum_measure(unsigned char *p_value, unsigned char *p_checksum, unsigned char mode) { unsigned error="0"; unsigned char i;
Transstart(); //启动传输 switch(mode){ case TEMP: error+=Hum_write_byte(MEASURE_TEMP); break; case HUMI : error+=Hum_write_byte(MEASURE_HUMI); break; default : break; } for (i=0;i<65535;i++) {
if(DQ==0) break; //等待测量结束; } if(DQ) error+=1; // 如果长时间数据线没有拉低,说明测量错误 *(p_value) =Hum_read_byte(ACK); //读第一个字节,高字节 (MSB) *(p_value+1)= Hum_read_byte(ACK); //读第二个字节,低字节 (LSB) *p_checksum =Hum_read_byte(noACK); //read CRC校验码 return error; }
/****************************************************************************************** * 函数名称 :calc_sth10 * 功能描述 :补偿及输出温度和相对湿度 * 参数 : 参数名称: 输入/输出? 类型 描述 * * 返回值 : * 作者 : * 创建日期 :2006-12-19 * 全局变量 : * 全局静态变量: * 局部静态变量: *----------------------------------------修改历史------------------------------------------ * 当前版本 : 修改人: 修改日期: * 修改说明 : ******************************************************************************************/ void calc_sth10(float *p_humidity ,float *p_temperature) { const float C1=-4.0; // for 12 Bit 湿度修正公式 const float C2=+0.0405; // for 12 Bit 湿度修正公式 const float C3=-0.0000028; // for 12 Bit 湿度修正公式 const float T1=+0.01; // for 14 Bit @ 5V 温度修正公式 const float T2=+0.00008; // for 14 Bit @ 5V 温度修正公式 float rh=*p_humidity; float t=*p_temperature; float rh_lin; float rh_true; float t_C; t_C=t*0.01 - 40; //补偿温度 rh_lin=C3*rh*rh + C2*rh + C1; //相对湿度非线性补偿 rh_true=(t_C-25)*(T1+T2*rh)+rh_lin; //相对湿度对于温度依赖性补偿 if(rh_true>100)rh_true=100; //湿度最大修正 if(rh_true<0.1)rh_true=0.1; //湿度最小修正 *p_temperature=t_C; //返回温度结果 *p_humidity=rh_true; //返回湿度结果 } /****************************************************************************************** * 函数名称 : calc_dewpoint * 功能描述 :计算绝对湿度值 * 参数 : 参数名称: 输入/输出? 类型 描述 * * 返回值 : * 作者 : * 创建日期 :2006-12-19 * 全局变量 : * 全局静态变量: * 局部静态变量: *----------------------------------------修改历史------------------------------------------ * 当前版本 : 修改人: 修改日期: * 修改说明 : ******************************************************************************************/ float calc_dewpoint(float h,float t) { float logEx,dew_point; logEx="0".66077+7.5*t/(237.3+t)+(log10(h)-2); dew_point = (logEx - 0.66077)*237.3/(0.66077+7.5-logEx); return dew_point; } |