OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4858|回复: 6

基于STM32CUBEIDE SHT31温湿度传感器温湿度获取

[复制链接]

53

主题

567

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2107
金钱
2107
注册时间
2017-2-11
在线时间
307 小时
发表于 2020-11-23 10:54:37 | 显示全部楼层 |阅读模式
直接上代码

  1. /*
  2. * bsp_sht31_1.c
  3. *
  4. *  Created on: 2020年11月10日
  5. *      Author: jiangyuanyuan
  6. */

  7. #include "bsp_sht31_1.h"

  8. void SHT31_SDA_IN(void)
  9. {
  10.         GPIO_InitTypeDef GPIO_InitStruct = {0};
  11.         //PB7初始化设置
  12.         SHT7_DIR_BA();
  13.         GPIO_InitStruct.Pin = SHT7_SDA1_Pin;
  14.         GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  15.         GPIO_InitStruct.Pull = GPIO_PULLUP;
  16.         HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
  17. }

  18. void SHT31_SDA_OUT(void)
  19. {
  20.         GPIO_InitTypeDef GPIO_InitStruct = {0};
  21.         //PB7初始化设置
  22.         SHT7_DIR_AB();
  23.         GPIO_InitStruct.Pin = SHT7_SDA1_Pin;
  24.         GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  25.         GPIO_InitStruct.Pull = GPIO_PULLUP;
  26.         GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  27.         HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
  28. }

  29. /*************************以下为IO口模拟IIC通信**********************************/
  30. //IIC起始信号
  31. void SHT31_Start(void)
  32. {
  33.         //when scl is high, the SDA is change from high to low
  34.         SHT31_SDA_OUT();     //配置SDA线为输出
  35.         SHT31_IIC_SDAOUT = 1;
  36. //        Delay_us(5);
  37.         SHT31_IIC_SCL = 1;
  38.         Delay_us(10);
  39.         SHT31_IIC_SDAOUT = 0;
  40.         Delay_us(10);
  41.         SHT31_IIC_SCL = 0;     //准备发送或接收数据
  42.         Delay_us(10);
  43. }
  44. //IIC停止信号
  45. void SHT31_Stop(void)
  46. {

  47.         //When scl is high, the SDA is change from low to high

  48.         SHT31_SDA_OUT();    //配置SDA线为输出
  49.         SHT31_IIC_SCL = 0;
  50.         Delay_us(3);
  51.         SHT31_IIC_SDAOUT = 0;
  52.         Delay_us(5);
  53.         SHT31_IIC_SCL = 1;
  54.         Delay_us(10);
  55.         SHT31_IIC_SDAOUT = 1; //发送I2C总线结束信号
  56.         Delay_us(10);
  57. }

  58. /****************************************************************************
  59. * 名    称: u8 MCU_Wait_Ack(void)
  60. * 功    能:MCU等待从设备应答信号到来
  61. * 入口参数:无
  62. * 返回参数:1:接收应答失败  0:接收应答成功
  63. * 说    明:  
  64. ****************************************************************************/
  65. u8 SHT31_Wait_Ack(void)
  66. {
  67.         u16 WaitTime = 0;
  68.         SHT31_IIC_SDAOUT = 1;
  69.         SHT31_SDA_IN();      //配置SDA线为输入
  70.         Delay_us(4);        //2
  71.         SHT31_IIC_SCL = 1;
  72.         Delay_us(2);        //5

  73.         while(SHT31_IIC_SDAIN)
  74.         {
  75.                 Delay_us(1);
  76.                 WaitTime++;
  77.                 if(WaitTime>250)
  78.                 {
  79.                         SHT31_Stop();
  80.                         return 1;
  81.                 }
  82.         }
  83.         SHT31_IIC_SCL = 0;
  84.         Delay_us(8); //added
  85.         return 0;
  86. }
  87. /****************************************************************************
  88. * 名    称: u8 void MCU_Send_Ack(void)
  89. * 功    能:MCU产生ACK应答,告知24cxx
  90. * 入口参数:无
  91. * 返回参数:
  92. * 说    明:  
  93. ****************************************************************************/
  94. void SHT31_Send_Ack(void)
  95. {
  96.         SHT31_IIC_SCL = 0;
  97.         SHT31_SDA_OUT();
  98.         SHT31_IIC_SDAOUT = 0;
  99.         Delay_us(2);
  100.         SHT31_IIC_SCL = 1;
  101.         Delay_us(2);
  102.         SHT31_IIC_SCL = 0;
  103. }
  104. /****************************************************************************
  105. * 名    称: u8 void MCU_Send_Ack(void)
  106. * 功    能:MCU不产生ACK应答
  107. * 入口参数:无
  108. * 返回参数:
  109. * 说    明:  
  110. ****************************************************************************/
  111. void SHT31_NOAck(void)
  112. {
  113.         SHT31_IIC_SCL = 0;
  114.         SHT31_SDA_OUT();
  115.         SHT31_IIC_SDAOUT = 1;
  116.         Delay_us(2);
  117.         SHT31_IIC_SCL = 1;
  118.         Delay_us(2);
  119.         SHT31_IIC_SCL = 0;
  120. }
  121. /****************************************************************************
  122. * 名    称: void IIC_write_OneByte(u8 Senddata)
  123. * 功    能:IIC写一个字节到EEPROM
  124. * 入口参数:Senddata:写入的8位数据
  125. * 返回参数:
  126. * 说    明:  
  127. ****************************************************************************/
  128. void SHT31_write_OneByte(u8 Senddata)
  129. {
  130.         u8 t;
  131.         SHT31_SDA_OUT();

  132. //  IIC_SCL=0;    //拉低时钟开始数据传输
  133.         for(t = 0;t < 8;t++)
  134.         {
  135.                 SHT31_IIC_SDAOUT=(Senddata&0x80)>>7;
  136.                 Senddata <<= 1;
  137.                 Delay_us(5);
  138.                 SHT31_IIC_SCL = 1;
  139.                 Delay_us(10);
  140.                 SHT31_IIC_SCL = 0;
  141.                 Delay_us(2);
  142.         }
  143. }
  144. /****************************************************************************
  145. * 名    称: void IIC_Read_OneByte(u8 Senddata)
  146. * 功    能:IIC读取一个字节
  147. * 入口参数:ack=1,发送ACK,ack=0,发送nACK
  148. * 返回参数:读到的8位数据
  149. * 说    明:  
  150. ****************************************************************************/
  151. u8 SHT31_Read_OneByte(u8 ack)
  152. {
  153.         u8 i,receivedata = 0;
  154.         SHT31_SDA_IN();       //配置SDA线为输入
  155.         for(i=0;i<8;i++ )
  156.         {
  157.                 SHT31_IIC_SCL = 0;
  158.                 Delay_us(3);
  159.                 SHT31_IIC_SCL = 1;
  160.                 Delay_us(5);  //added by xiang
  161.                 receivedata <<= 1;
  162.                 if(SHT31_IIC_SDAIN)
  163.                         receivedata++;
  164.                 Delay_us(1);
  165.         }
  166.     if (!ack)
  167.       SHT31_NOAck();//发送nACK
  168.     else
  169.       SHT31_Send_Ack(); //发送ACK
  170.     return receivedata;
  171. }

  172. //初始化IIC接口
  173. void SHT31_Init(void)
  174. {
  175.         Delay_us(200);
  176.         SHT31_SetPeriodicMeasurement();
  177.         Delay_us(200);
  178. }

  179. u16 TemValue = 0;
  180. u16 RhValue = 0;
  181. u8 Flag_New_Data = 0;
  182. void SHT31_Get(void)
  183. {
  184.         u16 temp1 = 0,temp2 = 0;
  185.         u16 data;
  186.         u8 buf1[3],buf2[3];  //store Temperature +crc and Humidity +crc

  187.         SHT31_Start();          //启动总线

  188.         SHT31_write_OneByte(i2cAddWrite_8bit);   //发送写命令(i2c地址)
  189.         SHT31_Wait_Ack();                         //等待应答

  190.         SHT31_write_OneByte(CMD_FETCH_DATA_H);    //发送地址 High
  191.         SHT31_Wait_Ack();                           //等待应答

  192.         SHT31_write_OneByte(CMD_FETCH_DATA_L);    //发送地址 Low
  193.         SHT31_Wait_Ack();                           //等待应答

  194.         SHT31_Start();           //重新启动总线

  195.         SHT31_write_OneByte(i2cAddRead_8bit);                  //设置为读操作
  196.         SHT31_Wait_Ack();                   //等待应答;

  197.         //读字节下面连续读出数据6 bytes 前5个ACK应答 最后一个NO ACK

  198.         buf1[0] = SHT31_Read_OneByte(1);
  199.         buf1[1] = SHT31_Read_OneByte(1);
  200.         buf1[2] = SHT31_Read_OneByte(1);
  201.         buf2[0] = SHT31_Read_OneByte(1);
  202.         buf2[1] = SHT31_Read_OneByte(1);
  203.         buf2[2] = SHT31_Read_OneByte(0);

  204.         SHT31_Stop();                //结束总线

  205.         temp1 = SHT31_CheckCrc(buf1,2,buf1[2]);

  206.         if(!temp1)
  207.         {
  208.                 data = (buf1[0]<<8)|buf1[1];
  209.                 TemValue = SHT31_CalcTemperature(data);
  210.                 Flag_New_Data = 1;
  211.         }

  212.         temp2 = SHT31_CheckCrc(buf2,2,buf2[2]);

  213.         if(!temp2)
  214.         {
  215.                 data = (buf2[0]<<8) | buf2[1];
  216.                 RhValue = SHT31_CalcRH(data);
  217.                 Flag_New_Data = 1;
  218.         }

  219.         *(u16 *)&ucParamMem[ID_EMT][0] = TemValue;
  220.         *(u16 *)&ucParamMem[ID_EMH][0] = RhValue;
  221. }

  222. /******************************************************/
  223. void SHT31_WriteCMD(u16 cmd)
  224. {
  225.         SHT31_Start();
  226.         SHT31_write_OneByte(i2cAddWrite_8bit);
  227.         SHT31_Wait_Ack();
  228.         SHT31_write_OneByte(cmd>>8);
  229.         SHT31_Wait_Ack();
  230.         SHT31_write_OneByte(cmd);
  231.         SHT31_Wait_Ack();
  232.         SHT31_Stop();
  233. }

  234. /********************************************************/
  235. void SHT31_SetPeriodicMeasurement(void)
  236. {
  237.         SHT31_WriteCMD(CMD_MEAS_PERI_2_H);
  238. }

  239. u8 SHT31_CalcCrc(u8 *data, u8 nbrOfBytes)
  240. {
  241.         u8 bit;        // bit mask
  242.         u8 crc = 0xFF; // calculated checksum
  243.         u8 byteCtr;    // byte counter

  244.         // calculates 8-Bit checksum with given polynomial
  245.         for(byteCtr = 0; byteCtr < nbrOfBytes; byteCtr++)
  246.         {
  247.                 crc ^= (data[byteCtr]);
  248.                 for(bit = 8; bit > 0; --bit)
  249.                 {
  250.                         if(crc & 0x80)
  251.                         {
  252.                                 crc = (crc << 1) ^ POLYNOMIAL;
  253.                         }
  254.                         else
  255.                         {
  256.                                 crc = (crc << 1);
  257.                         }
  258.                 }
  259.         }
  260.         return crc;
  261. }
  262. //校验
  263. u8 SHT31_CheckCrc(u8 *pdata, u8 nbrOfBytes, u8 checksum)
  264. {
  265.         u8 crc;
  266.         crc = SHT31_CalcCrc(pdata, nbrOfBytes);// calculates 8-Bit checksum
  267.         if(crc != checksum)
  268.         {
  269.                 return 1;
  270.         }
  271.         return 0;
  272. }
  273. //获取温度
  274. u16 SHT31_CalcTemperature(u16 rawValue)
  275. {
  276.         // calculate temperature
  277.         u16 temp;
  278.         temp = (175 * (float)rawValue * 100 / 65535 - 4500) ; // T = -45 + 175 * rawValue / (2^16-1)
  279.         return temp;
  280. }
  281. //获取湿度
  282. u16 SHT31_CalcRH(u16 rawValue)
  283. {
  284.         // calculate relative humidity [%RH]
  285.         u16 temp = (100 * (float)rawValue * 100 / 65535) ;  // RH = rawValue / (2^16-1) * 10
  286.         return temp;
  287. }
