OpenEdv-开源电子网

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

基于stm32f103vet6的SHT30温湿度检测 LCD1602显示以及串口输出

[复制链接]

2

主题

2

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2019-2-21
在线时间
7 小时
发表于 2019-2-21 15:24:49 | 显示全部楼层 |阅读模式
直接上程序!实测可用!

微信图片_20190221152337.jpg


SHT30温湿度检测 LCD1602显示 LV上位机.zip (3.14 MB, 下载次数: 3312)
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

109

主题

5564

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
10569
金钱
10569
注册时间
2017-2-18
在线时间
1913 小时
发表于 2019-2-21 15:41:25 | 显示全部楼层
回复 支持 反对

使用道具 举报

13

主题

633

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1331
金钱
1331
注册时间
2016-8-1
在线时间
229 小时
发表于 2019-2-21 16:47:37 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

0

主题

23

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
239
金钱
239
注册时间
2018-2-28
在线时间
76 小时
发表于 2019-3-5 08:49:59 | 显示全部楼层
学习了
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
4
金钱
4
注册时间
2019-3-27
在线时间
1 小时
发表于 2019-4-3 18:20:16 来自手机 | 显示全部楼层
引脚怎么连的
回复 支持 反对

使用道具 举报

1

主题

56

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
264
金钱
264
注册时间
2017-10-11
在线时间
79 小时
发表于 2019-4-4 14:51:14 | 显示全部楼层
多谢分享
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2019-5-7
在线时间
3 小时
发表于 2019-5-12 15:09:19 | 显示全部楼层
感谢大佬
回复 支持 反对

使用道具 举报

0

主题

6

帖子

0

精华

新手入门

积分
7
金钱
7
注册时间
2019-5-25
在线时间
0 小时
发表于 2019-5-25 14:48:42 | 显示全部楼层
大佬有DHT11和BMP180的吗,能分享下吗
有偿回复467094853@qq.com
毕设难做
感谢
回复 支持 反对

使用道具 举报

3

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
111
金钱
111
注册时间
2019-5-21
在线时间
24 小时
发表于 2019-6-9 02:02:02 | 显示全部楼层
老哥,我可以问一下为什么精英版烧进去lcd不显示呢
回复 支持 反对

使用道具 举报

10

主题

80

帖子

0

精华

高级会员

Rank: 4

积分
514
金钱
514
注册时间
2017-5-21
在线时间
82 小时
发表于 2019-7-16 10:04:43 | 显示全部楼层
楼主,SHT30为啥读取一次温度和湿度,后要加delay?不加一直显示130!!!!!    Sht30_ReadData();
    Convert_sht30();
    delay_ms(5);

回复 支持 反对

使用道具 举报

10

主题

80

帖子

0

精华

高级会员

Rank: 4

积分
514
金钱
514
注册时间
2017-5-21
在线时间
82 小时
发表于 2019-7-16 21:58:32 | 显示全部楼层
本帖最后由 Anyint 于 2019-7-16 22:48 编辑
  1. /**
  2.   * @brief  SHT30读数据
  3.   * @param  None
  4.   * @retval None
  5.   */
  6. void Sht30_ReadData(void)
  7. {           
  8.     u8 crc_result;
  9.     u16 data;
  10.     u8 Buff1[3],Buff2[3];
  11.     Sht30_WriteCmd(0x21,0x26);        //数据采集频率1 m/s
  12.     i2c_Start();//起始信号
  13.     i2c_SendByte(0x88+1); //发送设备地址+读信号
  14.     while (i2c_WaitAck());//CPU产生一个时钟,并读取器件的ACK应答信号
  15.     Buff1[0]=i2c_ReadByte();//读取温度高八位并且发送一个ack
  16.     i2c_Ack();
  17.     Buff1[1]=i2c_ReadByte(); //低八位
  18.     i2c_Ack();
  19.     Buff1[2]=i2c_ReadByte(); //校验位发送ACK8位
  20.     i2c_Ack();
  21.     Buff2[0] = i2c_ReadByte();  //湿度发送ACK高8位
  22.     i2c_Ack();
  23.     Buff2[1] = i2c_ReadByte();  //湿度低八位
  24.     i2c_Ack();
  25.     Buff2[2] = i2c_ReadByte();  //校验位之后发送nack具体见数据手册
  26.     i2c_NAck();
  27.     i2c_Stop();  // CPU发起I2C总线停止信号        
  28.     //delay_ms(5);
  29.    
  30.     crc_result=sht30_crc8_check(Buff1,2,Buff1[2]);
  31.     if(crc_result==0)
  32.     {
  33.         //把2个8位数据拼接为一个16位的数据
  34.         data=((u16)Buff1[0] << 8) | Buff1[1];
  35.         //温度转换,将16位温度数据转化为10进制的温度数据,这里保留了一位小数,data_process.SHT30_temperature这是一个全局变量,至于为什么变量名字里面有个.不懂得各位可以百度一下c语言结构体的相关说明。
  36.         Temperature = (float)175*(data)/65535-45;
  37.     }
  38.     crc_result=sht30_crc8_check(Buff2,2,Buff2[2]);
  39.     if(crc_result==0)
  40.     {
  41.         //把2个8位数据拼接为一个16位的数据
  42.         data=((u16)Buff2[0] << 8) | Buff2[1];
  43.         //温度转换,将16位温度数据转化为10进制的温度数据,这里保留了一位小数,data_process.SHT30_temperature这是一个全局变量,至于为什么变量名字里面有个.不懂得各位可以百度一下c语言结构体的相关说明。
  44.         Humidity = (float)100*(data)/65535;
  45.     }
  46. }        
