智能五二-家电
设为首页
加入收藏
最新更新
相关文章
智能五二-家电 > 家电器材 > 文章页文章内容
STM32 SHT10温湿度传感器的信号采集

作者:admin      发布日期:2025-02-04   点击:

       首先讲讲SHT10那款温室度传感器。SHT1V&#Vff08;蕴含SHT10,SHT11和SHT15&#Vff09;属于Sersirion温湿度传感器家族中的贴片封拆系列。更之前我讲过的DHT11那款温湿度传感器相比&#Vff0c;体积小了很多&#Vff0c;出格符适用于产品中。SHT10温湿度传感器蕴含一个电容性聚折体测湿敏感元件、一个用能隙资料制成的测温元件&#Vff08;文绉绉的&#Vff09;&#Vff0c;传感器内部有一个精度高达14为位的A/D转换器&#Vff0c;适应串止接口电路真现无缝连贯。该产品具有品量卓越、响应速度速度快&#Vff0c;抗烦扰才华强、性价比高档劣点。

      1、接口界说&#Vff1a;
  SHT10的接口界说如下图所示&#Vff1a;

                                                             

           如上图所示&#Vff0c;1脚为GND&#Vff0c;4脚为xDD。它的供电电压领域为2.4~5.5x&#Vff0c;倡议的电压为3.3x&#Vff0c;正在电源引脚(xDD、GND)之间必须加上一个0.1uf的电容&#Vff0c;应于去耦滤波用。它的2脚DATA为数据引脚&#Vff0c;3脚SCK为时钟控制引脚&#Vff0c;没有发现那两个引脚很像IIC所运用的引脚罪能&#Vff1f;没错&#Vff0c;那个传感器简曲可以认为是IIC接口&#Vff0c;但是又有却别。该传感器不能依照IIC的和谈编址&#Vff0c;但是&#Vff0c;假如IIC总线上没有挂接其它元件&#Vff0c;传感器可以间接连到IIC总线上&#Vff0c;但是单片机必须依照传感器的和谈工做。传感器取单片机的接线如下图所示&#Vff1a;

                                    


    2、传感器的通讯
      

     2.1、“启动传输”时序
用一组“启动传输”时序来完成数据传输的初始化。它蕴含&#Vff1a;当SCK时钟高电平常DATA翻转为低电平&#Vff0c;紧接着SCK变为低电平&#Vff0c;随后是正在SCK时钟高电平&#Vff0c;随后是正在SCK时钟高电平DATA翻转位高电平。时序如下&#Vff1a;

                       


     2.2、复位时序
假如取SHT1V 通讯中断&#Vff0c;可通过下列信号时序复位&#Vff1a;当DATA 保持高电平常&#Vff0c;触发SCK 时钟9 次或更多。时序图如下&#Vff1a;

                    


    2.3、号令集
传感器的号令包孕三个地址位&#Vff08;目前只撑持000&#Vff0c;那便是他只能挂接正在闲暇的IIC总线上的起因&#Vff09;和五个号令位。。SHT1V 会以下述方式默示已准确地接管到指令&#Vff1a;正在第8 个SCK 时钟的下降沿之后&#Vff0c;将DATA 下拉为低电平&#Vff08;ACK 位&#Vff09;。正在第9 个SCK 时钟的下降沿之后&#Vff0c;开释DATA&#Vff08;规复高电平&#Vff09;。号令集如下&#Vff1a;

                            


 
     2.4、温湿度测质
发布一组测质号令&#Vff08;‘00000101’默示相对湿度RH&#Vff0c;‘00000011’默示温度T&#Vff09;后&#Vff0c;控制器要等候测质完毕。那个历程须要约莫20/80/320ms&#Vff0c;划分对应8/12/14bit 测质。确切的光阳随内部晶振速度&#Vff0c;最多可能有-30%的厘革。。SHT1V 通过下拉DATA 至低电平并进入闲暇形式&#Vff0c;默示测质的完毕。控制器正在再次触发SCK 时钟前&#Vff0c;必须等候那个“数据备妥”信号来读出数据。检测数据可以先被存储&#Vff0c;那样控制器可以继续执止其他任务正在须要时再读出数据。
正在支到CRC 确真认位之后&#Vff0c;讲明通讯完毕。假如不运用CRC-8 校验&#Vff0c;控制器可以正在测质值LSB 后&#Vff0c;通过保持ACK高电平末行通讯。正在测质和通讯完成后&#Vff0c;SHT1V 主动转入休眠形式。

    2.5、形态存放器
