6回答

0收藏

[评测分享] 【STM32H735-DK 测评】+ 基于I2C接口的温湿度传感器SHTC3测试

#板卡评测 #板卡评测 2409 人阅读 | 6 人回复 | 2024-03-20

本帖最后由 流水源 于 2024-3-21 00:00 编辑

首先添加SHTC3的驱动,使用I2C接口,通过arduino接口插在开发板上。


arduino接口的I2C使用的是stm32h735的I2C4外设。


下面添加SHTC3的驱动代码:



驱动是之前写好的,基于I2C接口的读写,根据SHTC3的数据手册读写寄存器。代码如下。
  1. #include "drv_shtc3.h"

  2. extern I2C_HandleTypeDef hi2c4;

  3. uint8_t I2C_Write(uint8_t index,uint8_t dev_addr, uint16_t cmd,uint32_t len,uint8_t *str,uint32_t num)   
  4. {
  5.     HAL_StatusTypeDef status = HAL_OK;

  6.     status = HAL_I2C_Mem_Write(&hi2c4, dev_addr<<1, cmd, I2C_MEMADD_SIZE_16BIT, str, num, 1000);

  7.     return status;
  8. }

  9. uint8_t I2C_Read(uint8_t index,uint8_t dev_addr, uint16_t cmd,uint32_t len,uint8_t *str,uint32_t num)
  10. {
  11.     HAL_StatusTypeDef status = HAL_OK;

  12.     status = HAL_I2C_Mem_Read(&hi2c4, dev_addr<<1, cmd, I2C_MEMADD_SIZE_16BIT, str, num, 1000);
  13.    
  14.     return status;
  15. }

  16. void shtc3_gpio_init(void)
  17. {

  18. }

  19. void SHTC3_WriteCmd(uint16_t cmd)
  20. {
  21.     uint8_t cbuf[2];
  22.     cbuf[0]=cmd>>8;
  23.     cbuf[1]=cmd&0xff;
  24.     I2C_Write(0,SHTC3_ADDRESS,cmd,2,cbuf,0);
  25. }

  26. void SHTC3_ReadData(uint16_t cmd,uint8_t *buff,uint32_t len)
  27. {
  28.     uint8_t cbuf[2];
  29.     cbuf[0]=cmd>>8;
  30.     cbuf[1]=cmd&0xff;
  31.     I2C_Read(0,SHTC3_ADDRESS,cmd,2,buff,len);
  32. }

  33. int SHTC3_CalcTemperature(uint16_t rawValue)
  34. {
  35.   // calculate temperature
  36.   // T = -45 + 175 * rawValue / 2^16
  37.   return (((175*1 * rawValue)>>16) - 45*1);   //·??ó100±?
  38. }

  39. int SHTC3_CalcHumidity(uint16_t rawValue)
  40. {
  41.   // calculate relative humidity
  42.   // RH = rawValue / 2^16 * 100
  43.   return ((100 * 1 * rawValue)>>16);   //·??ó100±?
  44. }

  45. static uint8_t SHTC3_CheckCRC(uint8_t *buff, uint32_t nbyte)
  46. {
  47.     uint32_t i;            // byte counter   
  48.     uint8_t  bit;          // bit mask
  49.     uint8_t  crc = 0xFF;   // calculated checksum

  50.     // calculates 8-Bit checksum with given polynomial
  51.     for(i = 0; i < nbyte; i++)
  52.     {
  53.         crc ^= (buff[i]);
  54.         for(bit = 8; bit > 0; --bit)
  55.         {
  56.             if(crc & 0x80) {
  57.                 crc = (crc << 1) ^ SHTC3_CRC_POLYNOMIAL;
  58.             } else {
  59.                 crc = (crc << 1);
  60.             }
  61.         }
  62.     }
  63.     return crc;
  64. }


  65. uint16_t shtc3_id;
  66. uint16_t SHTC3_Init(void)
  67. {
  68.     uint8_t buff[4]={0};
  69.     shtc3_id = 0;
  70.     shtc3_gpio_init();
  71.    
  72.     HAL_Delay(1);
  73.     SHTC3_ReadData(SHTC3_REG_ID,buff,3);
  74.     if(buff[2] != SHTC3_CheckCRC(buff,2))
  75.     {
  76.         return -1;
  77.     }
  78.     HAL_Delay(10);
  79.     SHTC3_WriteCmd(SHTC3_REG_WAKEUP);
  80.     shtc3_id = (buff[0]<<8)|buff[1];
  81.     return shtc3_id;
  82. }

  83. uint8_t SHTC3_GetMode1_TempRH(int *temp, int *humi)
  84. {
  85.     uint8_t buff[8]={0};
  86.    
  87.     SHTC3_ReadData(SHTC3_REG_CELPM_TEMP_RH,buff,6);
  88.     if((buff[2] != SHTC3_CheckCRC(buff,2))||(buff[5] != SHTC3_CheckCRC(&buff[3],2)))
  89.     {
  90.         return 1;
  91.     }
  92.     *temp = SHTC3_CalcTemperature((buff[0]<<8)|buff[1]);
  93.     *humi = SHTC3_CalcHumidity((buff[3]<<8)|buff[4]);
  94.     return 0;
  95. }

复制代码
然后在main函数中调用shtc3的初始化和读取温湿度函数。


编译下载之后就可以看到输出的温湿度值了。可以看到串口输出值在哈了一口气后,湿度瞬间上升了。




游客,如果您要查看本帖隐藏内容请回复






分享到:
回复

使用道具 举报

回答|共 6 个

倒序浏览

沙发

stm1024

发表于 2024-3-21 11:33:30 | 只看该作者

继续给大佬捧场
回复 支持 反对

使用道具 举报

板凳

流水源

发表于 2024-3-21 23:11:43 | 只看该作者

stm1024 发表于 2024-3-21 11:33
继续给大佬捧场

感谢大佬捧场
回复 支持 反对

使用道具 举报

地板

eefocus_3914144

发表于 2024-3-24 22:39:13 | 只看该作者

66666版主大石利害了
回复 支持 反对

使用道具 举报

5#

流水源

发表于 2024-3-24 23:03:57 | 只看该作者


感谢大佬捧场
回复 支持 反对

使用道具 举报

6#

eefocus_3914144

发表于 2024-3-24 23:06:44 | 只看该作者

我想知道,版主大佬是怎么解决屏的触摸IC与温湿度计的地址冲突问题了,除非把触摸屏拆下来。
回复 支持 反对

使用道具 举报

7#

流水源

发表于 2024-3-25 09:14:15 | 只看该作者

eefocus_3914144 发表于 2024-3-24 23:06
我想知道,版主大佬是怎么解决屏的触摸IC与温湿度计的地址冲突问题了,除非把触摸屏拆下来。 ...

我看了一下:
传感器SHTC3_ADDRESS: 7bit     (0x70)   
触摸屏地址:7bit应该是 0x38
2个不一样的。
代码里面触摸屏地址写的0x70是因为左移了一位。而我写SHTC3时在I2C读写的时候左移的地址。

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条