[STM32F1] SHT10温度和湿度

[复制链接]
1634|9
 楼主| Jessicakjdsl 发表于 2016-11-23 19:22 | 显示全部楼层 |阅读模式
/* Includes ------------------------------------------------------------------*/
#include "stm32f10x.h"
#include "usart1.h"
#include "stdio.h"
/* Private typedef -----------------------------------------------------------*/

/* Private define ------------------------------------------------------------*/
#define SDA_H()         GPIO_SetBits(GPIOB,GPIO_Pin_0)
#define SDA_L()         GPIO_ResetBits(GPIOB,GPIO_Pin_0)
#define SCK_H()         GPIO_SetBits(GPIOB,GPIO_Pin_1)
#define SCK_L()         GPIO_ResetBits(GPIOB,GPIO_Pin_1)
//读SDA数据
#define SDA_R()         GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0)

/* Private macro -------------------------------------------------------------*/
#define noACK 0         //无应答
#define ACK   1         //应答

#define STATUS_REG_W    0x06   //000   0011    0
#define STATUS_REG_R    0x07   //000   0011    1
#define MEASURE_TEMP    0x03   //000   0001    1
#define MEASURE_HUMI    0x05   //000   0010    1
#define RESET           0x1e   //000   1111    0

/* Private variables ---------------------------------------------------------*/
enum {TEMP,HUMI};
uint8_t Test_Timetick = 0;
uint16_t Test_Counter = 0;
/* Private function prototypes -----------------------------------------------*/
void RCC_Config(void);
void USART1_Config(void);
void SHT10_Config(void);
void SHT10_SDAIn(void);
void SHT10_SDAOut(void);
void SHT10_Delay(void);
uint8_t SHT10_WriteByte(uint8_t value);
uint8_t SHT10_ReadByte(uint8_t Ack);
void SHT10_Start(void);
void SHT10_ConReset(void);
uint8_t SHT10_Measure(uint16_t* pValue, uint8_t* pCheckSum, uint8_t mode);
void SHT10_Cal(uint16_t Temp,uint16_t Hum, float* pTempValue,float* pHumValue);

/* Private functions ---------------------------------------------------------*/

/**
  * @brief  主程序
  * @param  无
  * @retval 无
  */
