Yang.Lian
发表于 2024-5-31 08:52:31
已经使用过了,没有问题,可以使用,
非常感谢,省了不少时间
karlman
发表于 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; 然后在子程序void SHT30_DataRead(void)里又定义了一个uchar temporary; 每次先把温度或者湿度的值从read_sht_data[]送到temporary[]里再进行计算,为什么不直接对read_sht_data[]进行计算?u8和uchar应该都是8位int吧?只要在子程序内定义一个局部变量数组就行了吧?
4.我在监控SHT输出数据的时候发现一个有趣的现象,每当IIC总线读一次正确的温湿度数据,下一循环读出的6个字节数据必定全是0xff,再下一循环又是正确的数据。我想这就是需要计算CRC的原因吧,可为什么会这样呢?
希望版主能有空回复一下,也希望大家都能讨论一下,为我解惑。
karlman
发表于 2024-6-5 21:54:08
本帖最后由 karlman 于 2024-6-5 22:16 编辑
在冰柜里试验了一下,又发现一个问题,SHT30_temperature不能定义成u16类型,要定义成signed int,这样才能正确显示零下的温度。
最终我把这个子程序修改为:
signed int SHT30_temperature;
u16 SHT30_humidity;
//========================================================================
// 函数: void SHT30_DataRead(void)
// 描述: 温湿度数据读取
// 参数:
// 返回: none.
// 版本: VER1.0
// 日期: 2022-15-5
// 备注:
//========================================================================
void SHT30_DataRead(void)
{
u8 read_sht_data; //数据读取缓存
unsigned long intData_convert; //用于数据转换
uchar crc_result; //用于CRC校验结果存放,为判断数据准确性做准备
IIC_ReadNbyte_16bitAddr(SHT30_Slave,0xE000,read_sht_data,6); //读出数据放入缓存数组等待处理>>T高八位>>T低八位>>温度T的CRC校验位>>H高八位>>H低八位>>湿度H的CRC校验位
crc_result=SHT30_CRC8_Check(read_sht_data,2,read_sht_data); //crc校验,crc校验要是不成功就返回1,
//同时不会更新温度值
if(crc_result==0)
{
Data_convert=(read_sht_data << 8) | read_sht_data;//把2个8位数据拼接为一个16位的数据
//温度转换,将16位温度数据转化为10进制的温度数据,
//这里保留了一位小数,SHT30_temperature这是一个全局变量,
//计算温度值(uchar强制转换,数据在超过八位范围后会丢失)
SHT30_temperature = (signed int)(1750 *Data_convert / 65535 - 450);
}
//crc校验
crc_result=SHT30_CRC8_Check(&read_sht_data,2,read_sht_data); //crc校验,crc校验要是不成功就返回1,
//同时不会更新湿度值
if(crc_result==0)
{
Data_convert=(read_sht_data << 8) | read_sht_data; //把2个8位数据拼接为一个16位的数据
//湿度转换,将16位湿度数据转化为10进制的湿度数据,
//这里保留了一位小数,SHT30_humidity这是一个全局变量,
//计算湿度值(uchar强制转换,数据在超过八位范围后会丢失)
SHT30_humidity = Data_convert / 65.535;
}
}
niurom
发表于 2024-7-8 07:16:00
感谢分享,学习学习
sdf15937
发表于 2024-7-21 13:42:05
照抄了,没成功
主要是想搞一下SHT20的,据说这两个芯片就是读取地址不同……但是我愣是读取不出来
jackfangxq
发表于 2024-7-25 17:45:15
{:4_174:}
tingyu8675
发表于 2024-7-26 08:08:43
开始学习STC8中~~
fengye1512
发表于 2024-9-11 16:18:52
学习了
Oscar
发表于 2024-10-23 09:15:48
CV工程师表示疑惑
gufeng
发表于 2024-12-9 18:13:37
<p>很好的教程,要好好看看。</p>