复制代码

  1. int  crc8_compute(u8 *check_data, u8 num_of_data)
  2. {
  3.          uint8_t bit;        // bit mask
  4. uint8_t crc = 0xFF; // calculated checksum
  5. uint8_t byteCtr;    // byte counter

  6. // calculates 8-Bit checksum with given polynomial
  7. for(byteCtr = 0; byteCtr < num_of_data; byteCtr++) {
  8.      crc ^= (check_data[byteCtr]);
  9.          //crc校验,最高位是1就^0x31
  10.      for(bit = 8; bit > 0; --bit) {
  11.          if(crc & 0x80) {
  12.              crc = (crc << 1) ^ 0x31;
  13.          }  else {
  14.              crc = (crc << 1);
  15.          }
  16.      }
  17. }
  18. return crc;
  19. }
  20. int sht30_crc8_check(u8 *p,u8 num_of_data,u8 CrcData)
  21. {
  22.   uint8_t crc;
  23.   crc = crc8_compute(p, num_of_data);// calculates 8-Bit checksum
  24. if(crc != CrcData)
  25. {   
  26.      return 1;           
  27. }
  28. return 0;
  29. }
复制代码



楼主我后来改了一下,你的读取代码,我发现缺少一个CRC校验,有了CRC校验的话,这样读取的数据就会稳定,这个SHT30传感器它好像读取速度不是很快,看了很多帖子,发现如果读的太快的话,它寄存器的值就会有问题,具体现象:我这边的精英板温度显示130,如果在读取的时候不加delay,一直都是这个值。所以我认为缺少了校验的过程,校验是去除那些错误的值,那么显示就是正确的。楼主的代码读取速度很快,在加个CRC校验也是很快的,所以能满足实时读取温度的要求,其次能保证数据的瞬间读取(隔开多久读一次没关系,最重要的是读一次的时间不能出现明显的大delay)。再次感谢楼主的代码,稳!
补充:之前分析那个读取数据一直显示130,就是说BUFF1 和 BUFF2 都是0xff,带入楼主的代码的计算公式,那么温度就显示130℃了,湿度显示100%。。。,网上又搜索一遍后,发现是SDA的锅,在读取BUFF之前要拉高SDA,解决地址:http://www.openedv.com/forum.php?mod=viewthread&tid=273662