复制代码

  1. /*
  2. * bsp_sht31_1.h
  3. *
  4. *  Created on: 2020年11月10日
  5. *      Author: jiangyuanyuan
  6. */

  7. #ifndef INC_BSP_SHT31_1_H_
  8. #define INC_BSP_SHT31_1_H_

  9. #include "mytype.h"
  10. #include "stm32f4xx_hal.h"
  11. #include "bsp_delay.h"
  12. #include "bsp_sys.h"
  13. #include "gpio.h"
  14. #include "parameter.h"

  15. #define  i2cAddWrite_8bit           0x88
  16. #define  i2cAddRead_8bit            0x89

  17. #define  TEM_CHEAK_VALUE                   2
  18. #define  RH_CHEAK_VALUE                    13

  19. /*CRC*/
  20. #define POLYNOMIAL                         0x131           // P(x) = x^8 + x^5 + x^4 + 1 = 100110001

  21. // Sensor Commands

  22. // readout measurements for periodic mode
  23. #define     CMD_FETCH_DATA_H          0xe0
  24. #define     CMD_FETCH_DATA_L          0x00
  25. #define     CMD_MEAS_PERI_2_H         0x2236


  26. #define SHT31_IIC_SCL      PBout(6) //SCL
  27. #define SHT31_IIC_SDAOUT   PBout(7) //输出SDA
  28. #define SHT31_IIC_SDAIN    PBin(7)  //输入SDA

  29. #define SHT7_DIR_AB()      PBout(8)=1
  30. #define SHT7_DIR_BA()      PBout(8)=0

  31. //IIC相关函数
  32. void SHT31_Start(void);                                          //发送IIC开始信号
  33. void SHT31_Stop(void);                                          //发送IIC停止信号
  34. u8 SHT31_Wait_Ack(void);                                 //IIC等待ACK信号
  35. void SHT31_Send_Ack(void);                                //IIC发送ACK信号
  36. void SHT31_NOAck(void);                                          //IIC不发送ACK信号
  37. void SHT31_write_OneByte(u8 Senddata);
  38. u8 SHT31_Read_OneByte(u8 ack);

  39. extern u16  TemValue;
  40. extern u16 RhValue;
  41. extern u8 Flag_New_Data;

  42. extern void SHT31_Init(void);
  43. extern void SHT31_Get(void);

  44. void SHT31_SetPeriodicMeasurement(void);
  45. u8 SHT31_CheckCrc(u8 *pdata, u8 nbrOfBytes, u8 checksum);
  46. u16 SHT31_CalcTemperature(u16 rawValue);
  47. u16 SHT31_CalcRH(u16 rawValue);

  48. #endif /* INC_BSP_SHT31_1_H_ */
