单片机/MCU论坛
直播中

路百川

9年用户 3经验值
擅长:嵌入式技术 RF/无线
私信 关注
[问答]

请教sht10温湿度传感器问题

最近用一个arm的cortex-m0 MCU做一个温湿度传感器,使用的传感器芯片是SHT10,,使用过程中遇到一些问题,特发此贴寻求帮助。
1、关于硬件电路,基本上按照官方给的datasheet做的,只是VDD使用的是3.3V。
2、软件实现在下面给出,基本是官方给的样例修改的。
3、遇到的问题,温度结果过高,湿度结果过低。但是总体上是成线性的。在24~25度室温下,测出温度为30~31度,湿度更谈不上准确。在低温环境下,温度数值也立刻下降,比如放在零度左右,测得8度。
4、我想请问你们用这款传感器时温度是否需要修正,谢谢。

  1. void SHT10_con_init()
  2. {
  3.     SHT10_SCL_CFG();
  4.     SHT10_SDA_CFG();

  5.     SHT10_SCL_OUTPUT();
  6.     SHT10_SCL_LOW();
  7.     SHT10_SDA_INPUT();
  8.     SHT10_delay_half();
  9. }

  10. void SHT10_con_wait()
  11. {
  12.     SHT10_SCL_LOW();
  13.     SHT10_delay_half();
  14.     SHT10_SDA_INPUT();
  15.     SHT10_delay_half();
  16. }

  17. void SHT10_con_reset()
  18. {
  19.     uint8_t i;
  20.     SHT10_SDA_OUTPUT();
  21.     SHT10_SDA_HIGH();
  22.     SHT10_SCL_LOW();
  23.     SHT10_delay_half();
  24.     for( i=0 ; i<9 ; i++ )
  25.     {
  26.         SHT10_SCL_HIGH();
  27.         SHT10_delay();
  28.         SHT10_SCL_LOW();
  29.         SHT10_delay();
  30.     }

  31.     SHT10_start_transfers();
  32. }

  33. void SHT10_start_transfers()
  34. {
  35.     SHT10_SDA_OUTPUT();
  36.     SHT10_SDA_HIGH();
  37.     SHT10_SCL_LOW();
  38.     SHT10_delay_half();

  39.     SHT10_SCL_HIGH();
  40.     SHT10_delay_half();
  41.     SHT10_SDA_LOW();
  42.     SHT10_delay_half();

  43.     SHT10_SCL_LOW();
  44.     SHT10_delay();

  45.     SHT10_SCL_HIGH();
  46.     SHT10_delay_half();
  47.     SHT10_SDA_HIGH();
  48.     SHT10_delay_half();
  49.    
  50.     SHT10_SCL_LOW();
  51. }

  52. int SHT10_write_byte(uint8_t data)
  53. {
  54.     uint8_t i;
  55.     SHT10_SDA_OUTPUT();
  56.     for (i=0x80;i>0;i>>=1)
  57.     {   
  58.         if(i&data)
  59.                 {
  60.             SHT10_SDA_HIGH();
  61.                 }
  62.         else{
  63.            SHT10_SDA_LOW();
  64.                 }
  65.         SHT10_delay_half();
  66.         SHT10_SCL_HIGH();
  67.         SHT10_delay();
  68.                 SHT10_SCL_LOW();
  69.         SHT10_delay_half();
  70.     }
  71.     SHT10_SCL_LOW();
  72.     SHT10_SDA_INPUT();
  73.     SHT10_delay();
  74.     SHT10_SCL_HIGH();
  75.    
  76.     if(SHT10_SDA_READ())
  77.     {
  78.         SHT10_SCL_LOW();
  79.         return -1;
  80.     }
  81.     SHT10_SCL_LOW();
  82.     return 0;
  83. }

  84. uint8_t SHT10_read_byte(uint8_t ack)
  85. {
  86.     uint8_t i;
  87.         uint8_t value;
  88.     SHT10_SDA_OUTPUT();
  89.     SHT10_SDA_HIGH();
  90.     SHT10_delay_half();
  91.     SHT10_SDA_INPUT();

  92.     value = 0;
  93.     for(i=0x80;i>0;i>>=1)
  94.     {
  95.         SHT10_SCL_HIGH();
  96.         SHT10_delay_half();
  97.         if(SHT10_SDA_READ())
  98.                 {
  99.                         value |=i;
  100.                 }
  101.                 );
  102.         SHT10_delay_half();
  103.         SHT10_SCL_LOW();
  104.         SHT10_delay();
  105.     }
  106.     SHT10_SDA_OUTPUT();
  107.         if(ack)
  108.         {
  109.         SHT10_SDA_LOW();
  110.     }else{
  111.                 SHT10_SDA_HIGH();
  112.         }
  113.         SHT10_delay_half();
  114.     SHT10_SCL_HIGH();
  115.     SHT10_delay();
  116.     SHT10_SCL_LOW();
  117.     SHT10_SDA_INPUT();
  118.     return value;
  119. }

  120. int SHT10_reset()
  121. {
  122.     SHT10_con_reset();
  123.         return SHT10_write_byte(SHT10_CMD_RESET);
  124. }
  125. int SHT10_set_status(uint8_t status)
  126. {
  127.     SHT10_start_transfers();
  128.         if(SHT10_write_byte(SHT10_CMD_STATUS_WRITE))
  129.         {
  130.                 return -1;
  131.         }
  132.         return SHT10_write_byte(status);       
  133. }
  134. int SHT10_read_status(uint8_t *status)
  135. {
  136.     uint8_t ack;
  137.         SHT10_start_transfers();
  138.         if(SHT10_write_byte(SHT10_CMD_STATUS_READ))
  139.         {
  140.                 return -1;
  141.         }
  142.     *status = SHT10_read_byte(1);
  143.         ack = SHT10_read_byte(1);
  144.         return  0;
  145. }
  146. int SHT10_temp_measure_start()
  147. {
  148.     uint16_t result = 0;
  149.         SHT10_start_transfers();
  150.         if(SHT10_write_byte(SHT10_CMD_TEMP_MS))
  151.         {
  152.                 return -1;
  153.         }
  154.         SHT10_con_wait();
  155.         sensor_mod = SHT10_Measure_Temperature;
  156.         app_timer_start(sht10_time,MEASURE_TEMP_WAIT_TICK,NULL);
  157.         return 0;
  158.        
  159. }
  160. int SHT10_humi_measure_start()
  161. {
  162.         uint16_t result = 0;
  163.         SHT10_start_transfers();
  164.         if(SHT10_write_byte(SHT10_CMD_HUMI_MS))
  165.         {
  166.                 return -1;
  167.         }

  168.         SHT10_con_wait();
  169.         sensor_mod = SHT10_Measure_Humidity;
  170.         app_timer_start(sht10_time,MEASURE_HUMI_WAIT_TICK,NULL);
  171.         return 0;
  172.        
  173. }
  174. /*测量结果是使用一个定时器触发后再去读取的,没有使用循环等待*/
  175. int SHT10_receive_value(uint16_t *value)
  176. {
  177.         uint16_t data,count;
  178.         uint8_t values[3] = {0,0,0};
  179.         count = 0;
  180.     while(SHT10_SDA_READ())
  181.     {
  182.                 count++;
  183.                 if(count>=1000)
  184.                 {
  185.                         return -1;
  186.                 }
  187.                 nrf_delay_ms(1);
  188.     }
  189.         values[0] = SHT10_read_byte(1);
  190.         values[1] = SHT10_read_byte(0);
  191.         *value  = (values[0] << 8) + values[1];
  192.         return 0;
  193. }
  194. float SHT10_get_temp_value(float temp)
  195. {
  196.     return (temp * 0.01 - 40.1);
  197. }
  198. float SHT10_get_humi_value(float humi)
  199. {
  200.     const float c1=-4.0;      // for 12 Bit
  201.     const float c2=0.0405;     // for 12 Bit
  202.     const float c3=-2.8E-6;     // for 12 Bit
  203.     const float t1=0.01;      // for 14 Bit @ 5V
  204.     const float t2=0.00008;     // for 14 Bit @ 5V
  205.         float linear,value;
  206.         linear = humi * humi *(c3)+(humi)*c2+c1;
  207.         value = (temperature_value - 25.0)*(t1+t2*humi)+linear;
  208.         return value;
  209. }

  210. void app_sht10_timeout_handler_t(void * p_context)
  211. {
  212.         uint16_t result = 0;
  213.         //UNUSED_PARAMETER(p_context);
  214.         if(sensor_mod == SHT10_Measure_Temperature)
  215.         {
  216.                 if(SHT10_receive_value(&result))
  217.             {
  218.                         sensor_mod = SHT10_ERROR;
  219.             }
  220.             temperature_value = SHT10_get_temp_value((float)result);
  221.                 SHT10_humi_measure_start();
  222.         }else if(sensor_mod == SHT10_Measure_Humidity)
  223.         {
  224.                 if(SHT10_receive_value(&result))
  225.             {
  226.                         sensor_mod = SHT10_ERROR;
  227.             }

  228.             humidity_value = SHT10_get_humi_value((float)result);
  229.                 sensor_mod = SHT10_Measure_Free;
  230.                 is_SHT10_busy = 0;
  231.         }
  232. }
  233. int SHT10_init()
  234. {
  235.         uint8_t status;
  236.         if(is_SHT10_busy)
  237.                 return -1;
  238.         is_SHT10_busy = 0;
  239.         nrf_delay_ms(20);
  240.         SHT10_con_init();
  241.     SHT10_reset();
  242.         nrf_delay_ms(11);
  243.         sensor_mod = SHT10_Measure_Free;
  244.         SHT10_set_status(0);
  245.         app_timer_create(&sht10_time,APP_TIMER_MODE_SINGLE_SHOT,app_sht10_timeout_handler_t);
  246.         return 0;
  247. }
  248. int SHT10_measure_start()
  249. {
  250.         if(is_SHT10_busy)
  251.                 return -1;
  252.         is_SHT10_busy = 1;
  253.         if(SHT10_temp_measure_start())
  254.         {
  255.                 SHT10_con_reset();
  256.                 is_SHT10_busy = 0;
  257.                 return -1;
  258.         }
  259.         return 0;
  260. }
  261. int SHT10_pop_value(float *temp,float *humi)
  262. {
  263.         if(is_SHT10_busy)
  264.                 return -1;
  265.         *temp = temperature_value;
  266.         *humi = humidity_value;
  267.         return 0;
  268. }



更多回帖

发帖
×
20
完善资料,
赚取积分