一、性能介绍 Sensirion SHT21 是I2C 湿度和温度传感器 +/-2% RH accuracy 物理量的转换公式 二、硬件电路 SCL和 SDA信号线相互平行并且非常接 近,有可能导致信号串扰和通讯失败。解决方法是在两个信号线之间放置 VDD和/或 GND,将信号线隔开,和使用屏蔽电缆 须在电源引脚(VDD,GND)之间加一个 100nF的去藕电容,用于滤波。此电容应尽量靠近传感器 三、I2C命令 有两个模式 hold master 与 no hold master hold master 模式,SHT21 转到master 模式,对CLK 控制,直至转换结束,期间I2C不能用于其他的通信 no hold master模式 SHT21 没有对CLK 控制,期间MCU可以和其他的通信,在没有转换结束是SHT21不产生应答信号 STH21的device address 为0x40 #define SHT21_DEV_ADDR 0x40//Current Sensirion Device Addr =0x40 #define RH_MEAS_CONST (-6) #define T_MEAS_CONST (-46.85) #define RH_MEAS_MULT_CONST12 0.03051 // (125/2^RES); RES=12-bit for RH #define T_MEAS_MULT_CONST14 0.01054 // (172.72/2^RES); RES=14-bit for Temp #define SHT21_I2C_WRITE_ADDR 0x80// (SHT21_DEV_ADDR<<1)|0 #define SHT21_I2C_READ_ADDR 0x81// (SHT21_DEV_ADDR<<1)|1 #define SHT21_Delay 0x1F //0x1FFF //how much????????????? #define SHT21_TRIG_T_MEAS_HOLDMASTER0xE3 #define SHT21_TRIG_RH_MEAS_HOLDMASTER0xE5 #define SHT21_WRITE_USER_REGISTER 0xE6 #define SHT21_READ_USER_REGISTER 0xE7 #define SHT21_TRIG_T_MEAS_NO_HOLDMASTER0xF3//POLL MODE #define SHT21_TRIG_RH_MEAS_NO_HOLDMASTER 0xF5//POLL MODE #define SHT21_SOFT_RESET_REGISTER 0xFE #define SHT21_RESOLUTION_RH12BIT_T14BIT 0x00 //12-bit RH & 14-bit Temperature (DEFAULT) #define SHT21_RESOLUTION_RH8BIT_T12BIT 0x01 //8-bit RH & 12-bit Temperature #define SHT21_RESOLUTION_RH10BIT_T13BIT 0x80 //10-bit RH & 13-bit Temperature #define SHT21_RESOLUTION_RH11BIT_T11BIT 0x81 //12-bit RH & 14-bit Temperature #define SHT21_END_OF_BATTERY_ON 0x40 ADSENSORAPP_RESULT_TYPE SHT21_Init() { ADSENSORAPP_RESULT_TYPE status; //status = adsAPI_I2C_Reg_Write_Byte(SHT21_DEV_ADDR, SHT21_SOFT_RESET_REGISTER,0x00); //adsAPI_Delay(SHT21_Delay*1000); status = adsAPI_I2C_Reg_Write_Byte(SHT21_DEV_ADDR,SHT21_WRITE_USER_REGISTER,SHT21_RESOLUTION_RH12BIT_T14BIT);//设置分辨率 adsAPI_Delay(SHT21_Delay); return status; } ADSENSORAPP_RESULT_TYPE Get_Temp_From_SHT21() { uint16_t Data; ADSENSORAPP_RESULT_TYPE result; NVIC_DisableIRQ(WUT_IRQn); result = adsAPI_I2C_Reg_Read_Word(SHT21_DEV_ADDR, SHT21_TRIG_T_MEAS_HOLDMASTER, &Data, 1); //result = adsAPI_I2C_Reg_Read_Word(SHT21_DEV_ADDR, SHT21_TRIG_T_MEAS_NO_HOLDMASTER, &Data, 1); NVIC_EnableIRQ(WUT_IRQn); if(result == API_FAIL) { SensData.SHT21_T=0.00; } else { Data = Data >> 2; SensData.SHT21_T = (float) (T_MEAS_CONST + (T_MEAS_MULT_CONST14 * Data)); //Temparature = (-46.85+176.72*St/2^RES) } return result; } ADSENSORAPP_RESULT_TYPE Get_RH_From_SHT21() { uint16_t Data; ADSENSORAPP_RESULT_TYPE result; NVIC_DisableIRQ(WUT_IRQn);//避免中断的干扰 result = adsAPI_I2C_Reg_Read_Word(SHT21_DEV_ADDR, SHT21_TRIG_RH_MEAS_HOLDMASTER, &Data, 1); //result = adsAPI_I2C_Reg_Read_Word(SHT21_DEV_ADDR, SHT21_TRIG_RH_MEAS_NO_HOLDMASTER, &Data, 1); NVIC_EnableIRQ(WUT_IRQn); if(result == API_FAIL) { SensData.SHT21_RH=0.00; } else { Data = Data >> 4; SensData.SHT21_RH = (float) (RH_MEAS_CONST + (RH_MEAS_MULT_CONST12 * Data)); //Relative Humidity = (-6 + 125*RHval/2^RES) } return result; }
|