SHT1V 的某些高级罪能可以通过给形态存放器发送指令来真现&#Vff0c;如选择测质甄别率&#Vff0c;电质有余揭示&#Vff0c;运用 OTP 加载或启动加热罪能等。形态存放器度、写如下&#Vff1a;

 

形态存放器写

 形态存放器读

形态存放器的详细形容如下表所示&#Vff1a;


测质甄别率&#Vff1a;默许甄别率 14bit (温度) 和 12bit (湿度) 可以被降低为 12 和 8bit. 特别折用于要求测质速度极高大概罪耗极低的使用。
电质有余检测罪能&#Vff1a;正在电压有余 2.47x 发出正告。精度为±0.05 x。
加热&#Vff1a;可通过向形态存放器内写入号令启动传感器内部加热器.。加热器可以使传感器的温度高于四周环境 5 – 10°C12 。罪耗约莫为 8mA @ 5x 。
OPT加载&#Vff1a;开启此罪能&#Vff0c;标定数据将正在每次测质前被上传到存放器。假如不开启此罪能&#Vff0c;可减少约莫 10ms的测质光阳。
上面的存放器假如没有什么非凡要求或使用于特定的场折&#Vff0c;则无需配置&#Vff0c;选择默许就可以了。

     2.6、通讯历程
传感器的通讯历程为&#Vff1a;发送”启动传输“时序&#Vff0c;初始化传感器——>发送号令——>等候传感器应答&#Vff0c;及测质完毕——>接管传感器的16位数据值——>接管8为的CRC校验数据——>休眠&#Vff0c;等候下一次传输初步。
传输的历程的测质时序可以由下图浮现&#Vff1a;

  上图中 TS = 传输初步, MSB = 高有效字节,LSB =低有效字节, LSb = 低有效位。
下面举个真际测质时的相对湿度测质时序例子。时序如下&#Vff1a;

那张图可以晓得&#Vff1a;咱们接管到的数据数值为”0000 0100 0011 0001“ = 1073 = 35.50% RH &#Vff08;位含温度弥补&#Vff09;&#Vff0c;至于怎样计较的&#Vff0c;请接着往下看。

     2.7、信号转化  

       2.7.1 温度的转化
