STM32 SHT10温湿度传感器的信号采集

STM32 SHT10温湿度传感器的信号采集

       首先讲讲SHT10这款温室度传感器。SHT1x(包括SHT10,SHT11和SHT15)属于Sersirion温湿度传感器家族中的贴片封装系列。更之前我讲过的DHT11这款温湿度传感器相比,体积小了许多,特别适合用于产品中。SHT10温湿度传感器包括一个电容性聚合体测湿敏感元件、一个用能隙材料制成的测温元件(文绉绉的),传感器内部有一个精度高达14为位的A/D转换器,适应串行接口电路实现无缝连接。该产品具有品质卓越、响应速度速度快,抗干扰能力强、性价比高等优点。

      1、接口定义:
  SHT10的接口定义如下图所示:

                                                             

           如上图所示,1脚为GND,4脚为VDD。它的供电电压范围为2.4~5.5V,建议的电压为3.3V,在电源引脚(VDD、GND)之间必须加上一个0.1uf的电容,应于去耦滤波用。它的2脚DATA为数据引脚,3脚SCK为时钟控制引脚,没有发现这两个引脚很像IIC所使用的引脚功能?没错,这个传感器确实可以认为是IIC接口,但是又有却别。该传感器不能按照IIC的协议编址,但是,如果IIC总线上没有挂接别的元件,传感器可以直接连到IIC总线上,但是单片机必须按照传感器的协议工作。传感器与单片机的接线如下图所示:

                                    

    2、传感器的通讯
      

     2.1、“启动传输”时序
用一组“启动传输”时序来完成数据传输的初始化。它包括:当SCK时钟高电平时DATA翻转为低电平,紧接着SCK变成低电平,随后是在SCK时钟高电平,随后是在SCK时钟高电平DATA翻转位高电平。时序如下:

                       

     2.2、复位时序
如果与SHT1x 通讯中断,可通过下列信号时序复位:当DATA 保持高电平时,触发SCK 时钟9 次或更多。时序图如下:
                    
    2.3、命令集
传感器的命令包含三个地址位(目前只支持000,这就是他只能挂接在空闲的IIC总线上的原因)和五个命令位。。SHT1x 会以下述方式表示已正确地接收到指令:在第8 个SCK 时钟的下降沿之后,将DATA 下拉为低电平(ACK 位)。在第9 个SCK 时钟的下降沿之后,释放DATA(恢复高电平)。命令集如下:
                            
 
     2.4、温湿度测量
发布一组测量命令(‘00000101’表示相对湿度RH,‘00000011’表示温度T)后,控制器要等待测量结束。这个过程需要大约20/80/320ms,分别对应8/12/14bit 测量。确切的时间随内部晶振速度,最多可能有-30%的变化。。SHT1x 通过下拉DATA 至低电平并进入空闲模式,表示测量的结束。控制器在再次触发SCK 时钟前,必须等待这个“数据备妥”信号来读出数据。检测数据可以先被存储,这样控制器可以继续执行其它任务在需要时再读出数据。
在收到CRC 的确认位之后,表明通讯结束。如果不使用CRC-8 校验,控制器可以在测量值LSB 后,通过保持ACK高电平终止通讯。在测量和通讯完成后,SHT1x 自动转入休眠模式。

    2.5、状态寄存器
SHT1x 的某些高级功能可以通过给状态寄存器发送指令来实现,如选择测量分辨率,电量不足提醒,使用 OTP 加载或启动加热功能等。状态寄存器度、写如下:

 
状态寄存器写
 状态寄存器读
状态寄存器的具体描述如下表所示:


测量分辨率:默认分辨率 14bit (温度) 和 12bit (湿度) 可以被降低为 12 和 8bit. 尤其适用于要求测量速度极高或者功耗极低的应用。
电量不足检测功能:在电压不足 2.47V 发出警告。精度为±0.05 V。
加热:可通过向状态寄存器内写入命令启动传感器内部加热器.。加热器可以使传感器的温度高于周围环境 5 – 10°C12 。功耗大约为 8mA @ 5V 。
OPT加载:开启此功能,标定数据将在每次测量前被上传到寄存器。如果不开启此功能,可减少大约 10ms的测量时间。
上面的寄存器如果没有什么特殊要求或应用于特定的场合,则无需配置,选择默认就可以了。

     2.6、通讯过程
传感器的通讯过程为:发送”启动传输“时序,初始化传感器——>发送命令——>等待传感器应答,及测量结束——>接收传感器的16位数据值——>接收8为的CRC校验数据——>休眠,等待下一次传输开始。
传输的过程的测量时序可以由下图示意:
  上图中 TS = 传输开始, MSB = 高有效字节,LSB =低有效字节, LSb = 低有效位。
下面举个实际测量时的相对湿度测量时序例子。时序如下:
这张图可以知道:我们接收到的数据数值为”0000 0100 0011 0001“ = 1073 = 35.50% RH (位含温度补偿),至于怎么计算的,请接着往下看。

     2.7、信号转化  

       2.7.1 温度的转化
设T 2 1 SOt为从传感器上读出来的测量数值,我们需要用下面的公式将测量数值转换成整整的温度值。
T = d1 + d2 * SOt  (其中d1,d2的值根据实际情况选择,选项如下)


      2.7.2 湿度的转换 
湿度的转换公式如下: 。其中湿度的转化参数如下选择:根据采样的精度不同而不同。
 
  99%以上的湿度已经接近饱和必须经过处理显示100%RH13.请注意 湿度传感器对电压无依赖性。测量值与相对湿度的转化如下图所示:
  相对湿度根据上面的参数与公式算出来之后,还需要考虑当前环境温度而进行适当的补偿。补偿的公式及其参数选择如下:
 
       2.7.3、露点的计算
