你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

基于stm32f103的SHT30温湿度显示

[复制链接]
STMCU小助手 发布时间:2022-10-26 22:11
基于stm32f103的SHT30温湿度显示
本次分享的是基于STM32F103C8T6单片机型号和SHT30温湿度传感器以及TFT(3.5)屏的温湿度显示实验
本实验使用的TFT彩色屏的驱动程序由商家提供,我们只需要按照自己显示的形式进行相应的设置进行了。同时SHT30程序部分借鉴了这位博主的分享(表示感谢)

一、硬件材料

LH@)J_7B42Y~BZRVP$T)L@T.png

1.stm32f10c8t6

29a7d20b030a445db701b825d8de0c54.png

2.sht30温湿度传感器

16a4f4830bb94ff2916c6d4a46e494fc.png

3.TFT(3.5)寸屏

20a08f944ef849a5a32adb592dc5b2d3.png

二、SHT30介绍

sht30为4引脚IIC控制传感器,这里就不详细说这个模块了,知道怎么用就行了,和DHT11温湿度模块差不多。

sht30.h

  1. #ifndef _SH30_H
  2. #define _SH30_H

  3. #include "delay.h"
  4. #include "sys.h"
  5. #include "stdio.h"
  6. #include "usart.h"
  7. #include "string.h"

  8. extern u8 humiture_buff1[20];

  9. void SHT30_Init(void);
  10. void IIC_ACK(void);//确认字符,表示发来的数据已经确认接收无误
  11. void IIC_NACK(void);//无确认字符,表示数据接收有误或者还未接收完成
  12. u8 IIC_wait_ACK(void);//等待接收确认字符
  13. void IIC_Start(void);//等待IIC传输数据开始
  14. void IIC_Stop(void);//IIC传输数据停止
  15. void IIC_SendByte(u8 byte);//IIC发送数据
  16. u8 IIC_RcvByte(void);//IIC接收数据
  17. void SHT30_read_result(u8 addr);//SHT30温湿度传感器开始读取数据
  18. #endif
复制代码