int main(void)
{
    //温度结果  16bit
    uint16_t TempValue;
    //湿度结果 16bit
    uint16_t HumValue;
    //温度转换结果
    float TempResult;
    //湿度转换结果
    float HumResult;
    //校验值
    uint8_t CheckValue = 0x00;
   
    //错误
    uint8_t error = 0x00;
   
    //初始化RCC
    RCC_Config();
    USART1_Config();
    SHT10_Config();
   
    printf("Start\n");
    while(1)
    {
        if(Test_Timetick)
        {
            Test_Timetick = 0;
            Test_Counter ++;
            
            //延时2000ms
            if(Test_Counter > 2000)
            {
                Test_Counter = 0;
               
                printf("启动转换!\n");
                //SHT10 连接
                SHT10_ConReset();
                //获得温度和湿度数据,16位格式
                error += SHT10_Measure(&TempValue,&CheckValue,TEMP);
                error += SHT10_Measure(&HumValue,&CheckValue,HUMI);
                //温度湿度计算,浮点数形式
                SHT10_Cal(TempValue ,HumValue,&TempResult,&HumResult);
                //通过串口输出,温度和湿度数据
                printf("温度 %2.1fC 湿度 %2.1f%%\n",TempResult,HumResult);

            }
        }
    }
}
 楼主| Jessicakjdsl 发表于 2016-11-23 19:22 | 显示全部楼层
  1. /**
  2.   * @brief  初始化Systick定时器
  3.   * @param  None
  4.   * @retval None
  5.   */
  6. void RCC_Config(void)
  7. {      
  8.     //Systick时钟每1ms触发一次
  9.     if (SysTick_Config(SystemCoreClock / 1000))
  10.     {
  11.         //
  12.         while (1);
  13.     }
  14. }

  15. /**
  16.   * @brief  初始化SHT10 IO口
  17.   * @param  None
  18.   * @retval None
  19.   */
  20. void SHT10_Config(void)
  21. {
  22.     GPIO_InitTypeDef GPIO_InitStructure;
  23.    
  24.     //使能GPIOA时钟
  25.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB ,ENABLE);
  26.   
  27.     //PB0 SDA 推挽输出
  28.           GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
  29.           GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  30.           GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  31.           GPIO_Init(GPIOB, &GPIO_InitStructure);
  32.           //PB1 SCK 推挽输出
  33.           GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
  34.           GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;   
  35.           GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  36.           GPIO_Init(GPIOB, &GPIO_InitStructure);
  37. }

  38. /**
  39.   * @brief  配置为输入状态
  40.   * @param  None
  41.   * @retval None
  42.   */
  43. void SHT10_SDAIn(void)
  44. {
  45.     GPIO_InitTypeDef GPIO_InitStructure;
  46.    
  47.     //PB0 SDA 浮动输入,外部有上拉电阻
  48.           GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
  49.           GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  50.           GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  51.           GPIO_Init(GPIOB, &GPIO_InitStructure);   
  52. }

  53. /**
  54.   * @brief  配置为输出状态
  55.   * @param  None
  56.   * @retval None
  57.   */
  58. void SHT10_SDAOut(void)
  59. {
  60.           GPIO_InitTypeDef GPIO_InitStructure;
  61.    
  62.     //PB0 SDA 推挽输出
  63.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
  64.           GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  65.           GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  66.           GPIO_Init(GPIOB, &GPIO_InitStructure);
  67. }

  68. /**
  69.   * @brief  配置为输出状态
  70.   * @param  写数据
  71.   * @retval 应答
  72.   */
  73. uint8_t SHT10_WriteByte(uint8_t value)
  74. {
  75.     uint8_t i,error=0;  
  76.     //SDA输出
  77.     SHT10_SDAOut();
  78.    
  79.     for( i = 0x80 ; i>0 ; i/=2)            
  80.     {
  81.         if ( i & value)
  82.             SDA_H();            
  83.         else
  84.             SDA_L();
  85.         
  86.         SHT10_Delay();                       
  87.         SCK_H();                          
  88.         SHT10_Delay();                     
  89.         SCK_L();
  90.         SHT10_Delay();                     
  91.     }
  92.    
  93.     //SDA输入
  94.     SHT10_SDAIn();
  95.    
  96.     SCK_H();                           
  97.     error = SDA_R();   //读应答位                 
  98.     SCK_L();
  99.    
  100.     return error;                 
  101. }

  102. /**
  103.   * @brief  读数据
  104.   * @param  应答
  105.   * @retval 返回数据
  106.   */
  107. uint8_t SHT10_ReadByte(uint8_t Ack)
  108. {
  109.     uint8_t i,val=0;
  110.     //输入状态
  111.     SHT10_SDAIn();  
  112.    
  113.     for (i=0x80;i>0;i/=2)         
  114.     {
  115.         SHT10_Delay();  
  116.         SCK_H();   
  117.         SHT10_Delay();  
  118.         if (SDA_R())
  119.             val=(val | i);        //读数据
  120.         SCK_L();                                          
  121.     }
  122.    
  123.     //输出状态
  124.     SHT10_SDAOut();  
  125.     if(Ack)
  126.         SDA_L();                //应答为低电平
  127.     else
  128.         SDA_H();

  129.     SHT10_Delay();  
  130.     SCK_H();                     
  131.     SHT10_Delay();  
  132.     SCK_L();
  133.     SHT10_Delay();                                             
  134.     return val;
  135. }
 楼主| Jessicakjdsl 发表于 2016-11-23 19:24 | 显示全部楼层
  1. /**
  2.   * @brief  启动
  3.   * @param  无
  4.   * @retval 无
  5.   */
  6. void SHT10_Start(void)
  7. {  
  8.    //SDA输出
  9.     SHT10_SDAOut();
  10.    
  11.     SCK_L();                  
  12.     SHT10_Delay();         
  13.     SCK_H();
  14.     SHT10_Delay();         
  15.     SDA_L();
  16.     SHT10_Delay();         
  17.     SCK_L();  
  18.     SHT10_Delay();         
  19.     SCK_H();
  20.     SHT10_Delay();         
  21.     SDA_H();                  
  22.     SHT10_Delay();         
  23.     SCK_L();                  
  24. }

  25. /**
  26.   * @brief  重新连接
  27.   * @param  无
  28.   * @retval 无
  29.   */
  30. void SHT10_ConReset(void)
  31. {
  32.     uint8_t i;
  33.     //输出
  34.     SHT10_SDAOut();
  35.    
  36.     SDA_H();    //输出高电平
  37.     SCK_L();
  38.    
  39.     for(i = 0 ; i < 9 ; i++)                  
  40.     {
  41.         SCK_H();
  42.         SHT10_Delay();
  43.         SCK_L();
  44.         SHT10_Delay();
  45.     }
  46.    
  47.     SHT10_Start();                  
  48. }

  49. /**
  50.   * @brief  软件重启
  51.   * @param  无
  52.   * @retval 无
  53.   */
  54. uint8_t SHT10_SoftReset(void)
  55. {
  56.     uint8_t error=0;  
  57.     SHT10_ConReset();              
  58.     error += SHT10_WriteByte(RESET);      
  59.     return error;                    
  60. }

  61. /**
  62.   * @brief  温度或湿度测量
  63.   * @param  温度或者湿度指针数据,校验值指针,模式
  64.   * @retval 错误
  65.   */
  66. uint8_t SHT10_Measure(uint16_t* pValue, uint8_t* pCheckSum, uint8_t mode)
  67. {
  68.     uint8_t error=0;
  69.    
  70.     uint8_t Value_H = 0;
  71.     uint8_t Value_L = 0;
  72.    
  73.     //启动
  74.     SHT10_Start();               
  75.     switch(mode)
  76.     {                     
  77.     case TEMP:
  78.         error += SHT10_WriteByte(MEASURE_TEMP);
  79.         break;
  80.     case HUMI:
  81.         error += SHT10_WriteByte(MEASURE_HUMI);
  82.         break;
  83.     default:
  84.         break;         
  85.     }
  86.    
  87.     //SDA读状态
  88.     SHT10_SDAIn();
  89.     //等待转换完成,代码有待优化
  90.     while(SDA_R())
  91.     {
  92.         ;
  93.     }

  94.     Value_H = SHT10_ReadByte(ACK);    //读高位
  95.     Value_L = SHT10_ReadByte(ACK);    //读低位
  96.    
  97.     *pCheckSum = SHT10_ReadByte(noACK);  //读校验结果
  98.    
  99.     //返回结果
  100.     *pValue = (Value_H << 8) | Value_L;   
  101.    
  102.     return error;
  103. }
 楼主| Jessicakjdsl 发表于 2016-11-23 19:24 | 显示全部楼层
  1. /**
  2.   * @brief  计算温度和湿度数据
  3.   * @param  温度数据 湿度数据 温度结果 湿度结果
  4.   * @retval 无
  5.   */
  6. void SHT10_Cal(uint16_t Temp,uint16_t Hum, float* pTempValue,float* pHumValue)
  7. {
  8.     const float d1 = -40.1;
  9.     const float d2 = 0.01;
  10.     float Temp_C;
  11.     //温度结果,换算                 
  12.     Temp_C = d1 + d2 * Temp;   
  13.    
  14.     const float C1 = -2.0468;           
  15.     const float C2 = +0.0367;           
  16.     const float C3 = -0.0000015955;     
  17.     const float T1 = +0.01;            
  18.     const float T2 = +0.00008;         
  19.    
  20.     //湿度线性值
  21.     float RH_Lin;
  22.     //湿度真实值
  23.     float RH_True;  
  24.    
  25.     //RH线性结果
  26.     RH_Lin = C1 + C2 * Hum + C3 * Hum *Hum;
  27.     RH_True = (Temp_C - 25) * (T1 + T2 * Hum) + RH_Lin;
  28.     //限定范围
  29.     if( RH_True > 100 ) RH_True = 100;
  30.     if( RH_True < 0.01) RH_True = 0.01;
  31.    
  32.     *pTempValue = Temp_C;
  33.     *pHumValue = RH_True;
  34.    
  35. }


  36. /**
  37.   * @brief  延时函数
  38.   * @param  无
  39.   * @retval 无
  40.   */
  41. void SHT10_Delay(void)
  42. {
  43.     //延时函数,i有待修改
  44.     for(uint16_t i = 500 ; i > 0 ; i--)
  45.     {
  46.         ;
  47.     }
  48. }
 楼主| Jessicakjdsl 发表于 2016-11-23 19:25 | 显示全部楼层
  1. /* Includes ------------------------------------------------------------------*/
  2. #include "stm32f10x.h"

  3. //函数声明
  4. void USART1_Config(void);
  5. uint8_t Add_Tx1Item(uint8_t ch);
  6. uint8_t Get_Tx1BufCounter(void);
  7. uint8_t Get_Rx1Item(void);
  8. uint8_t Get_Rx1BufCounter(void);
  9. void Clear_Tx1Buf(void);
  10. void Clear_Rx1Buf(void);
  11. #endif

  12. c文件部分
  13. /**
  14.   ******************************************************************************
  15.   * [url=home.php?mod=space&uid=288409]@file[/url]   
  16.   * [url=home.php?mod=space&uid=187600]@author[/url]  
  17.   * @version
  18.   * [url=home.php?mod=space&uid=212281]@date[/url]   
  19.   * @brief   以队列的方式发送和接收数据
  20.   ******************************************************************************
  21.   */
  22. /* Includes ------------------------------------------------------------------*/
  23. #include "usart1.h"
  24. #include "stdio.h"
  25. #include "stm32f10x_it.h"
  26. /* Private typedef -----------------------------------------------------------*/
  27. /* Private define ------------------------------------------------------------*/
  28. /* Private macro -------------------------------------------------------------*/
  29. //发送缓冲区长度
  30. #define TX1_BUFFER_SIZE        128
  31. //接收缓冲区长度
  32. #define RX1_BUFFER_SIZE 128
  33. /* Private variables ---------------------------------------------------------*/
  34. //发送缓冲区
  35. uint8_t Tx1_Buffer[TX1_BUFFER_SIZE];
  36. uint8_t Tx1_WriteIndex = 0;
  37. uint8_t Tx1_ReadIndex = 0;
  38. uint8_t Tx1_Counter = 0;
  39. //接收缓冲区
  40. uint8_t Rx1_Buffer[RX1_BUFFER_SIZE];
  41. uint8_t Rx1_WriteIndex = 0;
  42. uint8_t Rx1_ReadIndex = 0;
  43. uint8_t Rx1_Counter = 0;
  44. uint8_t Rx1_BufOverflow = 0;
  45. /* Private function prototypes -----------------------------------------------*/
  46. /* Private functions ---------------------------------------------------------*/

  47. /**
  48.   * @brief  USART1_Config 初始化USART1
  49.   *         第一步 使能GPIOA时钟
  50.   *         第二步 配置IO口
  51.   *         第三步 配置USART1
  52.   *         第四步 配置中断优先级
  53.   * @param  None
  54.   * @retval None
  55.   */
  56. void USART1_Config(void)
  57. {
  58.     USART_InitTypeDef USART_InitStructure;
  59.     GPIO_InitTypeDef GPIO_InitStructure;
  60.    
  61.     Clear_Tx1Buf();
  62.     Clear_Rx1Buf();
  63.    
  64.     //使能GPIOA时钟
  65.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA \
  66.                         | RCC_APB2Periph_USART1 ,ENABLE);
  67.   
  68.     //PA9 TX1 复用推挽输出
  69.           GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
  70.           GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  71.           GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  72.           GPIO_Init(GPIOA, &GPIO_InitStructure);
  73.           //PA10 RX1 浮动输入
  74.           GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
  75.           GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;   
  76.           GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  77.           GPIO_Init(GPIOA, &GPIO_InitStructure);
  78.   
  79.     USART_InitStructure.USART_BaudRate = 9600;
  80.     USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  81.     USART_InitStructure.USART_StopBits = USART_StopBits_1;
  82.     USART_InitStructure.USART_Parity = USART_Parity_No;
  83.     USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  84.     USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  85.     USART_Init(USART1, &USART_InitStructure);
  86.     //使能接收中断
  87.         USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
  88.     //使能USART1
  89.         USART_Cmd(USART1, ENABLE);
  90.    
  91.     //配置USART1中断,最高优先级
  92.     NVIC_InitTypeDef NVIC_InitStructure;
  93.           //抢占优先级0  
  94.           NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
  95.           //从优先级1
  96.           NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
  97.           NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  98.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  99.           NVIC_Init(&NVIC_InitStructure);

  100. }
 楼主| Jessicakjdsl 发表于 2016-11-23 19:26 | 显示全部楼层
  1. /**
  2.   * @brief  加入发送队列.
  3.   * @param  待发送的数据
  4.   * @retval 待发送的数据
  5.   */
  6. uint8_t Add_Tx1Item(uint8_t ch)
  7. {
  8.         //发送队列满。发送队列满
  9.     while(Tx1_Counter == TX1_BUFFER_SIZE);      
  10.       
  11.     //压入数据
  12.     Tx1_Buffer[Tx1_WriteIndex] = ch;
  13.     //发送缓冲区写计数器移动
  14.     Tx1_WriteIndex ++;
  15.     if( Tx1_WriteIndex >= TX1_BUFFER_SIZE )
  16.         {
  17.             //写指针移动到队列头部      
  18.                 Tx1_WriteIndex = 0;                              
  19.         }
  20.     //数据总数增加
  21.     Tx1_Counter++;
  22.       
  23.     //使能发送中断
  24.         USART_ITConfig(USART1,USART_IT_TXE,ENABLE);
  25.    
  26.         return Tx1_WriteIndex;      
  27. }
  28. /**
  29.   * @brief  返回发送队列中的字节数
  30.   * @param  无
  31.   * @retval 发送队列中的字节数
  32.   */
  33. uint8_t Get_Tx1BufCounter(void)
  34. {
  35.     return Tx1_Counter;
  36. }

  37. /**
  38.   * @brief  从接收队列中取出数据.
  39.   * @param  None
  40.   * @retval 被取出数据
  41.   */
  42. uint8_t Get_Rx1Item(void)
  43. {
  44.         uint8_t Rx1_Data;
  45.    
  46.         //等待,需要修改
  47.         while(Rx1_Counter == 0);
  48.    
  49.         //从队列中读取数据
  50.         Rx1_Data = Rx1_Buffer[Rx1_ReadIndex];
  51.     //接收缓冲区读指针移动
  52.         Rx1_ReadIndex ++;
  53.         if(Rx1_ReadIndex >= RX1_BUFFER_SIZE)
  54.         {
  55.                 Rx1_ReadIndex = 0;
  56.         }
  57.     //
  58.         Rx1_Counter --;

  59.         return Rx1_Data;      
  60. }

  61. /**
  62.   * @brief  返回接收队列中的字节数
  63.   * @param  无
  64.   * @retval 接收队列中的字节数
  65.   */
  66. uint8_t Get_Rx1BufCounter(void)
  67. {
  68.     return Rx1_Counter;
  69. }

  70. /**
  71.   * @brief  清空发送队列
  72.   * @param  无
  73.   * @retval 无
  74.   */
  75. void Clear_Tx1Buf(void)
  76. {
  77.     for(uint8_t i = 0 ; i < TX1_BUFFER_SIZE ; i++)
  78.     {
  79.         Tx1_Buffer = 0;
  80.     }
  81.     Tx1_Counter = 0;
  82. }
  83. /**
  84.   * @brief  清空接收队列
  85.   * @param  无
  86.   * @retval 无
  87.   */
  88. void Clear_Rx1Buf(void)
  89. {
  90.     for(uint8_t i = 0 ; i < RX1_BUFFER_SIZE ; i++)
  91.     {
  92.         Rx1_Buffer = 0;
  93.     }
  94.    
  95.     Rx1_Counter = 0;
  96. }

  97. /**
  98.   * @brief  USART1中断.
  99.   * @param  None
  100.   * @retval None
  101.   */
  102. void USART1_IRQHandler(void)
  103. {
  104.           uint8_t ch;
  105.       
  106.     //接收中断
  107.         if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
  108.           {
  109.                 //读取数据
  110.                 ch = USART_ReceiveData(USART1);               
  111.         
  112.         //清除接收中断标志位
  113.         //USART_ClearFlag(USART1,USART_FLAG_RX1NE);
  114.         //接收缓冲区数据个数递增
  115.                 Rx1_Counter++;      
  116.         
  117.                 //数据填入接收队列
  118.                 Rx1_Buffer[Rx1_WriteIndex] = ch;
  119.       
  120.                 Rx1_WriteIndex ++;
  121.                 if(Rx1_WriteIndex >= RX1_BUFFER_SIZE)
  122.                 {
  123.                         Rx1_WriteIndex = 0;
  124.                 }

  125.                 //队列溢出
  126.                 if(Rx1_Counter >= RX1_BUFFER_SIZE)
  127.                 {
  128.                         //数据作废,修改
  129.                         //Rx1_Counter = 0;
  130.                         //溢出标志置位
  131.                         Rx1_BufOverflow = 1;
  132.                 }

  133.           }
  134.    
  135.         //发送中断
  136.         if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET)
  137.           {
  138.                 //清除接收中断标志位
  139.                 //USART_ClearFlag(USART1,USART_FLAG_TX1E);
  140.                 //存在未发送的数据
  141.                 if(Tx1_Counter > 0)
  142.                 {
  143.                         //发送数据
  144.                         USART_SendData(USART1, Tx1_Buffer[Tx1_ReadIndex]);
  145.             //发送数据总数递减
  146.                         Tx1_Counter --;
  147.                         Tx1_ReadIndex++;
  148.                         //回到缓冲区开头
  149.                         if(Tx1_ReadIndex >= TX1_BUFFER_SIZE)
  150.                         {
  151.                                 Tx1_ReadIndex = 0;
  152.                         }
  153.                 }
  154.         else
  155.         {
  156.             //无发送数据,关闭发送中断
  157.             USART_ITConfig(USART1,USART_IT_TXE,DISABLE);;  
  158.         }
  159.           }
  160. }


  161. int fputc(int ch, FILE * f)
  162. {
  163.     //通过串口发送数据  
  164.     Add_Tx1Item((uint8_t)ch);
  165.    
  166.     return ch;
  167. }
zhuomuniao110 发表于 2016-11-23 20:03 | 显示全部楼层
在室内如果好好的那么在外面也好好的,没要大问题,这个变化要看变化率了。温差是否大。
尤彼卡 发表于 2016-11-23 21:51 | 显示全部楼层
感谢分享
liubo0702 发表于 2016-11-24 09:09 | 显示全部楼层
谢谢分享!学习一下
Thethree 发表于 2016-11-26 18:56 | 显示全部楼层
温度的响应时间是多少,从20°下降到0°需要多长时间?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

17

主题

116

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部