找回密码
 立即注册
楼主: 电子D***

SHT30温湿度传感器, 硬件I2C接口, STC驱动教程系列

[复制链接]
  • TA的每日心情

    20 小时前
  • 签到天数: 47 天

    [LV.5]常住居民I

    0

    主题

    16

    回帖

    232

    积分

    中级会员

    积分
    232
    发表于 2024-4-27 12:56:55 | 显示全部楼层
    回复 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    12 小时前
  • 签到天数: 54 天

    [LV.5]常住居民I

    0

    主题

    23

    回帖

    102

    积分

    注册会员

    积分
    102
    发表于 2024-4-30 16:25:28 | 显示全部楼层
    感谢分享,学习学习
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    6 天前
  • 签到天数: 9 天

    [LV.3]偶尔看看II

    1

    主题

    19

    回帖

    103

    积分

    注册会员

    积分
    103
    发表于 2024-5-5 00:28:07 | 显示全部楼层
    IIC_ReadNbyte_16bitAddr(GXHT30_Slave,0XE000,read_sht_data,6);
    0XE000c从哪里来的,我看规格书并没有写到这个寄存器
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    2024-6-6 15:42
  • 签到天数: 9 天

    [LV.3]偶尔看看II

    1

    主题

    51

    回帖

    215

    积分

    中级会员

    积分
    215
    发表于 2024-5-31 08:52:31 | 显示全部楼层
    已经使用过了,没有问题,可以使用,
    非常感谢,省了不少时间
    希望这个世界让我装一次B
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    无聊
    昨天 11:28
  • 签到天数: 21 天

    [LV.4]偶尔看看III

    2

    主题

    14

    回帖

    168

    积分

    注册会员

    积分
    168
    发表于 2024-6-5 15:55:54 | 显示全部楼层
    本帖最后由 karlman 于 2024-6-5 22:08 编辑

    我这几天用STC8G1K17A和SHT31测试了一下,本人新手有不少搞不明白的地方,修改了几个地方总算能在OLED上显示出正确的结果了,但是有几个疑问希望楼主能不吝赐教。
    1.关于湿度的计算,按楼主的代码总是得不到正确的湿度值,这行代码  SHT30_humidity = (uint)((100.0 * (float)(0x7fff&Data_convert) / 65535.0) *10.0);
    我不知道0x7fff&Data_convert这步计算是为了什么,我监控了一下读出的湿度数据,比如高位是0xB8,低位是0xED,合起来Data_conver的值是0xB8ED,除以65535是0.722377,湿度是72.2%。可按楼主的式子,0xB8ED被抹去了最高位的1变成了0x38ED,最终显示的湿度是22.2%。我这一行直接改成了SHT30_humidity = Data_convert / 65.535; 得到了正确的读数。
    2.关于温度的计算,这一行SHT30_temperature = (uint)((175.0 * (float)(0x7fff&Data_convert) / 65535.0 - 45.0) *10.0);里的0x7fff&Data_convert同样让我疑惑,当然我们平常环境的温度不高,Data_convert最高位通常是0,这个式子在室温下能输出正常的结果,但如果温度是负数的时候呢?
    3.在接收SHT30数据的时候,楼主定义了一个全局变量u8 read_sht_data[6]; 然后在子程序void SHT30_DataRead(void)里又定义了一个uchar temporary[3]; 每次先把温度或者湿度的值从read_sht_data[]送到temporary[]里再进行计算,为什么不直接对read_sht_data[]进行计算?u8和uchar应该都是8位int吧?只要在子程序内定义一个局部变量数组就行了吧?
    4.我在监控SHT输出数据的时候发现一个有趣的现象,每当IIC总线读一次正确的温湿度数据,下一循环读出的6个字节数据必定全是0xff,再下一循环又是正确的数据。我想这就是需要计算CRC的原因吧,可为什么会这样呢?
    希望版主能有空回复一下,也希望大家都能讨论一下,为我解惑。
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    无聊
    昨天 11:28
  • 签到天数: 21 天

    [LV.4]偶尔看看III

    2

    主题

    14

    回帖

    168

    积分

    注册会员

    积分
    168
    发表于 2024-6-5 21:54:08 | 显示全部楼层
    本帖最后由 karlman 于 2024-6-5 22:16 编辑

    在冰柜里试验了一下,又发现一个问题,SHT30_temperature不能定义成u16类型,要定义成signed int,这样才能正确显示零下的温度。

    最终我把这个子程序修改为:
    1. signed int SHT30_temperature;
    2. u16 SHT30_humidity;
    3. //========================================================================
    4. // 函数: void SHT30_DataRead(void)
    5. // 描述: 温湿度数据读取
    6. // 参数:
    7. // 返回: none.
    8. // 版本: VER1.0
    9. // 日期: 2022-15-5
    10. // 备注:
    11. //========================================================================
    12. void SHT30_DataRead(void)
    13. {
    14.                 u8 read_sht_data[6];                       //数据读取缓存
    15.     unsigned long int  Data_convert;           //用于数据转换
    16.     uchar crc_result;             //用于CRC校验结果存放,为判断数据准确性做准备
    17.         
    18.     IIC_ReadNbyte_16bitAddr(SHT30_Slave,0xE000,read_sht_data,6);   //读出数据放入缓存数组等待处理>>T高八位>>T低八位>>温度T的CRC校验位>>H高八位>>H低八位>>湿度H的CRC校验位
    19.          
    20.     crc_result=SHT30_CRC8_Check(read_sht_data,2,read_sht_data[2]);         //crc校验,crc校验要是不成功就返回1,
    21.                                                                  //同时不会更新温度值
    22.     if(crc_result==0)  
    23.     {
    24.         Data_convert=(read_sht_data[0] << 8) | read_sht_data[1];  //把2个8位数据拼接为一个16位的数据
    25.         //温度转换,将16位温度数据转化为10进制的温度数据,
    26.         //这里保留了一位小数,SHT30_temperature这是一个全局变量,
    27.         //计算温度值(uchar强制转换,数据在超过八位范围后会丢失)
    28.       SHT30_temperature = (signed int)(1750 *Data_convert / 65535 - 450);
    29.     }
    30.    
    31.     //crc校验
    32.     crc_result=SHT30_CRC8_Check(&read_sht_data[3],2,read_sht_data[5]);   //crc校验,crc校验要是不成功就返回1,
    33.                                                                  //同时不会更新湿度值
    34.           if(crc_result==0)
    35.     {
    36.         Data_convert=(read_sht_data[3] << 8) | read_sht_data[4]; //把2个8位数据拼接为一个16位的数据
    37.         //湿度转换,将16位湿度数据转化为10进制的湿度数据,
    38.         //这里保留了一位小数,SHT30_humidity这是一个全局变量,
    39.         //计算湿度值(uchar强制转换,数据在超过八位范围后会丢失)
    40.        SHT30_humidity = Data_convert / 65.535;
    41.     }  
    42. }
    复制代码


    回复 支持 反对 送花

    使用道具 举报

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

    本版积分规则

    QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

    GMT+8, 2024-6-18 20:22 , Processed in 0.063495 second(s), 48 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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