sht30.c

  1. /*
  2. 设定温度阈值范围:-20℃——125℃
  3. 设定相对湿度范围:0%——100%
  4. */
  5. #include"stm32f10x.h"
  6. #include"sh30.h"
  7. #include"stdio.h"

  8. #define write 0 //IIC设备地址一般是7位,也有10位,本程序使用7位IIC设备地址,第8位是写命令
  9. #define read  1 //IIC设备地址一般是7位,也有10位,本程序使用7位IIC设备地址,第8位是读命令

  10. //IIC总线接口定义
  11. #define SCL PBout(6)//设置时钟端口
  12. //SHT30数据SDA传输口,有输出也有输入,所以需配置它的输入和输出
  13. #define SDA_OUT PBout(7)//设置输出数据端口
  14. #define SDA_IN PBin(7)//设置输入数据端口
  15. //设置端口高8位的工作模式(具体可以参照端口位配置表),即I/O输入输出方向设置,先用与(&)对PB7引脚的四个位清0,再用或(|)置1
  16. #define IIC_INPUT_MODE_SET()  {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=8<<28;}//改变PB7对应位为1000(CNF[1:0]MODE[1:0]),设置成上拉或者下拉输入
  17. #define IIC_OUTPUT_MODE_SET() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=3<<28;}//改变PB7对应位为0011,设置成通用推挽输出
  18. //#define IIC_INPUT_MODE_SET()  {GPIOB->CRH&=0XFFFF0FFF;GPIOB->CRH|=8<<12;}//改变PB7对应位为1000(CNF[1:0]MODE[1:0]),设置成上拉或者下拉输入
  19. //#define IIC_OUTPUT_MODE_SET() {GPIOB->CRH&=0XFFFF0FFF;GPIOB->CRH|=3<<12;}//改变PB7对应位为0011,设置成通用推挽输出

  20. //定义温湿度存储变量
  21. u8 humiture_buff1[20];

  22. float Temperature=0;//定义存放温度拼接的变量Temperature,初始化温度为0
  23. float Humidity=0;//定义存放湿度拼接的变量Humidity,初始化湿度为0

  24. void SHT30_Init(void)//初始化SHT30的SCL与SDA接口
  25. {
  26.         GPIO_InitTypeDef GPIO_InitStructure;
  27.         RCC_APB2PeriphClockCmd(        RCC_APB2Periph_GPIOB, ENABLE );        
  28.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;//定于SCL连接到STM32的PB6引脚上,定于SDA_OUT/SDA_IN连接到STM32的PB7引脚上
  29.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;   //推挽输出
  30.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  31.         GPIO_Init(GPIOB, &GPIO_InitStructure);
  32.          SCL=1;//根据SHT30时序要求,默认时序是高电平(SDA拉低时,SCL跟着拉低,开始数据的传输)
  33.         SDA_OUT=1;//高电平还未开始数据的传输,拉低时开始数据的传输
  34. }        
  35. //主机发送确认字符ACK
  36. void IIC_ACK(void)//IIC协议,需要主机发送确认字符ACK来判断数据是否接收无误
  37. {
  38.   IIC_OUTPUT_MODE_SET();//配置PB7的SDA输出为推挽输出模式
  39.   SCL=0;
  40.   delay_us(2);
  41.   SDA_OUT=0;
  42.   delay_us(2);     
  43.   SCL=1;//数据接收完成之后,将SCL拉高,以便与后面主机发送ACK给从机
  44.   delay_us(2);                  
  45.   SCL=0;//数据接收完成,主机发送ACK                     
  46.   delay_us(1);   
  47. }
  48. //主机不发送确认字符ACK
  49. void IIC_NACK(void)//IIC协议,数据传输未完成或者数据传输有误,主机不发送确认字符ACK
  50. {
  51.   IIC_OUTPUT_MODE_SET();//配置PB7的SDA输出为推挽输出模式
  52.   SCL=0;
  53.   delay_us(2);
  54.   SDA_OUT=1;
  55.   delay_us(2);      
  56.   SCL=1;
  57.   delay_us(2);                  
  58.   SCL=0;                     
  59.   delay_us(1);   
  60. }
  61. //主机等待从机的确认字符ACK
  62. u8 IIC_wait_ACK(void)//主机等待从机发送ACK,从而判断数据是否接收完成
  63. {
  64.     u8 t = 200;
  65.     IIC_OUTPUT_MODE_SET();
  66.     SDA_OUT=1;//8位发送完后释放数据线,准备接收应答位
  67.     delay_us(1);
  68.     SCL=0;
  69.     delay_us(1);
  70.     IIC_INPUT_MODE_SET();
  71.     delay_us(1);
  72.     while(SDA_IN)//等待SHT30应答
  73.     {
  74.         t--;
  75.         delay_us(1);
  76.         if(t==0)
  77.         {
  78.           SCL=0;
  79.           return 1;
  80.         }
  81.         delay_us(1);
  82.     }
  83.     delay_us(1);      
  84.     SCL=1;
  85.     delay_us(1);
  86.     SCL=0;            
  87.     delay_us(1);   
  88.     return 0;        
  89. }
  90. //启动IIC总线进行通讯,发送IIC通讯的起始条件
  91. void IIC_Start(void)//启动IIC通讯
  92. {
  93.   IIC_OUTPUT_MODE_SET();//设置PB7的SDA为推挽输出
  94.   SDA_OUT=1;//根据SHT30时序,启动之前,SDA配置为高电平
  95.   SCL=1;//根据SHT30时序,启动之前,SCL配置为高电平
  96.   delay_us(4);//延时4us,给硬件一个反应时间
  97.   SDA_OUT=0;//SDA引脚拉低,开始数据的传输
  98.   delay_us(4);
  99.   SCL=0;//SCL拉低,与SDA对应,响应SDA数据的拉低,表示正式开始数据的传输
  100. }

  101. //结束IIC总线通讯,发送IIC通讯的结束条件
  102. void IIC_Stop(void)
  103. {
  104.         IIC_OUTPUT_MODE_SET();
  105.         SCL=0;//结束IIC通讯之前,查看SCL是否是拉低状态
  106.         SDA_OUT=0;//结束IIC通讯之前,查看SDA是否是拉低状态  
  107.         delay_us(4);        
  108.         SCL=1;//将时钟拉高,表示已经结束IIC通讯
  109.         delay_us(4);
  110.         SDA_OUT=1;//将数据传输引脚拉高,表示正式结束数据的传输
  111.         delay_us(4);
  112. }

  113. //将byte数据发送出去
  114. void  IIC_SendByte(u8 byte)
  115. {
  116.         u8  Count;
  117.         IIC_OUTPUT_MODE_SET();
  118.         SCL=0;//将时钟拉低,开始数据的传输
  119.         for(Count=0;Count<8;Count++)//要传送的数据长度为8位
  120.         {
  121.                 if(byte&0x80) SDA_OUT=1;//判断发送位,发送位为1,则还未发送数据
  122.                 else SDA_OUT=0; //判断发送位为0,则开始数据的发送
  123.                 byte<<=1;
  124.                 delay_us(2);
  125.                 SCL=1;
  126.                 delay_us(2);
  127.                 SCL=0;
  128.                 delay_us(2);
  129.         }
  130. }

  131. // 用来接收从器件传来的数据   
  132. u8 IIC_RcvByte(void)
  133. {
  134.   u8 retc;
  135.   u8 Count;
  136.   retc=0;
  137.   IIC_INPUT_MODE_SET();//配置数据线为输入方式
  138.   delay_us(1);                    
  139.   for(Count=0;Count<8;Count++)
  140.   {  
  141.         SCL=0;//配置时钟线为低,准备接收数据位
  142.         delay_us(2);               
  143.         SCL=1;//配置时钟线为高使数据线上数据有效               
  144.         retc=retc<<1;
  145.         if(SDA_IN) retc |=1;//读数据位,接收的数据位放入retc中
  146.         delay_us(1);
  147.   }
  148.   SCL=0;   
  149.   return(retc);
  150. }
  151. //用来接收从器件采集并合成温湿度
  152. void SHT30_read_result(u8 addr)
  153. {
  154.         //SHT30有两种读取数值的方法,分别是状态查询和数值查询,这里我使用的是数值查询,发送指令为0x2C06
  155.         u16 tem,hum;//定义存放温湿度计算公式的变量
  156.         u16 buff[6];//定义6个字节的数组,存放温度高、低八位,湿度高、低八位,两个字节的CRC校验位

  157.         //发送指令为0x2C06(默认)
  158.         IIC_Start();
  159.         IIC_SendByte(addr<<1 | write);//写7位I2C设备地址加0作为写取位,1为写取位
  160.         IIC_wait_ACK();
  161. //        delay_us(1);
  162.         IIC_SendByte(0x2C);//前半段发送指令为0x2C
  163.         IIC_wait_ACK();
  164. //        delay_us(1);
  165.         IIC_SendByte(0x06);//后半段发送指令为0x06
  166.         IIC_wait_ACK();
  167. //        delay_us(1);
  168.         IIC_Stop();
  169.         delay_ms(50);
  170.         IIC_Start();
  171.         IIC_SendByte(addr<<1 | read);//写7位I2C设备地址加1作为读取位,1为读取位
  172. //SHT30返回的数值是6个元素的数组
  173.         if(IIC_wait_ACK()==0)
  174.         {
  175. //          delay_us(1);
  176.                 buff[0]=IIC_RcvByte();//返回温度高8位
  177.                 IIC_ACK();
  178.                 buff[1]=IIC_RcvByte();//返回温度低8位
  179.                 IIC_ACK();
  180.                 buff[2]=IIC_RcvByte();//温度crc校验位
  181.                 IIC_ACK();
  182.                 buff[3]=IIC_RcvByte();//返回湿度高8位
  183.                 IIC_ACK();
  184.                 buff[4]=IIC_RcvByte();//返回湿度低8位
  185.                 IIC_ACK();
  186.                 buff[5]=IIC_RcvByte();//湿度crc校验位
  187.                 IIC_NACK();
  188.                 IIC_Stop();
  189.         }
  190. //        tem = (buff[0]<<8) + buff[1];
  191. //        hum = (buff[3]<<8) + buff[4];
  192.         tem = ((buff[0]<<8) | buff[1]);//将buff[0]采集到的温度8位数据与buff[1]采集到的低8位数据相或,实现温度拼接
  193.         hum = ((buff[3]<<8) | buff[4]);//将buff[3]采集到的湿度8位数据与buff[4]采集到的低8位数据相或,实现湿度拼接

  194. //查询SHT30数据手册可知,温湿度的计算方法如下        
  195.         Temperature= 175.0*(float)tem/65535.0-45.0 ;// T = -45 + 175 * tem / (2^16-1)
  196.         Humidity= 100.0*(float)hum/65535.0;// RH = hum*100 / (2^16-1)
  197.         
  198.         if((Temperature>=-20)&&(Temperature<=125)&&(Humidity>=0)&&(Humidity<=100))//设定温度和湿度的阈值,超过这个阈值则返回错误提示
  199.         {
  200.                 //printf("温度:%6.2f℃\r\n",Temperature);
  201.                 //printf("湿度:%6.2f%%\r\n",Humidity);
  202.         }
  203.         else
  204.         {
  205.                 //printf("温湿度超过给定阈值!\r\n");
  206.         }
  207.         hum=0;
  208.         tem=0;        

  209. }
