查看: 1414|回复: 6

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

[复制链接]
  • TA的每日心情
    奋斗
    昨天 10:03
  • 签到天数: 1999 天

    连续签到: 23 天

    [LV.Master]伴坛终老

    发表于 2024-3-20 23:57:03 | 显示全部楼层 |阅读模式
    分享到:
    本帖最后由 流水源 于 2024-3-21 00:00 编辑

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

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

    下面添加SHTC3的驱动代码:
    10.png


    驱动是之前写好的,基于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的初始化和读取温湿度函数。
    13.png

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

    15.png

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






    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    前天 10:54
  • 签到天数: 186 天

    连续签到: 2 天

    [LV.7]常住居民III

    发表于 2024-3-21 11:33:30 | 显示全部楼层
    继续给大佬捧场
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    昨天 10:03
  • 签到天数: 1999 天

    连续签到: 23 天

    [LV.Master]伴坛终老

     楼主| 发表于 2024-3-21 23:11:43 | 显示全部楼层
    stm1024 发表于 2024-3-21 11:33
    继续给大佬捧场

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

    使用道具 举报

  • TA的每日心情
    开心
    昨天 08:14
  • 签到天数: 332 天

    连续签到: 22 天

    [LV.8]以坛为家I

    发表于 2024-3-24 22:39:13 | 显示全部楼层
    66666版主大石利害了
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    昨天 10:03
  • 签到天数: 1999 天

    连续签到: 23 天

    [LV.Master]伴坛终老

     楼主| 发表于 2024-3-24 23:03:57 | 显示全部楼层

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

    使用道具 举报

  • TA的每日心情
    开心
    昨天 08:14
  • 签到天数: 332 天

    连续签到: 22 天

    [LV.8]以坛为家I

    发表于 2024-3-24 23:06:44 | 显示全部楼层
    我想知道,版主大佬是怎么解决屏的触摸IC与温湿度计的地址冲突问题了,除非把触摸屏拆下来。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    昨天 10:03
  • 签到天数: 1999 天

    连续签到: 23 天

    [LV.Master]伴坛终老

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

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

    使用道具 举报

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

    本版积分规则

    关闭

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

    手机版|小黑屋|与非网

    GMT+8, 2024-12-24 07:08 , Processed in 0.198694 second(s), 28 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.