更新代码:
EEPROM_I2C_SDA_1();//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!一定要在地址后应答后面拉高SDA    请注意这一行代码
  1. /**
  2.   * @brief  SHT30读数据
  3.   * @param  None
  4.   * @retval None
  5.   */
  6. int Sht30_ReadData(float *t,float *h)
  7. {           
  8.     u8 crc_result;
  9.     u16 data;
  10.     u8 Buff1[3],Buff2[3];
  11.     Sht30_WriteCmd(0x21,0x26);        //数据采集频率1 m/s
  12.     i2c_Start();//起始信号
  13.     i2c_SendByte(0x88+1); //发送设备地址+读信号
  14.     while (i2c_WaitAck());//CPU产生一个时钟,并读取器件的ACK应答信号
  15.     EEPROM_I2C_SDA_1();//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!一定要在地址后应答后面拉高SDA
  16.     Buff1[0]=i2c_ReadByte();//读取温度高八位并且发送一个ack
  17.     i2c_Ack();
  18.     Buff1[1]=i2c_ReadByte(); //低八位
  19.     i2c_Ack();
  20.     Buff1[2]=i2c_ReadByte(); //校验位发送ACK8位
  21.     i2c_Ack();
  22.     Buff2[0] = i2c_ReadByte();  //湿度发送ACK高8位
  23.     i2c_Ack();
  24.     Buff2[1] = i2c_ReadByte();  //湿度低八位
  25.     i2c_Ack();
  26.     Buff2[2] = i2c_ReadByte();  //校验位之后发送nack具体见数据手册
  27.     i2c_NAck();
  28.     i2c_Stop();  // CPU发起I2C总线停止信号        
  29.     //delay_ms(5);
  30.    
  31.     crc_result=sht30_crc8_check(Buff1,2,Buff1[2]);
  32.     if(crc_result==0)
  33.     {
  34.         //把2个8位数据拼接为一个16位的数据
  35.         data=((u16)Buff1[0] << 8) | Buff1[1];
  36.         //温度转换,将16位温度数据转化为10进制的温度数据,这里保留了一位小数,data_process.SHT30_temperature这是一个全局变量,至于为什么变量名字里面有个.不懂得各位可以百度一下c语言结构体的相关说明。
  37.         *t = (float)175*(data)/65535-45;
  38.     }
  39.     else
  40.         return 1;
  41.     crc_result=sht30_crc8_check(Buff2,2,Buff2[2]);
  42.     if(crc_result==0)
  43.     {
  44.         //把2个8位数据拼接为一个16位的数据
  45.         data=((u16)Buff2[0] << 8) | Buff2[1];
  46.         //温度转换,将16位温度数据转化为10进制的温度数据,这里保留了一位小数,data_process.SHT30_temperature这是一个全局变量,至于为什么变量名字里面有个.不懂得各位可以百度一下c语言结构体的相关说明。
  47.         *h = (float)100*(data)/65535;
  48.         return 0;
  49.     }
  50.     else
  51.         return 1;
  52. }
复制代码
再次补充:发现一个神奇的事情,在while死循环中,我要读取温度数据,又要发串口的时候,这个要屏蔽这句代码:EEPROM_I2C_SDA_1();,这样才可以便显示温度便发串口,不然就会出现温度又是130的情况,这真的有点不明白了,如果你要不屏蔽这句代码的话,那么你发串口的前提条件就是CRC校验一定要成功的时候才能发串口数据,代码如下:
  1.                 if(!Sht30_ReadData(&Temperature,&Humidity)){
  2.    
  3.         printf("t:%.2fC h:%.0f%%RH\r\n",Temperature,Humidity);}
复制代码



回复 支持 反对

使用道具 举报

8

主题

34

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
271
金钱
271
注册时间
2019-7-19
在线时间
62 小时
发表于 2019-7-28 18:08:50 | 显示全部楼层
谢谢大佬!
回复 支持 反对

使用道具 举报

0

主题

5

帖子

0

精华

新手入门

积分
7
金钱
7
注册时间
2019-11-14
在线时间
0 小时
发表于 2019-11-17 11:16:20 | 显示全部楼层
感谢楼主分享!
回复 支持 反对

使用道具 举报

0

主题

98

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
347
金钱
347
注册时间
2018-3-20
在线时间
75 小时
发表于 2020-9-25 10:32:15 | 显示全部楼层
感谢楼主分享
回复 支持 反对

使用道具 举报

1

主题

4

帖子

0

精华

初级会员

Rank: 2

积分
55
金钱
55
注册时间
2020-6-24
在线时间
20 小时
发表于 2020-10-19 08:57:41 | 显示全部楼层
Anyint 发表于 2019-7-16 10:04
楼主,SHT30为啥读取一次温度和湿度,后要加delay?不加一直显示130!!!!!    Sht30_ReadData();
     ...

为什么我加了延迟还是温度显示130,湿度100,感觉i2c通讯没有通
回复 支持 反对

使用道具 举报

0

主题

6

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2021-2-9
在线时间
2 小时
发表于 2021-2-10 11:28:51 | 显示全部楼层
不错,瞧瞧
回复 支持 反对

使用道具 举报

10

主题

68

帖子

0

精华

初级会员

Rank: 2

积分
141
金钱
141
注册时间
2013-5-6
在线时间
3 小时
发表于 2021-4-28 11:49:40 | 显示全部楼层
stm32f103vet6现在价格多少?你们知道吗?据说要六,七十元了!涨疯了。
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
4
金钱
4
注册时间
2020-11-29
在线时间
4 小时
发表于 2021-4-30 09:55:37 | 显示全部楼层
请教大佬,为什么我的SDA一直是高电平呢?
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-24 19:42

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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