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

基于stm32f103的SHT30温湿度显示

[复制链接]
STMCU小助手 发布时间:2022-10-26 22:11
基于stm32f103的SHT30温湿度显示: X5 a+ p; y# W7 k6 {- i: N" N+ W
本次分享的是基于STM32F103C8T6单片机型号和SHT30温湿度传感器以及TFT(3.5)屏的温湿度显示实验# T# r( q: w, U/ M' u5 @* e
本实验使用的TFT彩色屏的驱动程序由商家提供,我们只需要按照自己显示的形式进行相应的设置进行了。同时SHT30程序部分借鉴了这位博主的分享(表示感谢)
2 q4 X  V- k. a( d) r  x! ~- A; v7 X7 t
一、硬件材料
0 W: k  M  |6 @, D# _
LH@)J_7B42Y~BZRVP$T)L@T.png
1 m0 u; a/ v3 j! F* _, F, X0 a
& F" I$ o" a: B8 b1.stm32f10c8t6/ v4 a# `1 I9 u1 a

9 }" |3 v/ {0 q0 L, ?: ~$ q8 r7 E 29a7d20b030a445db701b825d8de0c54.png
3 U; \1 e7 }9 `2 V  K# o+ U# }6 W( z$ Y7 \3 |) m# o& L0 I
2.sht30温湿度传感器
" h1 `; E, _  \( D: `, s
) e1 ?6 ]6 |9 w 16a4f4830bb94ff2916c6d4a46e494fc.png
4 ]7 N, s; y- ~: p
+ u+ a2 F1 \8 a* v1 @( P* ]0 B7 d' d3.TFT(3.5)寸屏( A. F6 _! S( ]  r

9 Q8 _8 _* b3 t! M 20a08f944ef849a5a32adb592dc5b2d3.png ; t6 n5 n& ?" G5 e, r# _0 ]5 p
1 r' o) _  j1 X, M1 i0 i/ Q. b
二、SHT30介绍5 h( @! H  r, m2 k- a0 M

1 [1 F) M  E$ ^3 Vsht30为4引脚IIC控制传感器,这里就不详细说这个模块了,知道怎么用就行了,和DHT11温湿度模块差不多。
/ ^" |+ a; O4 u) u) G7 H* B+ ~, p4 I1 U
sht30.h7 U) \# Y1 Z( L: b
6 R) z. Q2 ~0 ?6 T# v+ C
  1. #ifndef _SH30_H
    2 V# i5 N9 y2 h+ c( m
  2. #define _SH30_H$ g9 P8 L+ t" H8 [9 @9 l" S! w5 t2 |

  3. ; t1 L! |1 P  G* I
  4. #include "delay.h"
    ' p3 M  o; r8 Q8 M
  5. #include "sys.h"
    . v6 R4 e; C5 E! Y
  6. #include "stdio.h"# K- y; T% s0 s2 ?! \3 N1 Z( V
  7. #include "usart.h") j1 i5 e9 ^# n
  8. #include "string.h"
    8 R( N3 f7 L# Z' ]
  9. ( n  }8 I2 _( f  T2 h8 T9 V" m
  10. extern u8 humiture_buff1[20];9 A3 v0 B- N: d

  11. 0 c4 p$ z) R9 d. Z. ~) T
  12. void SHT30_Init(void);
    ; u: }+ U+ \5 y) y) j' ?8 t, j5 q
  13. void IIC_ACK(void);//确认字符,表示发来的数据已经确认接收无误2 W" h7 n& T% D8 c4 _
  14. void IIC_NACK(void);//无确认字符,表示数据接收有误或者还未接收完成6 j1 W8 L9 W& P/ T% k! u/ Q# H7 j
  15. u8 IIC_wait_ACK(void);//等待接收确认字符
    1 p# N0 S! E+ ]0 W3 i
  16. void IIC_Start(void);//等待IIC传输数据开始: \8 O! i3 p( Z' L
  17. void IIC_Stop(void);//IIC传输数据停止
    ! A6 w  [6 a" B9 R0 B
  18. void IIC_SendByte(u8 byte);//IIC发送数据
    ' E- H# c$ n  x' h2 h& u# C  B; a
  19. u8 IIC_RcvByte(void);//IIC接收数据
    - @( w& S/ A4 \6 H+ _% R$ |; o4 X
  20. void SHT30_read_result(u8 addr);//SHT30温湿度传感器开始读取数据
    " v: B1 {% E5 A
  21. #endif
复制代码
0 X' E8 G. X: @  d3 ~1 G* `
sht30.c8 U: N6 v0 @1 f8 p* b1 H% q

8 H4 t( [4 A" Y* u+ v8 i
  1. /*
    + Y, c6 ^6 X4 `5 `
  2. 设定温度阈值范围:-20℃——125℃
    6 B# L# m& f; j$ C5 a+ k' }. j' U
  3. 设定相对湿度范围:0%——100%6 H$ S. P6 B) H! _; G# Q% j8 f! s
  4. */4 m, I) `; ?: y, {! }% M  v
  5. #include"stm32f10x.h"
    ( p$ ], |8 Y$ h  d  S2 y6 i
  6. #include"sh30.h"
    2 ~) |8 v* C1 _/ ]3 X0 Y/ Z
  7. #include"stdio.h"
    , _" [9 P/ i9 G
  8. % W# e$ F" d1 l1 e, M" ?. O$ y" W
  9. #define write 0 //IIC设备地址一般是7位,也有10位,本程序使用7位IIC设备地址,第8位是写命令
    : S$ z; R! I4 R, x. o/ W1 Y9 |3 I5 A
  10. #define read  1 //IIC设备地址一般是7位,也有10位,本程序使用7位IIC设备地址,第8位是读命令3 z3 q" I+ O3 _+ ^& D# f
  11. 5 S4 T7 u$ s( m' A" M/ M% F
  12. //IIC总线接口定义1 @* j4 M4 f1 b
  13. #define SCL PBout(6)//设置时钟端口, V  R0 A  @5 @2 a
  14. //SHT30数据SDA传输口,有输出也有输入,所以需配置它的输入和输出% w7 e4 s: D2 C- r2 A; a5 b
  15. #define SDA_OUT PBout(7)//设置输出数据端口
    ! ~9 @3 b8 y+ x
  16. #define SDA_IN PBin(7)//设置输入数据端口% z' Z6 _, l  v% Y, g& [- ]$ i
  17. //设置端口高8位的工作模式(具体可以参照端口位配置表),即I/O输入输出方向设置,先用与(&)对PB7引脚的四个位清0,再用或(|)置17 W9 M* ^0 C" M, `4 _+ r6 }
  18. #define IIC_INPUT_MODE_SET()  {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=8<<28;}//改变PB7对应位为1000(CNF[1:0]MODE[1:0]),设置成上拉或者下拉输入
    5 C! A- ^$ |: W# N5 }. u1 [3 V
  19. #define IIC_OUTPUT_MODE_SET() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=3<<28;}//改变PB7对应位为0011,设置成通用推挽输出
    % k0 w) R2 Z+ t6 I4 z( `& k! m- @
  20. //#define IIC_INPUT_MODE_SET()  {GPIOB->CRH&=0XFFFF0FFF;GPIOB->CRH|=8<<12;}//改变PB7对应位为1000(CNF[1:0]MODE[1:0]),设置成上拉或者下拉输入
    , K$ F# Y6 f) G# h. X
  21. //#define IIC_OUTPUT_MODE_SET() {GPIOB->CRH&=0XFFFF0FFF;GPIOB->CRH|=3<<12;}//改变PB7对应位为0011,设置成通用推挽输出$ H: @5 o5 p& H, i$ \) K8 N1 Q
  22. 2 N, i" J& G! Z/ P- f) ^  o4 m' k) w
  23. //定义温湿度存储变量  x$ K3 f% D+ `$ G
  24. u8 humiture_buff1[20];8 E6 V3 \- r( V: |7 N) B
  25. % h. r9 B; k+ C
  26. float Temperature=0;//定义存放温度拼接的变量Temperature,初始化温度为0/ I2 h- N' d& O( @, I3 q! m7 n
  27. float Humidity=0;//定义存放湿度拼接的变量Humidity,初始化湿度为0: u( [/ u7 S* ?0 G$ u

  28. ! J+ n% z) i: B+ S/ Y+ Q4 ^( E
  29. void SHT30_Init(void)//初始化SHT30的SCL与SDA接口% ]/ F2 e3 N/ k2 ]' U# ~' p
  30. {
    9 q, h7 _, h: N( N
  31.         GPIO_InitTypeDef GPIO_InitStructure;
    5 ^( f8 o1 e' X0 g, c" F/ T  I: h  D9 u
  32.         RCC_APB2PeriphClockCmd(        RCC_APB2Periph_GPIOB, ENABLE );        & x5 g5 l; }2 S$ T
  33.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;//定于SCL连接到STM32的PB6引脚上,定于SDA_OUT/SDA_IN连接到STM32的PB7引脚上
    & ^* k4 h: S" D6 n2 e; t
  34.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;   //推挽输出
    ' \! q1 O1 n, n, U( L+ `5 [5 ^
  35.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    " K! J  o7 U9 H0 L" h
  36.         GPIO_Init(GPIOB, &GPIO_InitStructure);$ w8 l! C6 p1 E+ u; w8 X+ S
  37.          SCL=1;//根据SHT30时序要求,默认时序是高电平(SDA拉低时,SCL跟着拉低,开始数据的传输)
    1 H1 i. v  q) J1 }+ n/ N- j$ T% Y
  38.         SDA_OUT=1;//高电平还未开始数据的传输,拉低时开始数据的传输
    + I' f* @% G" q( h
  39. }        
    0 w  k. g9 S8 r. s2 I* K6 G4 q
  40. //主机发送确认字符ACK  [) u7 s* Z/ ?3 K0 W6 o
  41. void IIC_ACK(void)//IIC协议,需要主机发送确认字符ACK来判断数据是否接收无误: t! h9 @4 a" l+ c: n$ h
  42. {
      k, f+ ?' C4 F- A& L) u& U8 q
  43.   IIC_OUTPUT_MODE_SET();//配置PB7的SDA输出为推挽输出模式  c; q0 o5 N6 L- E/ N' B) J+ s
  44.   SCL=0;
    ; x) J$ Y- M. j8 l$ ?' R
  45.   delay_us(2); 0 ^/ N/ a& U5 }5 V& Y& V  @* o1 E) L
  46.   SDA_OUT=0;) t, M! _, f2 [9 G: b* k) {
  47.   delay_us(2);     9 l5 X5 _- C/ J& s3 z0 C( v- k4 n4 c" t& t
  48.   SCL=1;//数据接收完成之后,将SCL拉高,以便与后面主机发送ACK给从机
    & ]2 Z0 H$ |! Q. h! @* I
  49.   delay_us(2);                  ) i8 `0 [5 i! ]! x/ c8 L
  50.   SCL=0;//数据接收完成,主机发送ACK                     
    ! E- E' j, {3 d% Z$ x( s/ D
  51.   delay_us(1);    # k( [& c2 X+ S/ v) }# T# p; l
  52. }
    5 Z# c" J0 H. ^& ?; g3 Y" Y
  53. //主机不发送确认字符ACK
    ; v. K' r- h% Y- _
  54. void IIC_NACK(void)//IIC协议,数据传输未完成或者数据传输有误,主机不发送确认字符ACK
    ! I4 z$ S! Q9 ~
  55. {
    : W% w0 R, c+ V1 K' j5 S& X7 H1 v
  56.   IIC_OUTPUT_MODE_SET();//配置PB7的SDA输出为推挽输出模式- P: T/ t$ R1 ~- F
  57.   SCL=0;
    ) \" D! Y7 s9 d' C1 @- E1 j* c0 S
  58.   delay_us(2); " V2 h8 P& e! f3 O* q/ N7 a
  59.   SDA_OUT=1;% _) ^8 v: k( g9 _) n
  60.   delay_us(2);      7 |0 p- f/ S3 ]& B6 d+ S
  61.   SCL=1;& O" S# ^& i8 n" `( o2 |
  62.   delay_us(2);                  
    6 Y; T0 e  X/ M; t) M
  63.   SCL=0;                     ; I" l1 \; o6 k! n- R7 C$ T
  64.   delay_us(1);   
    6 A: c7 W5 [  t: }' m5 n6 o
  65. }1 N+ u4 i& y5 C+ j
  66. //主机等待从机的确认字符ACK
    " b, B, B0 ~6 l0 \8 }- Z; i. U
  67. u8 IIC_wait_ACK(void)//主机等待从机发送ACK,从而判断数据是否接收完成0 {; z7 V0 n0 l! [8 {; _% g
  68. {
    ; w; k, h3 j  s+ e! G1 L7 v
  69.     u8 t = 200;3 [* U3 F, b" j$ X9 Y5 ?1 s; H
  70.     IIC_OUTPUT_MODE_SET();; Z5 U0 Z: r4 Y. h. [$ O7 p
  71.     SDA_OUT=1;//8位发送完后释放数据线,准备接收应答位
    * [6 X# y1 }3 p7 n& W
  72.     delay_us(1);( ]% p! |3 a; K% z% w4 V& r! m  i
  73.     SCL=0;
    / I) o3 q/ T( C+ S
  74.     delay_us(1); 7 V( }( n) N# P! o9 G
  75.     IIC_INPUT_MODE_SET();; }% ^" L( L7 g7 [& ~
  76.     delay_us(1);
    $ r& R6 k: o# M$ R" r0 E, g: |
  77.     while(SDA_IN)//等待SHT30应答4 \  H! U- y$ d5 G9 j1 u
  78.     {
    & h, `1 \( O, e
  79.         t--;
    ; O0 Z+ o" U+ b7 S/ j
  80.         delay_us(1);
    5 J5 |1 Q- ]) g
  81.         if(t==0)8 ~; l: n& M0 H/ U& ]$ h2 E
  82.         {
    2 Q" k) r- G/ y0 `; z7 @- N
  83.           SCL=0;( c! l, e% `  b5 A
  84.           return 1;6 n- r0 R: Z' o" D* j8 m
  85.         }
    0 I& t8 N! v3 c9 m) Q8 Q
  86.         delay_us(1);
    4 v3 O! o" ]+ ?! y- {! D
  87.     }
    ; T! |# l" V/ P! K9 i$ N- `
  88.     delay_us(1);      4 U4 e, t1 I. L3 D
  89.     SCL=1;' m% o% y' A- ?& ]% J
  90.     delay_us(1);6 `% N# E& _' u9 U9 c1 |% }
  91.     SCL=0;             ! [1 x3 K' z7 W% c2 v! ]
  92.     delay_us(1);   
    ! u9 h, G. p3 [+ g5 D
  93.     return 0;        - }1 V/ ^* O8 F2 j1 J& `
  94. }! t1 |; n' x; i3 z3 }6 U- v; K
  95. //启动IIC总线进行通讯,发送IIC通讯的起始条件3 b6 p* x) c; P9 p0 s0 b/ T
  96. void IIC_Start(void)//启动IIC通讯. l0 |' h& v. d6 }7 t, G
  97. {# Z% T5 W* ]4 C! c# j5 G: _
  98.   IIC_OUTPUT_MODE_SET();//设置PB7的SDA为推挽输出, N0 s, r3 y  i' n$ E* w
  99.   SDA_OUT=1;//根据SHT30时序,启动之前,SDA配置为高电平
    / O4 i2 h, A* L
  100.   SCL=1;//根据SHT30时序,启动之前,SCL配置为高电平
    & i' W, j  v% E" r1 o( V7 I
  101.   delay_us(4);//延时4us,给硬件一个反应时间! v9 O; Z' q/ F5 \
  102.   SDA_OUT=0;//SDA引脚拉低,开始数据的传输
    # ]  r/ B. h3 y6 p# t
  103.   delay_us(4);
    % \7 S0 t# ?) |& }
  104.   SCL=0;//SCL拉低,与SDA对应,响应SDA数据的拉低,表示正式开始数据的传输+ ~" t. Y! f" e3 V- j* n
  105. }! ]& F3 e/ q. `6 I7 O
  106. 0 T6 i8 f! [. Z0 ~9 g
  107. //结束IIC总线通讯,发送IIC通讯的结束条件
    4 Y$ M; @4 ?5 w+ }" {! T
  108. void IIC_Stop(void)
    * s* z& M8 D# r. ]+ A: P0 ?6 J: j
  109. {
    8 Z) \( B1 S: B8 m5 Y; z6 A, D1 o. w
  110.         IIC_OUTPUT_MODE_SET();
    ) K. O4 c: i* v
  111.         SCL=0;//结束IIC通讯之前,查看SCL是否是拉低状态
    , \% o; m- S; Q
  112.         SDA_OUT=0;//结束IIC通讯之前,查看SDA是否是拉低状态  , d9 W  U: d% }3 Q3 ^( [
  113.         delay_us(4);        
    ; D( m3 T% y2 ~4 n/ B
  114.         SCL=1;//将时钟拉高,表示已经结束IIC通讯
    + @2 w8 b" U- G( d
  115.         delay_us(4);
    % q7 a# J. @# r0 ?$ s# b+ V" V. D
  116.         SDA_OUT=1;//将数据传输引脚拉高,表示正式结束数据的传输- Y6 B/ D9 f$ c9 c
  117.         delay_us(4);" O3 s+ H* I( }2 n8 G2 T. O* ?
  118. }
    7 a6 W" N6 T; U6 K& e; J
  119. $ R( \4 K4 ]* j/ ?
  120. //将byte数据发送出去
    * z+ d" M: M% ?+ `
  121. void  IIC_SendByte(u8 byte); `. J; f; a& q  p+ B- a5 ?2 Y
  122. {% i+ g- I: c. J5 ^7 j
  123.         u8  Count;
    9 c# i1 l! M, ?: Z; l, y; M
  124.         IIC_OUTPUT_MODE_SET();* J5 h% d) B* J
  125.         SCL=0;//将时钟拉低,开始数据的传输) F0 m7 V! ^) c5 s
  126.         for(Count=0;Count<8;Count++)//要传送的数据长度为8位4 [+ B* t! k% i  Y) M+ I
  127.         {
    & x2 _2 ]" h% d2 r
  128.                 if(byte&0x80) SDA_OUT=1;//判断发送位,发送位为1,则还未发送数据
    ; b. \- S0 `0 U
  129.                 else SDA_OUT=0; //判断发送位为0,则开始数据的发送
    2 N! u# B/ M! [# B0 _7 x+ `$ ~
  130.                 byte<<=1;
    ! W7 T- s" }8 r) e/ B9 Y" k0 I/ V
  131.                 delay_us(2); ' {# g- r8 D7 q, Q" m- B/ R/ `; _
  132.                 SCL=1;( m% Y/ D2 x7 a
  133.                 delay_us(2);. h9 N/ ^& t% p  y' N$ {9 Q. W& ~
  134.                 SCL=0;2 C/ w- `5 \  @# D# m5 s3 l
  135.                 delay_us(2);
    ) H! ]& I( m' X! S& Q/ c
  136.         }- p: r6 Z) c6 o  N% x% Y; A: |
  137. }
    ) p- I, x/ i9 U5 e, S

  138. 2 O- o9 u* B* @: q! y! |2 \  r
  139. // 用来接收从器件传来的数据    + A( X4 v0 N' L* [
  140. u8 IIC_RcvByte(void)" t9 k$ t8 y6 |1 j( @9 U
  141. {6 _9 B0 h/ K9 i* ]3 E. a
  142.   u8 retc;, c# e+ Q/ X: _
  143.   u8 Count;) V* N$ f  h. P6 O/ w8 R) K& |' Q
  144.   retc=0;
    8 z8 d( V; [- Y
  145.   IIC_INPUT_MODE_SET();//配置数据线为输入方式
    " E2 R9 `: r: \& M( g1 c$ v5 I% J6 S
  146.   delay_us(1);                    
    / Z1 c7 W9 w: F$ K0 s& U; m
  147.   for(Count=0;Count<8;Count++)2 v, ^- W( J! y+ A
  148.   {  6 E0 J  z* w% e2 G# {5 k/ M
  149.         SCL=0;//配置时钟线为低,准备接收数据位$ }# J+ Z; ]' U1 @
  150.         delay_us(2);               
    7 J9 ]/ Q! y$ t6 w7 B1 w
  151.         SCL=1;//配置时钟线为高使数据线上数据有效                $ }/ K( R) a8 g) f" J. L8 K6 E- G
  152.         retc=retc<<1;
    & B5 H1 l# A( Y* B7 y% z
  153.         if(SDA_IN) retc |=1;//读数据位,接收的数据位放入retc中
    / O/ Z; I! G4 y. W% F; ^
  154.         delay_us(1);1 a' }& `" l; R, u8 v- M, a
  155.   }
    % c! C5 _) s' {: J0 p) i8 l
  156.   SCL=0;    3 l" I$ D, {: B6 h1 s3 x; H& L
  157.   return(retc);% N$ Q! d: _+ z9 n7 X" h
  158. }7 Y. Q2 i( l3 u4 P3 I/ ^
  159. //用来接收从器件采集并合成温湿度
    & k& [! t' V, F" k! |8 A/ i/ c% I
  160. void SHT30_read_result(u8 addr), z# Q/ K% {8 y! l
  161. {
    " J9 x( U0 P. P! D7 K  L' M( L
  162.         //SHT30有两种读取数值的方法,分别是状态查询和数值查询,这里我使用的是数值查询,发送指令为0x2C06
    " o8 o: ^6 a9 l* j
  163.         u16 tem,hum;//定义存放温湿度计算公式的变量8 {' e9 N3 f& `8 \* }
  164.         u16 buff[6];//定义6个字节的数组,存放温度高、低八位,湿度高、低八位,两个字节的CRC校验位
    8 ?; X3 k7 F  Z) G

  165. # ~# m7 q/ ^9 Q. V( J2 n, o% d0 O
  166.         //发送指令为0x2C06(默认)
    3 R4 }7 @6 r4 [# _" O& p" F9 ?! z
  167.         IIC_Start();- f5 }5 K/ {( w  |7 O( ]8 P; [  w6 [
  168.         IIC_SendByte(addr<<1 | write);//写7位I2C设备地址加0作为写取位,1为写取位. Z: R% D3 S+ O1 r8 E0 n
  169.         IIC_wait_ACK();. |, b: w0 ]7 P6 S
  170. //        delay_us(1);
      C6 D/ {* q# E" G# _/ w1 \2 Z
  171.         IIC_SendByte(0x2C);//前半段发送指令为0x2C  a% w# s, }( J' S$ Y8 R
  172.         IIC_wait_ACK();
    & O3 s: B) c; Y+ d- y" R2 Q' n
  173. //        delay_us(1);+ ?2 m( |: S1 @
  174.         IIC_SendByte(0x06);//后半段发送指令为0x064 y, H1 e- ]  d$ [$ B3 ?0 _4 ~
  175.         IIC_wait_ACK();; K! {7 h& r" M. O& W% D$ A
  176. //        delay_us(1);
    . `2 U9 b& ^7 d/ _$ T
  177.         IIC_Stop();9 ^- m, o. `/ \# t' p' c3 a2 Z9 s
  178.         delay_ms(50);
    ( ]( w& j& ?- u( k- Y
  179.         IIC_Start();
    3 c% }0 ]  P+ _6 h: m% Y# @
  180.         IIC_SendByte(addr<<1 | read);//写7位I2C设备地址加1作为读取位,1为读取位0 h# ^" {; \/ \, z
  181. //SHT30返回的数值是6个元素的数组1 A* h/ m/ ^! @  V% a! a
  182.         if(IIC_wait_ACK()==0)* Y) l: N7 d5 [
  183.         {" C( |4 _: c1 V
  184. //          delay_us(1);
    + W  Y* O- V& A. B' y
  185.                 buff[0]=IIC_RcvByte();//返回温度高8位
    & P$ Y& @. E. q5 ?* s! ?- w! y, O0 r) x
  186.                 IIC_ACK();* m+ ?; q& K/ a* I3 Q$ `
  187.                 buff[1]=IIC_RcvByte();//返回温度低8位
      M3 ^9 [6 g* ~" h
  188.                 IIC_ACK();" k, b4 R/ P* p' G, T) y
  189.                 buff[2]=IIC_RcvByte();//温度crc校验位
    6 K8 y- B" b% C4 }+ X, o
  190.                 IIC_ACK();3 j4 Y. C4 }1 d- j
  191.                 buff[3]=IIC_RcvByte();//返回湿度高8位) N3 f/ ?4 n4 P6 \8 J
  192.                 IIC_ACK();5 v8 O- a  Q0 E: O
  193.                 buff[4]=IIC_RcvByte();//返回湿度低8位
    $ ~! p+ k% e6 x
  194.                 IIC_ACK();
    / O  q; K  V1 K: \
  195.                 buff[5]=IIC_RcvByte();//湿度crc校验位
    2 F4 T% \, u3 n& o+ \6 \: i! t
  196.                 IIC_NACK();+ d; Z- o7 L% _1 `
  197.                 IIC_Stop();  g* _! s4 w( M$ O' h
  198.         }7 I- |8 l# u. q% s9 E5 g) z) h7 }4 x/ q
  199. //        tem = (buff[0]<<8) + buff[1];9 T/ P4 H* B3 S' G. s% x7 c
  200. //        hum = (buff[3]<<8) + buff[4];
    9 W" u2 @- v3 E& |& P& s
  201.         tem = ((buff[0]<<8) | buff[1]);//将buff[0]采集到的温度8位数据与buff[1]采集到的低8位数据相或,实现温度拼接
    7 l* |$ l4 F, A' `/ x  n- ?
  202.         hum = ((buff[3]<<8) | buff[4]);//将buff[3]采集到的湿度8位数据与buff[4]采集到的低8位数据相或,实现湿度拼接. p) n6 M/ K0 M* [
  203. # v8 W  ]9 b" |7 E8 z& F4 k
  204. //查询SHT30数据手册可知,温湿度的计算方法如下          f, S+ Z& m+ E( T$ G
  205.         Temperature= 175.0*(float)tem/65535.0-45.0 ;// T = -45 + 175 * tem / (2^16-1)
    " L/ X8 _; ?: g/ [- D
  206.         Humidity= 100.0*(float)hum/65535.0;// RH = hum*100 / (2^16-1)
    ' n6 a6 i2 P+ J& ^/ F
  207.         7 z  Y: P; B1 e6 b
  208.         if((Temperature>=-20)&&(Temperature<=125)&&(Humidity>=0)&&(Humidity<=100))//设定温度和湿度的阈值,超过这个阈值则返回错误提示
    6 y- Y7 W8 x1 o$ V8 G
  209.         {
    / L6 ~: }3 P2 l- W: `4 {" U
  210.                 //printf("温度:%6.2f℃\r\n",Temperature);
    1 D# d6 @- U% C' `) l
  211.                 //printf("湿度:%6.2f%%\r\n",Humidity);2 ^6 N% F- u1 Q# W0 ~
  212.         }
    + N- m& j4 A$ }: x  }/ _0 r0 Q8 a
  213.         else5 C& B, P8 A# m! p
  214.         {
    8 E9 e) l/ F, k' o+ w9 j: @
  215.                 //printf("温湿度超过给定阈值!\r\n");7 p' u' o( `3 k- \1 `' b2 O
  216.         }
    / s# s7 w0 v, z1 o8 x, Q
  217.         hum=0;5 `( k0 U1 q( M4 n% ^$ Y
  218.         tem=0;        
    ' M( J; L/ L4 d' C8 K! ~: g4 `

  219. ; k, O( J5 h) @) V
  220. }