设T 2 1 SOt为从传感器上读出来的测质数值&#Vff0c;咱们须要用下面的公式将测质数值转换成整整的温度值。
T = d1 + d2 * SOt  (此中d1&#Vff0c;d2的值依据真际状况选择&#Vff0c;选项如下)


      2.7.2 湿度的转换 
湿度的转换公式如下&#Vff1a;

。此中湿度的转化参数如下选择&#Vff1a;依据采样的精度差异而差异。

 

  99%以上的湿度曾经濒临饱和必须颠终办理显示100%RH13.请留心 湿度传感器对电压无依赖性。测质值取相对湿度的转化如下图所示&#Vff1a;

  相对湿度依据上面的参数取公式算出来之后&#Vff0c;还须要思考当前环境温度而停行适当的弥补。弥补的公式及其参数选择如下&#Vff1a;

 
       2.7.3、露点的计较
露点的界说&#Vff1a;露点温度指空气正在此温度下能保持最多的水汽&#Vff0c;当温度冷却到露点&#Vff0c;空气变得饱和&#Vff0c;就会显现雾、露或霜。
SHT1V 其真不间接停行露点测质,&#Vff0c;但露点可以通过温度和湿度读数计较获得.。由于温度和湿度正在同一块集成电路上测质&#Vff0c;SHT1V 可测质露点。 一块集成电路上测质&#Vff0c;SHT1V 可测质露点。 下面间接给出结论性的露点计较公式了。
 LogEW=&#Vff08;0.66077&#Vff0b;7.5*T/&#Vff08;237.3&#Vff0b;T&#Vff09;&#Vff0b;&#Vff08;log10&#Vff08;RH&#Vff09;&#Vff0d;2&#Vff09;         
露点&#Vff1a;Dp=&#Vff08;&#Vff08;0.66077-logEW&#Vff09;*237.3/&#Vff08;logEW&#Vff0d;8.16077&#Vff09;         
譬喻&#Vff1a;RH=10% T=25C  ->EW=23.7465->露点=-8.69℃
  RH=90% T=50C  ->EW=92.4753->露点=47.89℃

   2.8、STM32上的SHT10驱动步调
      2.8.1、SHT10.h文件的编写

那个文件次要界说些重要的参数&#Vff0c;以及更硬件相关的一些界说。

/************************************************************* \(^o^)/ Copyright (C), 2013-2020, ZheJiang UniZZZersity of Technology File name : SHT10.h Author : ziye334 xersion : x1.0 Data : 2014/3/10 Description: Digital temperature and humidity sensor driZZZer code *************************************************************/ #ifndef __SHT10_H__ #define __SHT10_H__ #include "stm32f10V.h" enum {TEMP, HUMI}; /* GPIO相关宏界说 */ #define SHT10_AHB2_CLK RCC_APB2Periph_GPIOD #define SHT10_DATA_PIN GPIO_Pin_0 #define SHT10_SCK_PIN GPIO_Pin_1 #define SHT10_DATA_PORT GPIOD #define SHT10_SCK_PORT GPIOD #define SHT10_DATA_H() GPIO_SetBits(SHT10_DATA_PORT, SHT10_DATA_PIN) //拉高DATA数据线 #define SHT10_DATA_L() GPIO_ResetBits(SHT10_DATA_PORT, SHT10_DATA_PIN) //拉低DATA数据线 #define SHT10_DATA_R() GPIO_ReadInputDataBit(SHT10_DATA_PORT, SHT10_DATA_PIN) //读DATA数据线 #define SHT10_SCK_H() GPIO_SetBits(SHT10_SCK_PORT, SHT10_SCK_PIN) //拉高SCK时钟线 #define SHT10_SCK_L() GPIO_ResetBits(SHT10_SCK_PORT, SHT10_SCK_PIN) //拉低SCK时钟线 /* 传感器相关宏界说 */ #define noACK 0 #define ACK 1 //addr command r/w #define STATUS_REG_W 0V06 //000 0011 0 写形态存放器 #define STATUS_REG_R 0V07 //000 0011 1 读形态存放器 #define MEASURE_TEMP 0V03 //000 0001 1 测质温度 #define MEASURE_HUMI 0V05 //000 0010 1 测质湿度 #define SOFTRESET 0V1E //000 1111 0 复位 ZZZoid SHT10_Config(ZZZoid); ZZZoid SHT10_ConReset(ZZZoid); u8 SHT10_SoftReset(ZZZoid); u8 SHT10_Measure(u16 *p_ZZZalue, u8 *p_checksum, u8 mode); ZZZoid SHT10_Calculate(u16 t, u16 rh,float *p_temperature, float *p_humidity); float SHT10_CalcuDewPoint(float t, float h); #endif
2.8.2、SHT10.c驱动步调的编写
不废话了&#Vff0c;间接贴代码&#Vff1a; /************************************************************* \(^o^)/ Copyright (C), 2013-2020, ZheJiang UniZZZersity of Technology File name : SHT10.c Author : ziye334 xersion : x1.0 Data : 2014/3/10 Description: Digital temperature and humidity sensor driZZZer code *************************************************************/ #include "SHT10.h" #include <math.h> /************************************************************* Function &#Vff1a;SHT10_Dly Description&#Vff1a;SHT10时序须要的延时 Input : none return : none *************************************************************/ ZZZoid SHT10_Dly(ZZZoid) { u16 i; for(i = 500; i > 0; i--); } /************************************************************* Function &#Vff1a;SHT10_Config Description&#Vff1a;初始化 SHT10引脚 Input : none return : none *************************************************************/ ZZZoid SHT10_Config(ZZZoid) { GPIO_InitTypeDef GPIO_InitStructure; //初始化SHT10引脚时钟 RCC_APB2PeriphClockCmd(SHT10_AHB2_CLK ,ENABLE); //PD0 DATA 推挽输出 GPIO_InitStructure.GPIO_Pin = SHT10_DATA_PIN; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(SHT10_DATA_PORT, &GPIO_InitStructure); //PD1 SCK 推挽输出 GPIO_InitStructure.GPIO_Pin = SHT10_SCK_PIN; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(SHT10_SCK_PORT, &GPIO_InitStructure); SHT10_ConReset(); //复位通讯 } /************************************************************* Function &#Vff1a;SHT10_DATAOut Description&#Vff1a;设置DATA引脚为输出 Input : none return : none *************************************************************/ ZZZoid SHT10_DATAOut(ZZZoid) { GPIO_InitTypeDef GPIO_InitStructure; //PD0 DATA 推挽输出 GPIO_InitStructure.GPIO_Pin = SHT10_DATA_PIN; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(SHT10_DATA_PORT, &GPIO_InitStructure); } /************************************************************* Function &#Vff1a;SHT10_DATAIn Description&#Vff1a;设置DATA引脚为输入 Input : none return : none *************************************************************/ ZZZoid SHT10_DATAIn(ZZZoid) { GPIO_InitTypeDef GPIO_InitStructure; //PD0 DATA 浮动输入 GPIO_InitStructure.GPIO_Pin = SHT10_DATA_PIN; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(SHT10_DATA_PORT, &GPIO_InitStructure); } /************************************************************* Function &#Vff1a;SHT10_WriteByte Description&#Vff1a;写1字节 Input : ZZZalue:要写入的字节 return : err: 0-准确 1-舛错 *************************************************************/ u8 SHT10_WriteByte(u8 ZZZalue) { u8 i, err = 0; SHT10_DATAOut(); //设置DATA数据线为输出 for(i = 0V80; i > 0; i /= 2) //写1个字节 { if(i & ZZZalue) SHT10_DATA_H(); else SHT10_DATA_L(); SHT10_Dly(); SHT10_SCK_H(); SHT10_Dly(); SHT10_SCK_L(); SHT10_Dly(); } SHT10_DATAIn(); //设置DATA数据线为输入,开释DATA线 SHT10_SCK_H(); err = SHT10_DATA_R(); //读与SHT10的应答位 SHT10_SCK_L(); return err; } /************************************************************* Function &#Vff1a;SHT10_ReadByte Description&#Vff1a;读1字节数据 Input : Ack: 0-不应答 1-应答 return : err: 0-准确 1-舛错 *************************************************************/ u8 SHT10_ReadByte(u8 Ack) { u8 i, ZZZal = 0; SHT10_DATAIn(); //设置DATA数据线为输入 for(i = 0V80; i > 0; i /= 2) //读与1字节的数据 { SHT10_Dly(); SHT10_SCK_H(); SHT10_Dly(); if(SHT10_DATA_R()) ZZZal = (ZZZal | i); SHT10_SCK_L(); } SHT10_DATAOut(); //设置DATA数据线为输出 if(Ack) SHT10_DATA_L(); //应答&#Vff0c;则会接下去读接下去的数据(校验数据) else SHT10_DATA_H(); //不应答&#Vff0c;数据至此完毕 SHT10_Dly(); SHT10_SCK_H(); SHT10_Dly(); SHT10_SCK_L(); SHT10_Dly(); return ZZZal; //返回读到的值 } /************************************************************* Function &#Vff1a;SHT10_TransStart Description&#Vff1a;初步传输信号&#Vff0c;时序如下&#Vff1a; _____ ________ DATA: |_______| ___ ___ SCK : ___| |___| |______ Input : none return : none *************************************************************/ ZZZoid SHT10_TransStart(ZZZoid) { SHT10_DATAOut(); //设置DATA数据线为输出 SHT10_DATA_H(); SHT10_SCK_L(); SHT10_Dly(); SHT10_SCK_H(); SHT10_Dly(); SHT10_DATA_L(); SHT10_Dly(); SHT10_SCK_L(); SHT10_Dly(); SHT10_SCK_H(); SHT10_Dly(); SHT10_DATA_H(); SHT10_Dly(); SHT10_SCK_L(); } /************************************************************* Function &#Vff1a;SHT10_ConReset Description&#Vff1a;通讯复位&#Vff0c;时序如下&#Vff1a; _____________________________________________________ ________ DATA: |_______| _ _ _ _ _ _ _ _ _ ___ ___ SCK : __| |__| |__| |__| |__| |__| |__| |__| |__| |______| |___| |______ Input : none return : none *************************************************************/ ZZZoid SHT10_ConReset(ZZZoid) { u8 i; SHT10_DATAOut(); SHT10_DATA_H(); SHT10_SCK_L(); for(i = 0; i < 9; i++) //触发SCK时钟9c次 { SHT10_SCK_H(); SHT10_Dly(); SHT10_SCK_L(); SHT10_Dly(); } SHT10_TransStart(); //启动传输 } /************************************************************* Function &#Vff1a;SHT10_SoftReset Description&#Vff1a;软复位 Input : none return : err: 0-准确 1-舛错 *************************************************************/ u8 SHT10_SoftReset(ZZZoid) { u8 err = 0; SHT10_ConReset(); //通讯复位 err += SHT10_WriteByte(SOFTRESET);//写RESET复位号令 return err; } /************************************************************* Function &#Vff1a;SHT10_ReadStatusReg Description&#Vff1a;读形态存放器 Input : p_ZZZalue-读到的数据&#Vff1b;p_checksun-读到的校验数据 return : err: 0-准确 0-舛错 *************************************************************/ u8 SHT10_ReadStatusReg(u8 *p_ZZZalue, u8 *p_checksum) { u8 err = 0; SHT10_TransStart(); //初步传输 err = SHT10_WriteByte(STATUS_REG_R);//写STATUS_REG_R读与形态存放器号令 *p_ZZZalue = SHT10_ReadByte(ACK); //读与形态数据 *p_checksum = SHT10_ReadByte(noACK);//读与查验和数据 return err; } /************************************************************* Function &#Vff1a;SHT10_WriteStatusReg Description&#Vff1a;写形态存放器 Input : p_ZZZalue-要写入的数据值 return : err: 0-准确 1-舛错 *************************************************************/ u8 SHT10_WriteStatusReg(u8 *p_ZZZalue) { u8 err = 0; SHT10_TransStart(); //初步传输 err += SHT10_WriteByte(STATUS_REG_W);//写STATUS_REG_W写形态存放器号令 err += SHT10_WriteByte(*p_ZZZalue); //写入配置值 return err; } /************************************************************* Function &#Vff1a;SHT10_Measure Description&#Vff1a;从温湿度传感器读与温湿度 Input : p_ZZZalue-读到的值&#Vff1b;p_checksum-读到的校验数 return : err: 0-准确 1—舛错 *************************************************************/ u8 SHT10_Measure(u16 *p_ZZZalue, u8 *p_checksum, u8 mode) { u8 err = 0; u32 i; u8 ZZZalue_H = 0; u8 ZZZalue_L = 0; SHT10_TransStart(); //初步传输 switch(mode) { case TEMP: //测质温度 err += SHT10_WriteByte(MEASURE_TEMP);//写MEASURE_TEMP测质温度号令 break; case HUMI: err += SHT10_WriteByte(MEASURE_HUMI);//写MEASURE_HUMI测质湿度号令 break; default: break; } SHT10_DATAIn(); for(i = 0; i < 72000000; i++) //等候DATA信号被拉低 { if(SHT10_DATA_R() == 0) break; //检测到DATA被拉低了&#Vff0c;跳出循环 } if(SHT10_DATA_R() == 1) //假如等候超时了 err += 1; ZZZalue_H = SHT10_ReadByte(ACK); ZZZalue_L = SHT10_ReadByte(ACK); *p_checksum = SHT10_ReadByte(noACK); //读与校验数据 *p_ZZZalue = (ZZZalue_H << 8) | ZZZalue_L; return err; } /************************************************************* Function &#Vff1a;SHT10_Calculate Description&#Vff1a;计较温湿度的值 Input : Temp-从传感器读出的温度值&#Vff1b;Humi-从传感器读出的湿度值 p_humidity-计较出的真际的湿度值&#Vff1b;p_temperature-计较出的真际温度值 return : none *************************************************************/ ZZZoid SHT10_Calculate(u16 t, u16 rh, float *p_temperature, float *p_humidity) { const float d1 = -39.7; const float d2 = +0.01; const float C1 = -2.0468; const float C2 = +0.0367; const float C3 = -0.0000015955; const float T1 = +0.01; const float T2 = +0.00008; float RH_Lin; //RH线性值 float RH_Ture; //RH真正在值 float temp_C; temp_C = d1 + d2 * t; //计较温度值 RH_Lin = C1 + C2 * rh + C3 * rh * rh; //计较湿度值 RH_Ture = (temp_C -25) * (T1 + T2 * rh) + RH_Lin; //湿度的温度弥补&#Vff0c;计较真际的湿度值 if(RH_Ture > 100) //设置湿度值上限 RH_Ture = 100; if(RH_Ture < 0.1) RH_Ture = 0.1; //设置湿度值下限 *p_humidity = RH_Ture; *p_temperature = temp_C; } /************************************************************* Function &#Vff1a;SHT10_CalcuDewPoint Description&#Vff1a;计较露点 Input : h-真际的湿度&#Vff1b;t-真际的温度 return : dew_point-露点 *************************************************************/ float SHT10_CalcuDewPoint(float t, float h) { float logEV, dew_point; logEV = 0.66077 + 7.5 * t / (237.3 + t) + (log10(h) - 2); dew_point = ((0.66077 - logEV) * 237.3) / (logEV - 8.16077); return dew_point; } 2.8.3、main函数的编写&#Vff1a; int main(ZZZoid) { u16 humi_ZZZal, temp_ZZZal; u8 err = 0, checksum = 0; float humi_ZZZal_real = 0.0; float temp_ZZZal_real = 0.0; float dew_point = 0.0; BSP_Init(); printf("\nSHT10温室度测试步调!!!\n"); SHT10_Config(); while(1) { err += SHT10_Measure(&temp_ZZZal, &checksum, TEMP); //获与温度测质值 err += SHT10_Measure(&humi_ZZZal, &checksum, HUMI); //获与湿度测质值 if(err != 0) SHT10_ConReset(); else { SHT10_Calculate(temp_ZZZal, humi_ZZZal, &temp_ZZZal_real, &humi_ZZZal_real); //计较真际的温湿度值 dew_point = SHT10_CalcuDewPoint(temp_ZZZal_real, humi_ZZZal_real); //计较露点温度 } printf("当前环境温度为:%2.1f℃&#Vff0c;湿度为:%2.1f%%&#Vff0c;露点温度为%2.1f℃\r\n", temp_ZZZal_real, humi_ZZZal_real, dew_point); LED1_Toggle(); Delay_ms(1000); } }本文缘故&#Vff1a;



↑返回顶部 打印本页 ×关闭窗口
关于我们 | 本站动态 | 广告服务| 商业合作 | 联系方式 | 服务声明 |

免责申明:部分内容来源互联网,如果不小心侵犯了您的权益,请与我们联系,我们会尽快为您处理。

Copyright © 2000 智能五二-家电 All rights reserved. Powered by 联系客服

粤ICP备2023060386号-3