露点的定义:露点温度指空气在此温度下能保持最多的水汽,当温度冷却到露点,空气变得饱和,就会出现雾、露或霜。
SHT1x 并不直接进行露点测量,,但露点可以通过温度和湿度读数计算得到.。由于温度和湿度在同一块集成电路上测量,SHT1x 可测量露点。 一块集成电路上测量,SHT1x 可测量露点。 下面直接给出结论性的露点计算公式了。
 LogEW=(0.66077+7.5*T/(237.3+T)+(log10(RH)-2)         
露点:Dp=((0.66077-logEW)*237.3/(logEW-8.16077)         
例如: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文件的编写

这个文件主要定义些重要的参数,以及更硬件相关的一些定义。


 
 
  1. /*************************************************************
  2. \(^o^)/
  3. Copyright (C), 2013-2020, ZheJiang University of Technology
  4. File name : SHT10.h
  5. Author : ziye334
  6. Version : V1.0
  7. Data : 2014/3/10
  8. Description: Digital temperature and humidity sensor driver code
  9. *************************************************************/
  10. #ifndef __SHT10_H__
  11. #define __SHT10_H__
  12. #include "stm32f10x.h"
  13. enum {TEMP, HUMI};
  14. /* GPIO相关宏定义 */
  15. #define SHT10_AHB2_CLK RCC_APB2Periph_GPIOD
  16. #define SHT10_DATA_PIN GPIO_Pin_0
  17. #define SHT10_SCK_PIN GPIO_Pin_1
  18. #define SHT10_DATA_PORT GPIOD
  19. #define SHT10_SCK_PORT GPIOD
  20. #define SHT10_DATA_H() GPIO_SetBits(SHT10_DATA_PORT, SHT10_DATA_PIN) //拉高DATA数据线
  21. #define SHT10_DATA_L() GPIO_ResetBits(SHT10_DATA_PORT, SHT10_DATA_PIN) //拉低DATA数据线
  22. #define SHT10_DATA_R() GPIO_ReadInputDataBit(SHT10_DATA_PORT, SHT10_DATA_PIN) //读DATA数据线
  23. #define SHT10_SCK_H() GPIO_SetBits(SHT10_SCK_PORT, SHT10_SCK_PIN) //拉高SCK时钟线
  24. #define SHT10_SCK_L() GPIO_ResetBits(SHT10_SCK_PORT, SHT10_SCK_PIN) //拉低SCK时钟线
  25. /* 传感器相关宏定义 */
  26. #define noACK 0
  27. #define ACK 1
  28. //addr command r/w
  29. #define STATUS_REG_W 0x06 //000 0011 0 写状态寄存器
  30. #define STATUS_REG_R 0x07 //000 0011 1 读状态寄存器
  31. #define MEASURE_TEMP 0x03 //000 0001 1 测量温度
  32. #define MEASURE_HUMI 0x05 //000 0010 1 测量湿度
  33. #define SOFTRESET 0x1E //000 1111 0 复位
  34. void SHT10_Config( void);
  35. void SHT10_ConReset( void);
  36. u8 SHT10_SoftReset( void);
  37. u8 SHT10_Measure(u16 *p_value, u8 *p_checksum, u8 mode);
  38. void SHT10_Calculate(u16 t, u16 rh, float *p_temperature, float *p_humidity);
  39. float SHT10_CalcuDewPoint( float t, float h);
  40. #endif

2.8.2、SHT10.c驱动程序的编写
不废话了,直接贴代码:


 
 
  1. /*************************************************************
  2. \(^o^)/
  3. Copyright (C), 2013-2020, ZheJiang University of Technology
  4. File name : SHT10.c
  5. Author : ziye334
  6. Version : V1.0
  7. Data : 2014/3/10
  8. Description: Digital temperature and humidity sensor driver code
  9. *************************************************************/
  10. #include "SHT10.h"
  11. #include <math.h>
  12. /*************************************************************
  13. Function :SHT10_Dly
  14. Description:SHT10时序需要的延时
  15. Input : none
  16. return : none
  17. *************************************************************/
  18. void SHT10_Dly( void)
  19. {
  20. u16 i;
  21. for(i = 500; i > 0; i--);
  22. }
  23. /*************************************************************
  24. Function :SHT10_Config
  25. Description:初始化 SHT10引脚
  26. Input : none
  27. return : none
  28. *************************************************************/
  29. void SHT10_Config( void)
  30. {
  31. GPIO_InitTypeDef GPIO_InitStructure;
  32. //初始化SHT10引脚时钟
  33. RCC_APB2PeriphClockCmd(SHT10_AHB2_CLK ,ENABLE);
  34. //PD0 DATA 推挽输出
  35. GPIO_InitStructure.GPIO_Pin = SHT10_DATA_PIN;
  36. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  37. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  38. GPIO_Init(SHT10_DATA_PORT, &GPIO_InitStructure);
  39. //PD1 SCK 推挽输出
  40. GPIO_InitStructure.GPIO_Pin = SHT10_SCK_PIN;
  41. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  42. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  43. GPIO_Init(SHT10_SCK_PORT, &GPIO_InitStructure);
  44. SHT10_ConReset(); //复位通讯
  45. }
  46. /*************************************************************
  47. Function :SHT10_DATAOut
  48. Description:设置DATA引脚为输出
  49. Input : none
  50. return : none
  51. *************************************************************/
  52. void SHT10_DATAOut( void)
  53. {
  54. GPIO_InitTypeDef GPIO_InitStructure;
  55. //PD0 DATA 推挽输出
  56. GPIO_InitStructure.GPIO_Pin = SHT10_DATA_PIN;
  57. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  58. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  59. GPIO_Init(SHT10_DATA_PORT, &GPIO_InitStructure);
  60. }
  61. /*************************************************************
  62. Function :SHT10_DATAIn
  63. Description:设置DATA引脚为输入
  64. Input : none
  65. return : none
  66. *************************************************************/
  67. void SHT10_DATAIn( void)
  68. {
  69. GPIO_InitTypeDef GPIO_InitStructure;
  70. //PD0 DATA 浮动输入
  71. GPIO_InitStructure.GPIO_Pin = SHT10_DATA_PIN;
  72. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  73. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  74. GPIO_Init(SHT10_DATA_PORT, &GPIO_InitStructure);
  75. }
  76. /*************************************************************
  77. Function :SHT10_WriteByte
  78. Description:写1字节
  79. Input : value:要写入的字节
  80. return : err: 0-正确 1-错误
  81. *************************************************************/
  82. u8 SHT10_WriteByte(u8 value)
  83. {
  84. u8 i, err = 0;
  85. SHT10_DATAOut(); //设置DATA数据线为输出
  86. for(i = 0x80; i > 0; i /= 2) //写1个字节
  87. {
  88. if(i & value)
  89. SHT10_DATA_H();
  90. else
  91. SHT10_DATA_L();
  92. SHT10_Dly();
  93. SHT10_SCK_H();
  94. SHT10_Dly();
  95. SHT10_SCK_L();
  96. SHT10_Dly();
  97. }
  98. SHT10_DATAIn(); //设置DATA数据线为输入,释放DATA线
  99. SHT10_SCK_H();
  100. err = SHT10_DATA_R(); //读取SHT10的应答位
  101. SHT10_SCK_L();
  102. return err;
  103. }
  104. /*************************************************************
  105. Function :SHT10_ReadByte
  106. Description:读1字节数据
  107. Input : Ack: 0-不应答 1-应答
  108. return : err: 0-正确 1-错误
  109. *************************************************************/
  110. u8 SHT10_ReadByte(u8 Ack)
  111. {
  112. u8 i, val = 0;
  113. SHT10_DATAIn(); //设置DATA数据线为输入
  114. for(i = 0x80; i > 0; i /= 2) //读取1字节的数据
  115. {
  116. SHT10_Dly();
  117. SHT10_SCK_H();
  118. SHT10_Dly();
  119. if(SHT10_DATA_R())
  120. val = (val | i);
  121. SHT10_SCK_L();
  122. }
  123. SHT10_DATAOut(); //设置DATA数据线为输出
  124. if(Ack)
  125. SHT10_DATA_L(); //应答,则会接下去读接下去的数据(校验数据)
  126. else
  127. SHT10_DATA_H(); //不应答,数据至此结束
  128. SHT10_Dly();
  129. SHT10_SCK_H();
  130. SHT10_Dly();
  131. SHT10_SCK_L();
  132. SHT10_Dly();
  133. return val; //返回读到的值
  134. }
  135. /*************************************************************
  136. Function :SHT10_TransStart
  137. Description:开始传输信号,时序如下:
  138. _____ ________
  139. DATA: |_______|
  140. ___ ___
  141. SCK : ___| |___| |______
  142. Input : none
  143. return : none
  144. *************************************************************/
  145. void SHT10_TransStart( void)
  146. {
  147. SHT10_DATAOut(); //设置DATA数据线为输出
  148. SHT10_DATA_H();
  149. SHT10_SCK_L();
  150. SHT10_Dly();
  151. SHT10_SCK_H();
  152. SHT10_Dly();
  153. SHT10_DATA_L();
  154. SHT10_Dly();
  155. SHT10_SCK_L();
  156. SHT10_Dly();
  157. SHT10_SCK_H();
  158. SHT10_Dly();
  159. SHT10_DATA_H();
  160. SHT10_Dly();
  161. SHT10_SCK_L();
  162. }
  163. /*************************************************************
  164. Function :SHT10_ConReset
  165. Description:通讯复位,时序如下:
  166. _____________________________________________________ ________
  167. DATA: |_______|
  168. _ _ _ _ _ _ _ _ _ ___ ___
  169. SCK : __| |__| |__| |__| |__| |__| |__| |__| |__| |______| |___| |______
  170. Input : none
  171. return : none
  172. *************************************************************/
  173. void SHT10_ConReset( void)
  174. {
  175. u8 i;
  176. SHT10_DATAOut();
  177. SHT10_DATA_H();
  178. SHT10_SCK_L();
  179. for(i = 0; i < 9; i++) //触发SCK时钟9c次
  180. {
  181. SHT10_SCK_H();
  182. SHT10_Dly();
  183. SHT10_SCK_L();
  184. SHT10_Dly();
  185. }
  186. SHT10_TransStart(); //启动传输
  187. }
  188. /*************************************************************
  189. Function :SHT10_SoftReset
  190. Description:软复位
  191. Input : none
  192. return : err: 0-正确 1-错误
  193. *************************************************************/
  194. u8 SHT10_SoftReset( void)
  195. {
  196. u8 err = 0;
  197. SHT10_ConReset(); //通讯复位
  198. err += SHT10_WriteByte(SOFTRESET); //写RESET复位命令
  199. return err;
  200. }
  201. /*************************************************************
  202. Function :SHT10_ReadStatusReg
  203. Description:读状态寄存器
  204. Input : p_value-读到的数据;p_checksun-读到的校验数据
  205. return : err: 0-正确 0-错误
  206. *************************************************************/
  207. u8 SHT10_ReadStatusReg(u8 *p_value, u8 *p_checksum)
  208. {
  209. u8 err = 0;
  210. SHT10_TransStart(); //开始传输
  211. err = SHT10_WriteByte(STATUS_REG_R); //写STATUS_REG_R读取状态寄存器命令
  212. *p_value = SHT10_ReadByte(ACK); //读取状态数据
  213. *p_checksum = SHT10_ReadByte(noACK); //读取检验和数据
  214. return err;
  215. }
  216. /*************************************************************
  217. Function :SHT10_WriteStatusReg
  218. Description:写状态寄存器
  219. Input : p_value-要写入的数据值
  220. return : err: 0-正确 1-错误
  221. *************************************************************/
  222. u8 SHT10_WriteStatusReg(u8 *p_value)
  223. {
  224. u8 err = 0;
  225. SHT10_TransStart(); //开始传输
  226. err += SHT10_WriteByte(STATUS_REG_W); //写STATUS_REG_W写状态寄存器命令
  227. err += SHT10_WriteByte(*p_value); //写入配置值
  228. return err;
  229. }
  230. /*************************************************************
  231. Function :SHT10_Measure
  232. Description:从温湿度传感器读取温湿度
  233. Input : p_value-读到的值;p_checksum-读到的校验数
  234. return : err: 0-正确 1—错误
  235. *************************************************************/
  236. u8 SHT10_Measure(u16 *p_value, u8 *p_checksum, u8 mode)
  237. {
  238. u8 err = 0;
  239. u32 i;
  240. u8 value_H = 0;
  241. u8 value_L = 0;
  242. SHT10_TransStart(); //开始传输
  243. switch(mode)
  244. {
  245. case TEMP: //测量温度
  246. err += SHT10_WriteByte(MEASURE_TEMP); //写MEASURE_TEMP测量温度命令
  247. break;
  248. case HUMI:
  249. err += SHT10_WriteByte(MEASURE_HUMI); //写MEASURE_HUMI测量湿度命令
  250. break;
  251. default:
  252. break;
  253. }
  254. SHT10_DATAIn();
  255. for(i = 0; i < 72000000; i++) //等待DATA信号被拉低
  256. {
  257. if(SHT10_DATA_R() == 0) break; //检测到DATA被拉低了,跳出循环
  258. }
  259. if(SHT10_DATA_R() == 1) //如果等待超时了
  260. err += 1;
  261. value_H = SHT10_ReadByte(ACK);
  262. value_L = SHT10_ReadByte(ACK);
  263. *p_checksum = SHT10_ReadByte(noACK); //读取校验数据
  264. *p_value = (value_H << 8) | value_L;
  265. return err;
  266. }
  267. /*************************************************************
  268. Function :SHT10_Calculate
  269. Description:计算温湿度的值
  270. Input : Temp-从传感器读出的温度值;Humi-从传感器读出的湿度值
  271. p_humidity-计算出的实际的湿度值;p_temperature-计算出的实际温度值
  272. return : none
  273. *************************************************************/
  274. void SHT10_Calculate(u16 t, u16 rh, float *p_temperature, float *p_humidity)
  275. {
  276. const float d1 = -39.7;
  277. const float d2 = + 0.01;
  278. const float C1 = -2.0468;
  279. const float C2 = + 0.0367;
  280. const float C3 = -0.0000015955;
  281. const float T1 = + 0.01;
  282. const float T2 = + 0.00008;
  283. float RH_Lin; //RH线性值
  284. float RH_Ture; //RH真实值
  285. float temp_C;
  286. temp_C = d1 + d2 * t; //计算温度值
  287. RH_Lin = C1 + C2 * rh + C3 * rh * rh; //计算湿度值
  288. RH_Ture = (temp_C -25) * (T1 + T2 * rh) + RH_Lin; //湿度的温度补偿,计算实际的湿度值
  289. if(RH_Ture > 100) //设置湿度值上限
  290. RH_Ture = 100;
  291. if(RH_Ture < 0.1)
  292. RH_Ture = 0.1; //设置湿度值下限
  293. *p_humidity = RH_Ture;
  294. *p_temperature = temp_C;
  295. }
  296. /*************************************************************
  297. Function :SHT10_CalcuDewPoint
  298. Description:计算露点
  299. Input : h-实际的湿度;t-实际的温度
  300. return : dew_point-露点
  301. *************************************************************/
  302. float SHT10_CalcuDewPoint( float t, float h)
  303. {
  304. float logEx, dew_point;
  305. logEx = 0.66077 + 7.5 * t / ( 237.3 + t) + (log10(h) - 2);
  306. dew_point = (( 0.66077 - logEx) * 237.3) / (logEx - 8.16077);
  307. return dew_point;
  308. }
  309. 2.8 .3、main函数的编写:
  310. int main( void)
  311. {
  312. u16 humi_val, temp_val;
  313. u8 err = 0, checksum = 0;
  314. float humi_val_real = 0.0;
  315. float temp_val_real = 0.0;
  316. float dew_point = 0.0;
  317. BSP_Init();
  318. printf( "\nSHT10温室度测试程序!!!\n");
  319. SHT10_Config();
  320. while( 1)
  321. {
  322. err += SHT10_Measure(&temp_val, &checksum, TEMP); //获取温度测量值
  323. err += SHT10_Measure(&humi_val, &checksum, HUMI); //获取湿度测量值
  324. if(err != 0)
  325. SHT10_ConReset();
  326. else
  327. {
  328. SHT10_Calculate(temp_val, humi_val, &temp_val_real, &humi_val_real); //计算实际的温湿度值
  329. dew_point = SHT10_CalcuDewPoint(temp_val_real, humi_val_real); //计算露点温度
  330. }
  331. printf( "当前环境温度为:%2.1f℃,湿度为:%2.1f%%,露点温度为%2.1f℃\r\n", temp_val_real, humi_val_real, dew_point);
  332. LED1_Toggle();
  333. Delay_ms( 1000);
  334. }
  335. }
原文出处: http://ziye334.blog.163.com/blog/static/224306191201421265639956/

<div class="comment-edit-box d-flex">
	<a id="commentsedit"></a>
	<div class="user-img">
		<a href="//me.csdn.net/Naunyang" target="_blank">
			<img class="" src="https://avatar.csdn.net/C/1/C/3_naunyang.jpg">
		</a>
	</div>
	<form id="commentform">
		<input type="hidden" id="comment_replyId">
		<textarea class="comment-content" name="comment_content" id="comment_content" placeholder="想对作者说点什么"></textarea>
		<div class="opt-box"> <!-- d-flex -->
			<div id="ubbtools" class="add_code">
				<a href="#insertcode" code="code" target="_self"><i class="icon iconfont icon-daima"></i></a>
			</div>
			<input type="hidden" id="comment_replyId" name="comment_replyId">
			<input type="hidden" id="article_id" name="article_id" value="41695981">
			<input type="hidden" id="comment_userId" name="comment_userId" value="">
			<input type="hidden" id="commentId" name="commentId" value="">
			<div style="display: none;" class="csdn-tracking-statistics tracking-click" data-mod="popu_384"><a href="#" target="_blank" class="comment_area_btn">发表评论</a></div>
			<div class="dropdown" id="myDrap">
				<a class="dropdown-face d-flex align-items-center" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">
				<div class="txt-selected text-truncate">添加代码片</div>
				<svg class="icon d-block" aria-hidden="true">
					<use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#csdnc-triangledown"></use>
				</svg>
				</a>
				<ul class="dropdown-menu" id="commentCode" aria-labelledby="drop4">
					<li><a data-code="html">HTML/XML</a></li>
					<li><a data-code="objc">objective-c</a></li>
					<li><a data-code="ruby">Ruby</a></li>
					<li><a data-code="php">PHP</a></li>
					<li><a data-code="csharp">C</a></li>
					<li><a data-code="cpp">C++</a></li>
					<li><a data-code="javascript">JavaScript</a></li>
					<li><a data-code="python">Python</a></li>
					<li><a data-code="java">Java</a></li>
					<li><a data-code="css">CSS</a></li>
					<li><a data-code="sql">SQL</a></li>
					<li><a data-code="plain">其它</a></li>
				</ul>
			</div>  
			<div class="right-box">
				<span id="tip_comment" class="tip">还能输入<em>1000</em>个字符</span>
				<input type="submit" class="btn btn-sm btn-red btn-comment" value="发表评论">
			</div>
		</div>
	</form>
</div>

	<div class="comment-list-container">
	<a id="comments"></a>
	<div class="comment-list-box" style="max-height: 173px;"><ul class="comment-list"><li class="comment-line-box d-flex" data-commentid="9957545" data-replyname="weixin_45185690">        <a target="_blank" href="https://me.csdn.net/weixin_45185690"><img src="https://avatar.csdn.net/3/B/4/3_weixin_45185690.jpg" alt="weixin_45185690" class="avatar"></a>          <div class="right-box ">            <div class="info-box">              <a target="_blank" href="https://me.csdn.net/weixin_45185690"><span class="name ">weixin_45185690:</span></a>              <span class="comment">请问楼主,为什么我一直读出来的数据都是00,还有这是将数据打印在串口助手中吗?</span><span class="date" title="2019-06-11 09:22:37">(1周前</span><span class="floor-num">#9楼)</span><span class="opt-box"><a class="btn btn-link-blue btn-report" data-type="report">举报</a><a class="btn btn-link-blue btn-reply" data-type="reply">回复</a></span></div><div class="comment-like " data-commentid="9957545"><svg class="icon "><use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#csdnc-thumbsup"></use></svg><span>1</span></div></div></li></ul><ul class="comment-list"><li class="comment-line-box d-flex" data-commentid="8219179" data-replyname="weixin_42558384">        <a target="_blank" href="https://me.csdn.net/weixin_42558384"><img src="https://avatar.csdn.net/E/E/7/3_weixin_42558384.jpg" alt="weixin_42558384" class="avatar"></a>          <div class="right-box ">            <div class="info-box">              <a target="_blank" href="https://me.csdn.net/weixin_42558384"><span class="name ">linux入土:</span></a>              <span class="comment">请问楼主为什么我读出的温度是615.6湿度是0.1%?希望楼主能帮我看下,万分感谢

[/code](11个月前#8楼)查看回复(2)举报回复

  • 3
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值