复制代码

/ R: Z, f5 ], W& ]1 i+ H# B下面这两句不明白的小伙伴,我另外一篇博文会专门介绍
8 V4 o/ M$ t! G# {, i5 d+ Y2 w
  d6 Q0 }1 M( i
  1. #define IIC_INPUT_MODE_SET()  {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=8<<28;}//改变PB7对应位为1000(CNF[1:0]MODE[1:0]),设置成上拉或者下拉输入9 X% P' K$ z: k7 F9 J1 F: R
  2. #define IIC_OUTPUT_MODE_SET() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=3<<28;}//改变PB7对应位为0011,设置成通用推挽输出
复制代码

% m8 ~' Z) @! J  S三、主程序. A0 `7 ~0 E4 D. u+ v& L4 x$ H2 a
main.c
9 Z5 m9 b& \- S* y$ f: E9 M4 f
1 f  M5 c9 s4 a! x% h5 U

  1. " y# [" u; D( }, b  A) E4 h
  2. /*------------------------TFT3.5接线--------------------------5 C0 L! f1 f& A  k

  3. 1 X, B6 \, |" p! o9 @
  4. //              GND   电源地
    8 O3 i+ {" H- l; N5 b3 A7 K' F
  5. //              VCC   3.3v电源& [! J/ l9 ~4 P1 Q2 I
  6. //              SCL   PA0(SCLK)) ~% K. r9 Y% p
  7. //              SDA   PA1(MOSI)) c2 W* I' e  \) r! E1 s
  8. //              RES   PA2# r/ w/ @5 {) V0 k
  9. //              DC    PA3
    : z% n; {# T: B+ R0 V( L: u
  10. //                                                        BLK   PA4 控制背光
    . X' H# Q0 ~' L' b; n
  11. //              MISO  PA5
    ; \1 J0 S; Y, O" y
  12. //              CS1   PA6
    $ b" f* v1 E$ J( p
  13. //              CS2   PA7
    & y/ `7 c; S3 w" i; B
  14. ----------------------------------------------------------------*/1 ^8 S2 |7 z0 U; ]
  15. 6 e) I  @; Z! N3 j$ s- e# n
  16. #include "delay.h"% w  j1 O, S: ?
  17. #include "sys.h"2 B4 R5 Y* c* [! p% \! H
  18. #include "led.h", `; T+ q) @1 D0 s* e
  19. #include "lcd_init.h"
    % H" ^: z2 U) r+ T
  20. #include "lcd.h"9 u6 v/ D0 Y  Y" z- a5 [, X- Z. z
  21. #include "pic.h"
    8 q# ?3 L0 v, U! e1 O
  22. #include "usart.h"& H/ T- h8 L  W, n
  23. #include "SH30.h") d# A7 p4 L) H2 y1 e6 o

  24. / p) n6 ]* o# Z* A* ]: i
  25. 2 D7 R. t, ?8 }- |# m
  26. extern float Temperature;$ Z( H$ B( M: l6 N& q. i$ Q: x- ^
  27. extern float Humidity;- s7 {* n9 x0 [1 ^: Z+ N# H. t# R

  28. " h( c9 L) }! u" n! }  {; S
  29. unsigned char buf[2][24] = {0};! \2 l* ~* ~( ?8 g8 s
  30. 9 G$ e) e2 q! o. I3 Y2 W* ?1 ~
  31. int main(void)
    7 K  S4 ?2 {; C* Y
  32. {
    5 r' C" D) u0 Z/ d* V1 b
  33.         u8 i,j;
    ( s' O. Z  X+ J' Q& N- X1 J
  34.         float t=0;
    " V/ d6 N  k, \; K1 A( p- k
  35.         LED_Init();//LED初始化  v/ c# f* @3 Q. k; b1 s
  36.         LCD_Init();//LCD初始化) \: m1 q  g0 l/ x
  37.         SHT30_Init();
    * ^7 |5 h/ _" b. U
  38.         uart_init(115200);
    * z, S6 B; ~: |% ?) r* A
  39.         printf("SHT30初始化正常,已准备就绪!\r\n");
    " R3 Y/ t0 N3 ~4 u, [" V1 f
  40.         LCD_Fill(0,0,LCD_W,LCD_H,GREEN);
    3 m) O& W  l9 j

  41. / i: R. a+ |" q. L9 _1 w$ y
  42.         while(1)7 b2 `( K7 q5 R# C
  43.         {                ' K6 U/ `. P4 F4 f% f9 C
  44. " v6 B) A1 _- x0 N0 }9 J) d
  45.                 SHT30_read_result(0x44);( ~5 P+ Y+ @  A. S2 ?+ y' S' y) E
  46.                 sprintf((char *)buf[0],"Current Temp:%.2f",Temperature);4 A, I: f' w4 I0 M& k, q
  47.                 sprintf((char *)buf[1],"Current Humi:%.2f",Humidity);        9 [9 S( Z: C& X' v! K5 [
  48.                 LCD_ShowString(40,120,buf[0],WHITE,RED,32,0);
    " Z3 j& h+ t1 {; w+ g4 z
  49.                 LCD_ShowString(40,160,buf[1],WHITE,RED,32,0);
    4 z2 z0 M8 x$ Z8 l4 c/ i8 y
  50.                 delay_ms(2000);1 j% t: D) c2 b, G4 ]
  51.         }+ `' z1 s/ x' }+ d- m
  52. }
    0 N4 p+ |! z, |: k" K0 L
复制代码

( \) [# w1 F1 e& Y+ }/ x% q四、实验结果
7 L" S6 M- H0 Q* b$ k

7 E, Q% u( O0 n/ Q 6a2a8f89b6714e60a365101e20d0efec.jpg 1 g- h0 T( H4 c) C( I7 X6 y

4 r7 p& ]: t  Q0 Z————————————————
3 W9 I! j+ |' ~/ t5 E% ~6 h版权声明:@slow-walker
" \& f" H. N& q( L- @( T) y
3 j& ?& E. U4 x  x, P! m" V, k
! ]3 }! |9 H' B, u* H$ V9 M
收藏 评论0 发布时间:2022-10-26 22:11

举报

0个回答

所属标签

相似分享

官网相关资源

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