复制代码

下面这两句不明白的小伙伴,我另外一篇博文会专门介绍

  1. #define IIC_INPUT_MODE_SET()  {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=8<<28;}//改变PB7对应位为1000(CNF[1:0]MODE[1:0]),设置成上拉或者下拉输入
  2. #define IIC_OUTPUT_MODE_SET() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=3<<28;}//改变PB7对应位为0011,设置成通用推挽输出
复制代码

三、主程序
main.c


  1. /*------------------------TFT3.5接线--------------------------

  2. //              GND   电源地
  3. //              VCC   3.3v电源
  4. //              SCL   PA0(SCLK)
  5. //              SDA   PA1(MOSI)
  6. //              RES   PA2
  7. //              DC    PA3
  8. //                                                        BLK   PA4 控制背光
  9. //              MISO  PA5
  10. //              CS1   PA6
  11. //              CS2   PA7
  12. ----------------------------------------------------------------*/

  13. #include "delay.h"
  14. #include "sys.h"
  15. #include "led.h"
  16. #include "lcd_init.h"
  17. #include "lcd.h"
  18. #include "pic.h"
  19. #include "usart.h"
  20. #include "SH30.h"


  21. extern float Temperature;
  22. extern float Humidity;

  23. unsigned char buf[2][24] = {0};

  24. int main(void)
  25. {
  26.         u8 i,j;
  27.         float t=0;
  28.         LED_Init();//LED初始化
  29.         LCD_Init();//LCD初始化
  30.         SHT30_Init();
  31.         uart_init(115200);
  32.         printf("SHT30初始化正常,已准备就绪!\r\n");
  33.         LCD_Fill(0,0,LCD_W,LCD_H,GREEN);

  34.         while(1)
  35.         {               

  36.                 SHT30_read_result(0x44);
  37.                 sprintf((char *)buf[0],"Current Temp:%.2f",Temperature);
  38.                 sprintf((char *)buf[1],"Current Humi:%.2f",Humidity);        
  39.                 LCD_ShowString(40,120,buf[0],WHITE,RED,32,0);
  40.                 LCD_ShowString(40,160,buf[1],WHITE,RED,32,0);
  41.                 delay_ms(2000);
  42.         }
  43. }
复制代码

四、实验结果


6a2a8f89b6714e60a365101e20d0efec.jpg

————————————————
版权声明:@slow-walker


收藏 评论0 发布时间:2022-10-26 22:11

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版