复制代码



main.c文件

  1. int main(void)
  2. {
  3.         static u16 usLoopCnt = 0;
  4.         SHT31_Init();
  5.         while(1)
  6.         {
  7.                 if (usLoopCnt == 199)
  8.                 {
  9.                         SHT31_Get();
  10.                 }
  11.                 usLoopCnt++;
  12.                 usLoopCnt %= 300;
  13.         }
  14. }
复制代码




正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

53

主题

567

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2107
金钱
2107
注册时间
2017-2-11
在线时间
307 小时
 楼主| 发表于 2020-11-23 10:56:03 | 显示全部楼层
延时函数

  1. /*
  2. * bsp_delay.c
  3. *
  4. *  Created on: Aug 19, 2020
  5. *      Author: jiangyuanyuan
  6. */

  7. #include "bsp_delay.h"

  8. //初始化延迟函数
  9. //当使用ucos的时候,此函数会初始化ucos的时钟节拍
  10. //SYSTICK的时钟固定为AHB时钟
  11. //SYSCLK:系统时钟频率

  12. void delay_init(void)
  13. {
  14.         HAL_SYSTICK_Config(168);  // 配置并启动系统滴答定时器
  15.         HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
  16.         HAL_NVIC_SetPriority(SysTick_IRQn, 0U, 0U);
  17. }

  18. //延时nus

  19. void delay_us(uint32_t nus)
  20. {
  21.         HAL_Delay(nus);
  22. }

  23. //延时nms
  24. //nms:要延时的ms数
  25. void delay_ms(uint16_t nms)
  26. {
  27.         uint32_t i;
  28.         for(i=0;i<nms;i++) HAL_Delay(1000);
  29. }


  30. /****************************************************************************
  31. * 名                称: void Delay_us(u32 nus)
  32. * 功                能:延时nus
  33. * 入口参数:药延时的微秒数
  34. * 返回参数:无
  35. * 说                明:nus得值,不要大于798915us
  36. ****************************************************************************/
  37. void Delay_us(uint32_t nus)
  38. {
  39.         uint32_t i,j;
  40.   for(i = 0; i < nus; i++)
  41.   {
  42.                 j=10;   //change it  for timing adjustment
  43.                 while(j--)
  44.                 {
  45.                         __NOP();  // nop's may be added or removed for timing
  46.                 }
  47.   }
  48. }

  49. void Delay_ms(uint16_t nms)
  50. {
  51.         uint16_t i,j,k;
  52.         for(i = 0; i < nms; i++)
  53.         {
  54.                 for(j = 0; j < 1000; j++)
  55.                 {
  56.                         k=10;   //change it  for timing adjustment
  57.                         while(k--)
  58.                         {
  59.                                 __NOP();  // nop's may be added or removed for timing
  60.                         }
  61.                 }
  62.         }
  63. }

  64. void delay_Xms(uint16_t nms,uint8_t Cnt)
  65. {
  66.         uint8_t ucCnt = 0;
  67.         for(;ucCnt<Cnt;ucCnt++)
  68.                 delay_ms(nms);
  69. }

