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

基于stm32f103的SHT30温湿度显示

[复制链接]
STMCU小助手 发布时间:2022-10-26 22:11
基于stm32f103的SHT30温湿度显示- O3 Y( n- ~% t. u; B
本次分享的是基于STM32F103C8T6单片机型号和SHT30温湿度传感器以及TFT(3.5)屏的温湿度显示实验$ r+ i' @+ H+ s: [) Y
本实验使用的TFT彩色屏的驱动程序由商家提供,我们只需要按照自己显示的形式进行相应的设置进行了。同时SHT30程序部分借鉴了这位博主的分享(表示感谢)
8 g) Y8 e. p  ]8 r
/ w6 W; I  a) m" F5 {, D- Q一、硬件材料

- c' N& u) e/ @% J/ q2 @% L, ] LH@)J_7B42Y~BZRVP$T)L@T.png
7 D: u; G( G2 T7 n" ^7 {) Y( C! Z4 j+ {
1.stm32f10c8t6
1 u+ U, M2 t7 U5 w) |
+ {( p+ X4 A. g7 j- \+ x 29a7d20b030a445db701b825d8de0c54.png
* T- j# h! s' g/ U+ |2 M4 m0 B3 S$ J' V+ s% y# K( ?
2.sht30温湿度传感器" Y% k- H1 S; |  `; s3 t. {+ `) c7 H
) f/ ^3 @! a  `& M- m3 E& v" v/ I
16a4f4830bb94ff2916c6d4a46e494fc.png + w& V$ Y6 P# V& }
2 p% A# x& u2 s9 s
3.TFT(3.5)寸屏1 l' @  C9 ?( F+ L! I2 M1 Q

( [. n1 x' f# o  ]5 v8 l/ g 20a08f944ef849a5a32adb592dc5b2d3.png
. J% \* g* Z8 Z  r! _5 C% a. l% A  T  K; h' v+ j8 m
二、SHT30介绍: e+ d* g4 [1 G3 _; W9 U

) \$ f* I  P7 vsht30为4引脚IIC控制传感器,这里就不详细说这个模块了,知道怎么用就行了,和DHT11温湿度模块差不多。
' @: L% B& K, W$ g5 c6 |4 x5 T
9 G  `  _7 u$ B+ b5 ]4 q0 isht30.h
. N5 ^  F+ L* u# I) h: _* }
& |1 j2 b/ y( A! t9 [2 F- w
  1. #ifndef _SH30_H3 t( K; |( @" I5 U5 E' S
  2. #define _SH30_H1 `/ T. f# _* o4 ]

  3. $ C0 M3 P2 R6 ~, W* M
  4. #include "delay.h"+ e& @. W& K  I- F3 W1 ~3 T8 ^
  5. #include "sys.h"2 x4 G' y% p1 ?
  6. #include "stdio.h"
    ; |- |" d% k8 u
  7. #include "usart.h"$ h( B6 M0 L) w/ Q) d2 b1 |& I
  8. #include "string.h"
    & T2 V' {0 R+ s/ V

  9. # {: k* ]2 |1 `( [- q, x
  10. extern u8 humiture_buff1[20];
    # w6 g( m9 x1 ~* y: m* N6 T, R

  11. - @& d  C- X0 U* V$ {, }4 k
  12. void SHT30_Init(void);1 C% ?8 l7 u5 L+ N! C0 M: c
  13. void IIC_ACK(void);//确认字符,表示发来的数据已经确认接收无误, M2 @" p. ^. D( J
  14. void IIC_NACK(void);//无确认字符,表示数据接收有误或者还未接收完成
    ) u. n, [1 j; }" f
  15. u8 IIC_wait_ACK(void);//等待接收确认字符
    8 K7 S. p. D' R2 ~- `6 w$ N
  16. void IIC_Start(void);//等待IIC传输数据开始
    9 G+ U' B  l- M0 _7 q' Z+ R
  17. void IIC_Stop(void);//IIC传输数据停止
    / j1 I7 l" M- ~* f6 o8 |- h8 \) Z9 r
  18. void IIC_SendByte(u8 byte);//IIC发送数据
    ! ]9 V5 f/ o2 n1 J8 Q
  19. u8 IIC_RcvByte(void);//IIC接收数据
    8 n  `( y6 T+ i. H
  20. void SHT30_read_result(u8 addr);//SHT30温湿度传感器开始读取数据
    : D2 H1 @2 U) W3 a
  21. #endif
复制代码
! e  J' k4 ?) {
sht30.c
/ c3 [( H5 A  {& h
2 G5 O# X) s. i; |6 F6 w* U
  1. /*5 M1 f" E9 H2 h4 J
  2. 设定温度阈值范围:-20℃——125℃3 j4 k& s$ S% [0 f) l; H4 J7 E. P
  3. 设定相对湿度范围:0%——100%
    + E5 M: w+ {8 m4 V7 A$ C8 ]
  4. */0 I" W3 R5 P1 |7 G9 o
  5. #include"stm32f10x.h"
    # N, k( R- l  U8 p. D0 K
  6. #include"sh30.h"+ J- h# _. U* \; k& e: G8 ?% O# _
  7. #include"stdio.h"3 s% r& q; U2 {4 t; w

  8. 2 P/ @: s; L9 j, Y3 x* c$ T2 J
  9. #define write 0 //IIC设备地址一般是7位,也有10位,本程序使用7位IIC设备地址,第8位是写命令
    ) w% U/ x8 t" X7 q! E$ S
  10. #define read  1 //IIC设备地址一般是7位,也有10位,本程序使用7位IIC设备地址,第8位是读命令
    * h+ V1 G! u. t$ G" A. c0 @
  11. * ~* {; U) Z7 ?- O/ h) z( \
  12. //IIC总线接口定义
    ! J2 r3 v( p1 i* v% D
  13. #define SCL PBout(6)//设置时钟端口$ e5 u6 F! ~2 Z8 a  N8 f, R" Y
  14. //SHT30数据SDA传输口,有输出也有输入,所以需配置它的输入和输出
    & j+ {5 ~( w* i: l% L1 e3 X6 J) J
  15. #define SDA_OUT PBout(7)//设置输出数据端口
    ( ]% Y% }6 R2 C5 F, t: n
  16. #define SDA_IN PBin(7)//设置输入数据端口
    , U* q: I, k$ C, l
  17. //设置端口高8位的工作模式(具体可以参照端口位配置表),即I/O输入输出方向设置,先用与(&)对PB7引脚的四个位清0,再用或(|)置18 E! w1 V8 b; Z# ]8 P$ Q+ ?5 H) O
  18. #define IIC_INPUT_MODE_SET()  {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=8<<28;}//改变PB7对应位为1000(CNF[1:0]MODE[1:0]),设置成上拉或者下拉输入
    - E# R  G% I& ^1 u2 r3 n
  19. #define IIC_OUTPUT_MODE_SET() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=3<<28;}//改变PB7对应位为0011,设置成通用推挽输出
    4 F, L# L$ s% z5 ?6 _
  20. //#define IIC_INPUT_MODE_SET()  {GPIOB->CRH&=0XFFFF0FFF;GPIOB->CRH|=8<<12;}//改变PB7对应位为1000(CNF[1:0]MODE[1:0]),设置成上拉或者下拉输入
    ! `" R: p# S2 ~
  21. //#define IIC_OUTPUT_MODE_SET() {GPIOB->CRH&=0XFFFF0FFF;GPIOB->CRH|=3<<12;}//改变PB7对应位为0011,设置成通用推挽输出
    ) v/ ~4 G1 f' X

  22. 7 n8 [9 q9 c7 }8 E5 n+ T; R
  23. //定义温湿度存储变量  ^! O! ^- {; }4 h. z3 H" D
  24. u8 humiture_buff1[20];
    " \: p. A0 V0 M9 m' v4 n

  25. ' i( t4 H2 e2 U
  26. float Temperature=0;//定义存放温度拼接的变量Temperature,初始化温度为0
    2 I* V0 f9 ^& e# e! ~8 v- P& p
  27. float Humidity=0;//定义存放湿度拼接的变量Humidity,初始化湿度为0
    " r* }6 D) c" \1 S8 s6 s' L
  28. : M% ^# }* W! x8 N
  29. void SHT30_Init(void)//初始化SHT30的SCL与SDA接口
    9 n4 q, V# s+ k7 T4 A5 Z
  30. {
    ! C4 a/ x9 H3 l3 }# B: f. _3 U! \
  31.         GPIO_InitTypeDef GPIO_InitStructure;
    : z& x6 V1 [6 f
  32.         RCC_APB2PeriphClockCmd(        RCC_APB2Periph_GPIOB, ENABLE );        
    ( U+ j; L8 v8 Y& s1 g- a5 G+ T& e8 L
  33.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;//定于SCL连接到STM32的PB6引脚上,定于SDA_OUT/SDA_IN连接到STM32的PB7引脚上
    " q' B- ?- q  H: {! I% u
  34.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;   //推挽输出
    9 v- N; P: Q% d) c8 r
  35.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    & ?3 F  |4 t& }$ B
  36.         GPIO_Init(GPIOB, &GPIO_InitStructure);. G7 {1 V! h2 Y  k2 X
  37.          SCL=1;//根据SHT30时序要求,默认时序是高电平(SDA拉低时,SCL跟着拉低,开始数据的传输)
    ! q0 Q1 N7 p9 X8 {( z$ A
  38.         SDA_OUT=1;//高电平还未开始数据的传输,拉低时开始数据的传输
    . R) }/ h( r* z
  39. }        
    - D. y# L# c5 `: N; Y
  40. //主机发送确认字符ACK5 f8 o5 a5 w+ C* ~! O8 D
  41. void IIC_ACK(void)//IIC协议,需要主机发送确认字符ACK来判断数据是否接收无误
    4 V+ s4 o% d& Z3 i* `
  42. {; h5 g! q7 h9 \
  43.   IIC_OUTPUT_MODE_SET();//配置PB7的SDA输出为推挽输出模式% f" I: y4 _1 o, W6 w
  44.   SCL=0;
    ) J6 u: x+ W: Z& f' W1 k# K( C
  45.   delay_us(2); ! ^& f# B* b  D; F
  46.   SDA_OUT=0;( g6 u, W% a1 w' G2 A. s! U
  47.   delay_us(2);     
    & o5 w$ Z" o" f) x% t
  48.   SCL=1;//数据接收完成之后,将SCL拉高,以便与后面主机发送ACK给从机4 t- H' R6 G- a( ?+ E/ O
  49.   delay_us(2);                  ; n& ~" K3 S- l2 e0 u. T
  50.   SCL=0;//数据接收完成,主机发送ACK                     
    7 c' R: k7 V# F  @, o: L
  51.   delay_us(1);   
    1 v( u0 E& W2 E& h! L
  52. }& K3 W' G5 o1 _0 E: i
  53. //主机不发送确认字符ACK
    . ^3 _/ ^( [; f; \' Z
  54. void IIC_NACK(void)//IIC协议,数据传输未完成或者数据传输有误,主机不发送确认字符ACK
    " k. }7 H# ~) z1 }
  55. {1 w# T, G% Z. ]7 U
  56.   IIC_OUTPUT_MODE_SET();//配置PB7的SDA输出为推挽输出模式( R+ l3 ^; V# Q/ Z6 f! G  Y
  57.   SCL=0;
    ( N- J* E8 A! A
  58.   delay_us(2); ! Z% `8 i2 J3 x2 ^6 \
  59.   SDA_OUT=1;
    - f& I# F4 |. G
  60.   delay_us(2);      
    1 R" Z* U: V( V
  61.   SCL=1;0 Q2 q. R" a+ |$ D( R
  62.   delay_us(2);                  
    . R1 \& h) h+ @7 L/ p  c% _. t1 e$ o0 W
  63.   SCL=0;                     4 d4 X% P- M* }  j3 R4 u' M
  64.   delay_us(1);    % X1 z" c; c; b5 M
  65. }1 W, E4 D  v$ ?2 u5 C0 Z0 v
  66. //主机等待从机的确认字符ACK% T2 z; _1 R9 W+ i4 l* W6 N
  67. u8 IIC_wait_ACK(void)//主机等待从机发送ACK,从而判断数据是否接收完成
    ( |+ ?3 Q( X4 |1 J& R
  68. {7 t% {# y5 f  s6 l0 \
  69.     u8 t = 200;
    / g. |. Y' U) n
  70.     IIC_OUTPUT_MODE_SET();
    / e. f" ^: p; J- ]. p0 \- F
  71.     SDA_OUT=1;//8位发送完后释放数据线,准备接收应答位 & R& |# \+ C  H$ Q/ D" s; E+ O
  72.     delay_us(1);
    * |2 e+ m2 k  v& w5 L. E1 i
  73.     SCL=0;
    $ W) b( c* E. m4 N- q
  74.     delay_us(1); . H( t2 C" `" b/ m8 v9 K7 H& E
  75.     IIC_INPUT_MODE_SET();- Z4 ?" P* N  k6 b; u$ q% D
  76.     delay_us(1);
    & I, e* U, f, i. r/ l
  77.     while(SDA_IN)//等待SHT30应答7 y$ u) Z8 Y8 Z" J) {. v: E, P. [
  78.     {- I' [& j8 W$ F: [. m; L3 s
  79.         t--;- x4 Z8 r# @. i. K2 `
  80.         delay_us(1); 6 Y# W: {) a' H* |: W1 E* y- H
  81.         if(t==0)
    ) `- N: N7 }: |9 s* u
  82.         {4 S2 u7 K+ T1 h. `1 R# K, n$ D
  83.           SCL=0;
    ' d8 l' c1 p1 u5 S
  84.           return 1;
    / O4 N8 f7 S- ^  h+ a4 r
  85.         }
    / E8 U/ n* q7 w" w
  86.         delay_us(1);
    2 u5 E# z  [/ X, [0 i8 {9 o, s  k
  87.     }, `% ^8 v0 {# e# s7 i0 q1 z+ ]
  88.     delay_us(1);      
      O7 y7 r: f8 e/ f
  89.     SCL=1;0 A, V, P' x! \* m% j  D
  90.     delay_us(1);4 M* x. U9 a2 n$ }3 Q$ E. l
  91.     SCL=0;            
    1 l# w" B8 {5 Z( c7 p  }% `# R* y
  92.     delay_us(1);   
    ! u4 e5 K" u1 u! K; y
  93.     return 0;        
    / `9 A  y. R; y; T# _
  94. }( H" r" G" j2 [
  95. //启动IIC总线进行通讯,发送IIC通讯的起始条件
    6 j* S" v/ u1 q3 O" w2 w
  96. void IIC_Start(void)//启动IIC通讯* ~% @" c3 ~# z6 G2 G
  97. {
    8 g& Y$ X& u$ x1 K6 D; ^8 z
  98.   IIC_OUTPUT_MODE_SET();//设置PB7的SDA为推挽输出
    7 O! H9 X; w; l- W" t
  99.   SDA_OUT=1;//根据SHT30时序,启动之前,SDA配置为高电平* k3 `  ?6 C3 B8 H8 D. p  G
  100.   SCL=1;//根据SHT30时序,启动之前,SCL配置为高电平2 V! x( R  H! e/ k, d
  101.   delay_us(4);//延时4us,给硬件一个反应时间4 l  M+ \/ e* M1 G" e! u
  102.   SDA_OUT=0;//SDA引脚拉低,开始数据的传输, f: I) {" K& d8 U& A' E. C" C
  103.   delay_us(4);
    - K8 x+ i. r/ ^
  104.   SCL=0;//SCL拉低,与SDA对应,响应SDA数据的拉低,表示正式开始数据的传输
    $ D7 L, `) E# [: y
  105. }
    6 I, B5 {6 _) ^# ?5 X

  106. $ {/ H9 H% c4 g6 ?+ U" J
  107. //结束IIC总线通讯,发送IIC通讯的结束条件
    2 P; m6 X0 Q/ C( ]2 F
  108. void IIC_Stop(void)
    ( R* q7 Q8 w. B0 T
  109. {
    + R: e- _2 d/ V4 T& e
  110.         IIC_OUTPUT_MODE_SET();8 l, V8 p' p4 V) r1 E
  111.         SCL=0;//结束IIC通讯之前,查看SCL是否是拉低状态
    : q. Z1 p" A% @
  112.         SDA_OUT=0;//结束IIC通讯之前,查看SDA是否是拉低状态  
    ; o, Q0 `* e- r; w
  113.         delay_us(4);        
    / T# ^) {! q# h- x
  114.         SCL=1;//将时钟拉高,表示已经结束IIC通讯
    7 {' \  R& V* \5 F; T- V8 _2 L7 T" B
  115.         delay_us(4);! a. e: [2 r' j% ~2 M4 ~3 T, p1 X2 M
  116.         SDA_OUT=1;//将数据传输引脚拉高,表示正式结束数据的传输
    + E# a  D$ q; b3 t+ ?/ O4 J8 _
  117.         delay_us(4);
    % |3 E; O% K6 h
  118. }" W; [1 `* x" o2 i% s+ s

  119. * J. w3 ?: S. O; S/ {* z
  120. //将byte数据发送出去0 a1 t% ]: @4 I! L' Z3 Z
  121. void  IIC_SendByte(u8 byte)4 K$ C" C, r2 c( T! H
  122. {4 ]) a$ z3 I& j0 @  |& }
  123.         u8  Count;
    9 l7 C/ T1 e2 w: o. M
  124.         IIC_OUTPUT_MODE_SET();, [: K7 {% C( y4 \1 k0 h- r
  125.         SCL=0;//将时钟拉低,开始数据的传输
    1 V, u* I  L; n  Z
  126.         for(Count=0;Count<8;Count++)//要传送的数据长度为8位
    6 {& }5 A  H3 @
  127.         {
    " D& b& P( O5 }/ U) ?# k, |: n" B" B, `
  128.                 if(byte&0x80) SDA_OUT=1;//判断发送位,发送位为1,则还未发送数据" }, y& b" B1 _4 {* n
  129.                 else SDA_OUT=0; //判断发送位为0,则开始数据的发送9 j6 U% N' x3 s; F
  130.                 byte<<=1;
    0 I2 F1 Y1 q4 p
  131.                 delay_us(2); 0 b  O" S& O3 W
  132.                 SCL=1;. R! r- ~6 G- S' u7 K$ j3 a
  133.                 delay_us(2);5 }% m, _/ {4 o' z$ w: r* O6 n
  134.                 SCL=0;# R* R* t, V# E) h5 H2 x
  135.                 delay_us(2);/ l4 o+ t- H' s
  136.         }
    / H, `3 w3 t2 }6 q6 t3 r2 j/ G# c
  137. }
    " G( n4 K  g; O5 i: ~0 M
  138. . E  _8 h6 f/ |1 J9 o, L& ?
  139. // 用来接收从器件传来的数据    9 v% Y" A5 A. t3 O4 `1 L, M
  140. u8 IIC_RcvByte(void): i( v3 }4 `3 q' X; B$ z
  141. {
    # X0 o) o$ ]9 F0 y2 Q3 T' O
  142.   u8 retc;
    - ]+ v0 k, b; F* x4 ?
  143.   u8 Count;
    & H6 o/ ]8 ^) \6 x' \7 E
  144.   retc=0; . r5 n- x; e; J; o  o* s7 H
  145.   IIC_INPUT_MODE_SET();//配置数据线为输入方式0 F7 g" b/ Y" I
  146.   delay_us(1);                    
    ; k  W/ [% ^! C9 d( j) \: A
  147.   for(Count=0;Count<8;Count++)
    % ]/ A1 k' R9 e
  148.   {  
    - g9 w1 ?3 {. ]9 U" j
  149.         SCL=0;//配置时钟线为低,准备接收数据位8 o" O$ I- ?0 R& u1 ^0 x* X6 q
  150.         delay_us(2);               3 y' c1 L  A2 v, i" x- e: P1 x6 X
  151.         SCL=1;//配置时钟线为高使数据线上数据有效               
    7 x& t7 ~# \. M- ]' X0 \, s" C, G0 Q
  152.         retc=retc<<1;6 w  w6 `7 f, _$ r$ y6 x. C/ b
  153.         if(SDA_IN) retc |=1;//读数据位,接收的数据位放入retc中 4 {4 `, X* w# |1 a6 J
  154.         delay_us(1);
    & I4 G5 ]( j% V; K6 d; U9 J' h
  155.   }; z1 t4 N! y1 e
  156.   SCL=0;   
    5 [: ?+ L7 N8 n  o6 U! K3 g
  157.   return(retc);! o- ~& \' f8 y) Z0 C2 C
  158. }( H2 _4 T5 {) l; V8 |1 y
  159. //用来接收从器件采集并合成温湿度
    , e1 }3 h% H# _
  160. void SHT30_read_result(u8 addr)
    ) G4 n& ?! r7 r" ~  V7 {; m  x
  161. {3 ^5 f! a8 j) B" J1 n4 t
  162.         //SHT30有两种读取数值的方法,分别是状态查询和数值查询,这里我使用的是数值查询,发送指令为0x2C06
    ) Q" |1 K4 _2 G3 n
  163.         u16 tem,hum;//定义存放温湿度计算公式的变量
    . p9 t( D! O$ O
  164.         u16 buff[6];//定义6个字节的数组,存放温度高、低八位,湿度高、低八位,两个字节的CRC校验位
    0 }& t4 H/ a' ?! c$ b) C; \
  165. ; Q" a+ O. [4 T, C# O; x
  166.         //发送指令为0x2C06(默认)
    . J; @  e9 a+ g7 L5 b8 a
  167.         IIC_Start();3 y  l1 v3 K) E& q% [
  168.         IIC_SendByte(addr<<1 | write);//写7位I2C设备地址加0作为写取位,1为写取位
    * `. Z5 s, M3 @8 ]3 Z
  169.         IIC_wait_ACK();" W) p4 {& V; g! V; v! ?
  170. //        delay_us(1);
    8 p* F. N; v+ D6 f  `/ ]) H
  171.         IIC_SendByte(0x2C);//前半段发送指令为0x2C: ~: J* V( j! ]$ J
  172.         IIC_wait_ACK();
    4 d0 W  _) n" M; i/ t( |
  173. //        delay_us(1);
    4 B. H9 P' @0 J1 @! M3 l
  174.         IIC_SendByte(0x06);//后半段发送指令为0x06& l3 Y8 ^; x& x* X2 ^
  175.         IIC_wait_ACK();
    7 G; C4 C0 p9 |: v' N3 T, P5 P
  176. //        delay_us(1);) w2 M: j  a8 a- m8 V
  177.         IIC_Stop();
    ' M1 _1 W( [5 \9 a7 T* ~  l! p1 u
  178.         delay_ms(50);
    9 b$ ^$ d8 b- Q" |; o# C  J4 q! F3 n
  179.         IIC_Start();$ {/ t7 `) j9 m& X+ |5 @8 O
  180.         IIC_SendByte(addr<<1 | read);//写7位I2C设备地址加1作为读取位,1为读取位' F% t3 u( L- k4 u- l' A3 [6 [  P
  181. //SHT30返回的数值是6个元素的数组
    ; A9 Z2 E: s8 p+ y
  182.         if(IIC_wait_ACK()==0)
    2 y9 I1 M  K) W: M( @/ J
  183.         {
    ( |; I# b0 c# `/ Q+ P: j6 W, h
  184. //          delay_us(1);0 S0 G; }( ]' D- O# _- _" ]
  185.                 buff[0]=IIC_RcvByte();//返回温度高8位
    7 y: B- G; Y* M' I. e+ S  l
  186.                 IIC_ACK();
    $ J$ l6 j8 m% g8 t" l/ w
  187.                 buff[1]=IIC_RcvByte();//返回温度低8位
    " m  x$ V6 K5 F: Y4 @; A, W
  188.                 IIC_ACK();
    , `! n8 L- a( M" X% d
  189.                 buff[2]=IIC_RcvByte();//温度crc校验位
    ; e$ q/ b6 q9 m; e2 m5 P
  190.                 IIC_ACK();; T1 G$ |3 h# b) M, C' M
  191.                 buff[3]=IIC_RcvByte();//返回湿度高8位
    4 B$ I# ?3 O3 m; f  W( g% w5 X  X- ^
  192.                 IIC_ACK();  P8 ?& t( E' i! j- K
  193.                 buff[4]=IIC_RcvByte();//返回湿度低8位
    % y5 z! j) P3 Z7 v
  194.                 IIC_ACK();
    & w: e$ y( F9 U2 o
  195.                 buff[5]=IIC_RcvByte();//湿度crc校验位( ?7 J9 E, F8 u: N
  196.                 IIC_NACK();: _. H! l: g, B/ b+ D4 o
  197.                 IIC_Stop();5 j, ]; Q* q) g/ x1 y
  198.         }' J' C( P  ?2 Q- Q
  199. //        tem = (buff[0]<<8) + buff[1];) O/ R& `' s, x4 T$ r7 \3 W
  200. //        hum = (buff[3]<<8) + buff[4];
    # S. b; B# e( t1 I6 e
  201.         tem = ((buff[0]<<8) | buff[1]);//将buff[0]采集到的温度8位数据与buff[1]采集到的低8位数据相或,实现温度拼接3 I. v0 Y# A" h6 C0 {- Q, N; u) ]
  202.         hum = ((buff[3]<<8) | buff[4]);//将buff[3]采集到的湿度8位数据与buff[4]采集到的低8位数据相或,实现湿度拼接. f% ]# s7 b2 l+ X
  203. 5 @) e  A$ ^: F9 F! d! o( j, F
  204. //查询SHT30数据手册可知,温湿度的计算方法如下        ' R* S/ A2 y, y- ?
  205.         Temperature= 175.0*(float)tem/65535.0-45.0 ;// T = -45 + 175 * tem / (2^16-1)  W# X/ {. ^) M: c& @& D
  206.         Humidity= 100.0*(float)hum/65535.0;// RH = hum*100 / (2^16-1)1 ~6 x% l! q0 t7 h$ d
  207.         / C5 ^8 f  Y7 L' [. e: m
  208.         if((Temperature>=-20)&&(Temperature<=125)&&(Humidity>=0)&&(Humidity<=100))//设定温度和湿度的阈值,超过这个阈值则返回错误提示) m8 G  d& T+ p+ _  U9 n
  209.         {
      N3 t; E- J6 Z
  210.                 //printf("温度:%6.2f℃\r\n",Temperature);& q, _3 w+ I0 V9 O5 R9 x
  211.                 //printf("湿度:%6.2f%%\r\n",Humidity);: Y4 A3 a; @' ~& |
  212.         }
      H9 n7 C: ~( d. s4 M/ t1 S; [, |
  213.         else
    + [- i4 a% r8 C6 f
  214.         {7 C. n4 }9 ?4 M7 `" _
  215.                 //printf("温湿度超过给定阈值!\r\n");
    " n; R: T/ C: x8 k, I& y1 `; h  o
  216.         }% ?+ w% [7 ^8 U4 Q6 y( P  z/ t6 g
  217.         hum=0;
      B, P, l' r0 o# S9 _9 d
  218.         tem=0;        ' n' H- t7 A* t7 B
  219. 1 c* {$ _; P" E. Y
  220. }
复制代码
, \6 T4 g- |6 o0 C' B- ^* g
下面这两句不明白的小伙伴,我另外一篇博文会专门介绍2 ~$ F/ U8 \; C5 O0 u8 e

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

2 h, D* |9 O  w9 \# P三、主程序! W$ Z# {; i( O6 u
main.c
( q  V4 \2 Y6 R9 K3 A! c7 ^: _$ s7 q$ g8 d, [" d. N% c% D$ n- E$ O

  1. , U/ L& H+ t4 G0 |
  2. /*------------------------TFT3.5接线--------------------------2 S1 P$ q: I/ |/ E* }# j
  3. 3 v* `. t' j$ x! x; W
  4. //              GND   电源地% B" u: L/ F8 H8 p$ }- V
  5. //              VCC   3.3v电源8 i6 ]( t8 k0 z% t1 D
  6. //              SCL   PA0(SCLK)
    0 a* n7 ^3 ^- V9 d- ]& q; i
  7. //              SDA   PA1(MOSI)
    % _  C& @3 y( y" W  Z" ^
  8. //              RES   PA27 m6 l% b! \6 c  e
  9. //              DC    PA3
    ) z2 a& G( @1 i: ~+ b, p# I
  10. //                                                        BLK   PA4 控制背光
    + _/ m2 @* x: R5 L! i& M
  11. //              MISO  PA5
    1 r# p2 g, w( ], e
  12. //              CS1   PA6 1 m9 K+ G7 Z' t
  13. //              CS2   PA7
    8 V) l9 z( `0 n
  14. ----------------------------------------------------------------*/% m; e- u+ E. r5 \9 {

  15. & t0 |8 M. m! }- h/ M$ }  x: X
  16. #include "delay.h"
    0 g7 G( s. U# s/ h
  17. #include "sys.h"
    , J# O* v: t& g, M. O; S* Y$ k
  18. #include "led.h"
    & ~) w, G* _, Z$ M; i
  19. #include "lcd_init.h"& P; p) e* |; w! b
  20. #include "lcd.h"
    ; Y& t8 V, h( h4 k- I4 n
  21. #include "pic.h"( M! r  {% ^" K1 f: t2 w
  22. #include "usart.h"5 O8 v) D3 H1 T6 p
  23. #include "SH30.h"" W+ t. j* @+ C- q4 A- F

  24. / w9 }! w2 y$ H+ E( |' @

  25. & [7 M5 G& r2 f- W3 G4 J- p
  26. extern float Temperature;
    8 `* ~0 i% u+ P5 d
  27. extern float Humidity;# M$ ~. m/ n8 d" U1 A& j6 W
  28. + |8 F" s5 y4 z0 }! U# @$ w: W
  29. unsigned char buf[2][24] = {0};$ z$ B1 J7 V2 j, j: ~+ f, ~6 J# A
  30. 5 v2 e/ O" J9 J! c5 x7 y
  31. int main(void)
    ; U3 s7 S/ y7 e0 Z( ~
  32. {
    9 U; p/ a4 x; {$ N" V  B
  33.         u8 i,j;: u2 s" h& V2 B, j& A
  34.         float t=0;2 g' X: u& t! ~  j8 G6 C
  35.         LED_Init();//LED初始化& ~( Y6 h) `2 f2 `9 L+ L- ~
  36.         LCD_Init();//LCD初始化
    9 \8 h" Q3 |5 V$ h! f' u6 z
  37.         SHT30_Init();: b# P$ S# t& D# \
  38.         uart_init(115200);
    3 N) U' b5 M* Y
  39.         printf("SHT30初始化正常,已准备就绪!\r\n");
    8 N4 x" O( d$ ~1 Y0 ~( Q/ [
  40.         LCD_Fill(0,0,LCD_W,LCD_H,GREEN);% U5 D$ e. x- l( n" N* ?4 l9 j

  41. . ~2 @1 @$ q' t
  42.         while(1)
    ! M3 c( T: V1 N! p0 Y
  43.         {               
    # O+ D# P5 ~" l% c6 R+ V
  44. ; R) v* F9 H. a7 I7 x5 c' P
  45.                 SHT30_read_result(0x44);$ b# R7 ]/ T% w4 d9 G; N
  46.                 sprintf((char *)buf[0],"Current Temp:%.2f",Temperature);4 X4 d" X6 \! y! d1 J$ U4 H/ u
  47.                 sprintf((char *)buf[1],"Current Humi:%.2f",Humidity);        ' ~, y! B7 K0 G
  48.                 LCD_ShowString(40,120,buf[0],WHITE,RED,32,0);
    $ [2 L% `" L6 D" t  N5 X  d
  49.                 LCD_ShowString(40,160,buf[1],WHITE,RED,32,0);3 E; }: P; R' ~
  50.                 delay_ms(2000);
    $ N% ?& z& a9 f# R( U7 M. q
  51.         }
    & z; M% F" s* Z# N& B4 ~
  52. }; ~3 b3 E# l$ f2 l% H, @) ]( }0 m
复制代码
3 ~0 G; x" s: N% f' A: L# k) G
四、实验结果

/ z  k' i0 E4 w4 Z( n2 d$ w* |: {9 B- Y9 F
6a2a8f89b6714e60a365101e20d0efec.jpg ( N  F. U' V  ?; E
7 ?5 S  C  i* M% i2 C
————————————————  g; L/ d8 D& _2 r- N2 v! [9 W
版权声明:@slow-walker
$ h9 g9 v, ^: q3 O! s7 i7 j8 q( f( `- R

& z* U/ R1 r; w
赞 收藏 评论0 发布时间:2022-10-26 22:11

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版