复制代码

  1. /*
  2. * bsp_delay.h
  3. *
  4. *  Created on: Aug 19, 2020
  5. *      Author: jiangyuanyuan
  6. */


  7. #ifndef INC_BSP_DELAY_H_
  8. #define INC_BSP_DELAY_H_

  9. #include "gpio.h"
  10. #include "stm32f4xx_hal.h"
  11. #include "bsp_delay.h"

  12. void delay_init(void);
  13. void delay_ms(uint16_t nms);
  14. void delay_us(uint32_t nus);
  15. void Delay_us(uint32_t nus);
  16. void Delay_ms(uint16_t nms);
  17. void delay_Xms(uint16_t nms,uint8_t Cnt);
  18. #endif /* INC_BSP_delay_H_ */
复制代码
回复 支持 1 反对 0

使用道具 举报

109

主题

5564

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
10572
金钱
10572
注册时间
2017-2-18
在线时间
1914 小时
发表于 2020-11-23 11:03:00 | 显示全部楼层
谢谢分享~
回复 支持 反对

使用道具 举报

8

主题

51

帖子

0

精华

初级会员

Rank: 2

积分
192
金钱
192
注册时间
2013-3-19
在线时间
32 小时
发表于 2020-12-10 10:39:44 | 显示全部楼层
请问一下,我如果是负温度,和保留小数点后2位,该怎么操作啊!谢谢
有缘千里来相会,无缘对面不相识。
回复 支持 反对

使用道具 举报

53

主题

567

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2107
金钱
2107
注册时间
2017-2-11
在线时间
307 小时
 楼主| 发表于 2020-12-10 15:28:12 | 显示全部楼层
瞎扯蛋 发表于 2020-12-10 10:39
请问一下,我如果是负温度,和保留小数点后2位,该怎么操作啊!谢谢

微信截图_20201210152603.jpg

这样就行
回复 支持 反对

使用道具 举报

8

主题

51

帖子

0

精华

初级会员

Rank: 2

积分
192
金钱
192
注册时间
2013-3-19
在线时间
32 小时
发表于 2020-12-11 13:50:37 | 显示全部楼层

好的,非常感谢
有缘千里来相会,无缘对面不相识。
回复 支持 反对

使用道具 举报

53

主题

567

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2107
金钱
2107
注册时间
2017-2-11
在线时间
307 小时
 楼主| 发表于 2020-12-13 17:52:47 | 显示全部楼层
关于SHTX系列的文件
https://www.sensirion.com/cn/download-center/
该网站  都有PDF文档,很齐全。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-18 19:57

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表