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

基于stm32f103的SHT30温湿度显示

[复制链接]
STMCU小助手 发布时间:2022-10-26 22:11
基于stm32f103的SHT30温湿度显示
* N/ V+ M$ ?( {. i本次分享的是基于STM32F103C8T6单片机型号和SHT30温湿度传感器以及TFT(3.5)屏的温湿度显示实验" S" r6 J7 P, P  V$ L
本实验使用的TFT彩色屏的驱动程序由商家提供,我们只需要按照自己显示的形式进行相应的设置进行了。同时SHT30程序部分借鉴了这位博主的分享(表示感谢)8 `3 @$ n3 P4 B
1 p! o: Q7 _7 w, o9 v$ E1 p
一、硬件材料

! L9 ]5 w/ W7 q, g# `/ { LH@)J_7B42Y~BZRVP$T)L@T.png ' ^, P0 S2 [+ U, x8 D* J

0 D# `) m- \7 `- Y2 f1.stm32f10c8t6: y) T: f8 p1 m4 e1 u
7 A* S9 U, I$ T3 {  {+ r
29a7d20b030a445db701b825d8de0c54.png 0 ~) l, O; ]& ]3 i9 Q/ }/ u& z

1 r2 d& Z* G( m; g. D, V. G% U0 @2.sht30温湿度传感器; }! a; w/ l! }# X* z" t, a+ z* c7 z

2 R1 b% {4 g. K+ ]1 z 16a4f4830bb94ff2916c6d4a46e494fc.png
. g$ P3 O+ I9 H' f. m& l& _- y, j2 |: _6 r+ }0 l8 G
3.TFT(3.5)寸屏
$ q# w' u# v+ t% y, ^% J( I
# R+ E. A. }" I" { 20a08f944ef849a5a32adb592dc5b2d3.png " s; p: v" A% [5 R

: M+ E$ g& T! J" I  |6 {二、SHT30介绍
7 E/ d7 m; S7 t) [$ n+ B  Q/ M6 T$ f$ }* J2 {1 z; X0 D
sht30为4引脚IIC控制传感器,这里就不详细说这个模块了,知道怎么用就行了,和DHT11温湿度模块差不多。& D6 }) F2 e$ K& H, T

; b  o" G3 b; B6 @: m: Osht30.h+ \, `7 s1 p( Z/ v
) ?/ O" c: V* g! H$ Q& U  ~
  1. #ifndef _SH30_H; R: \5 d1 L: @8 ]9 S; f8 t& z$ T
  2. #define _SH30_H
    , k3 t' C6 O: j- m3 e/ H+ z, v  \
  3. ( q7 t5 X; a$ p# m, p0 ]
  4. #include "delay.h"1 j1 |$ `; G/ K  P
  5. #include "sys.h"2 J" ?9 V9 y1 s1 Q' ~
  6. #include "stdio.h"
    . B( Y; _# U& b7 M  L
  7. #include "usart.h"
    0 `1 j2 R/ |# y8 c
  8. #include "string.h"
    + C" E. B% T$ p# E. x
  9. ' n) ^( e7 b0 t  Q9 {: U5 t) I
  10. extern u8 humiture_buff1[20];
    1 P) ?* C2 O5 l5 ^: b
  11. 4 D: |$ Z( I7 N' F+ b
  12. void SHT30_Init(void);
    5 I% z1 a7 B& `; T
  13. void IIC_ACK(void);//确认字符,表示发来的数据已经确认接收无误
    $ b4 c. o9 Z( q/ d) |5 ^" F% b4 ]
  14. void IIC_NACK(void);//无确认字符,表示数据接收有误或者还未接收完成; W2 e2 b( G3 j* q
  15. u8 IIC_wait_ACK(void);//等待接收确认字符3 H* x9 m5 s" N
  16. void IIC_Start(void);//等待IIC传输数据开始% a, _( v4 `2 j7 k: c  {6 [
  17. void IIC_Stop(void);//IIC传输数据停止
    9 L! z& p/ P) A" E
  18. void IIC_SendByte(u8 byte);//IIC发送数据
    % m! W- C1 ?! S5 g9 q: s. g
  19. u8 IIC_RcvByte(void);//IIC接收数据
    9 x: @( \4 H7 m2 m2 ^( A
  20. void SHT30_read_result(u8 addr);//SHT30温湿度传感器开始读取数据. E( B1 d2 a% B2 N% \. F
  21. #endif
复制代码
% ]4 [; g* A+ z  c  e4 T) R
sht30.c
) P' z+ k" a, v& _( M6 b0 E( e$ l4 k6 C
  1. /*' d: r1 r4 h, v' x- c) u% W7 p
  2. 设定温度阈值范围:-20℃——125℃
    9 @/ [) P# j/ @1 V/ z% D
  3. 设定相对湿度范围:0%——100%
    " Y2 e% J* ~- \, f2 ?
  4. */
    : Q0 z. p* e  C' P3 ]' E8 v# x
  5. #include"stm32f10x.h"
    9 Y' c" t2 ]* t4 G% Z* E
  6. #include"sh30.h"
    ! E- [& g$ @8 g0 W" X. D
  7. #include"stdio.h"
    - {' {( U. {) p
  8. ) R( Y, ~. Q! c4 P
  9. #define write 0 //IIC设备地址一般是7位,也有10位,本程序使用7位IIC设备地址,第8位是写命令
    ! ~' r1 ?4 ^7 _& q+ e6 a! J
  10. #define read  1 //IIC设备地址一般是7位,也有10位,本程序使用7位IIC设备地址,第8位是读命令
    % t0 o0 P, `" {% ]& O

  11. % f# v' q; d* Z/ x$ e
  12. //IIC总线接口定义, \8 \0 P( J4 e/ z
  13. #define SCL PBout(6)//设置时钟端口% o1 N; g$ J& c$ q7 d
  14. //SHT30数据SDA传输口,有输出也有输入,所以需配置它的输入和输出
    0 k! a: F6 x  [- v# ?0 x# r& u
  15. #define SDA_OUT PBout(7)//设置输出数据端口& l2 m: a, U! \6 W* N9 q: O& y9 g, O
  16. #define SDA_IN PBin(7)//设置输入数据端口
    1 N2 X3 v, N  i2 b
  17. //设置端口高8位的工作模式(具体可以参照端口位配置表),即I/O输入输出方向设置,先用与(&)对PB7引脚的四个位清0,再用或(|)置1
    : P8 z2 L) J3 R2 I- a$ G
  18. #define IIC_INPUT_MODE_SET()  {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=8<<28;}//改变PB7对应位为1000(CNF[1:0]MODE[1:0]),设置成上拉或者下拉输入
    & H0 w4 w0 x4 U  X1 x6 N' ?
  19. #define IIC_OUTPUT_MODE_SET() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=3<<28;}//改变PB7对应位为0011,设置成通用推挽输出
    . I5 a: F9 a( p
  20. //#define IIC_INPUT_MODE_SET()  {GPIOB->CRH&=0XFFFF0FFF;GPIOB->CRH|=8<<12;}//改变PB7对应位为1000(CNF[1:0]MODE[1:0]),设置成上拉或者下拉输入
    # {% O) q; K' U" C8 T6 O& t7 F
  21. //#define IIC_OUTPUT_MODE_SET() {GPIOB->CRH&=0XFFFF0FFF;GPIOB->CRH|=3<<12;}//改变PB7对应位为0011,设置成通用推挽输出# y) B6 }' H' x& ^+ g7 W
  22. 2 @( @) G* j- q: l# `/ J
  23. //定义温湿度存储变量
    + n1 c, v, C0 U5 e
  24. u8 humiture_buff1[20];1 I# z/ G2 ]8 D

  25. 8 y  ]- t# k- M7 c0 E/ T
  26. float Temperature=0;//定义存放温度拼接的变量Temperature,初始化温度为0
    9 O! W5 F/ R/ ^9 V8 p4 K: e2 n6 e- v
  27. float Humidity=0;//定义存放湿度拼接的变量Humidity,初始化湿度为08 [9 |8 T' |1 z

  28. ( r9 G3 J# U: p1 O
  29. void SHT30_Init(void)//初始化SHT30的SCL与SDA接口
    6 r( Z* O9 W/ x+ m/ s. M
  30. {
    . n- H  r4 h7 f' J6 a" x
  31.         GPIO_InitTypeDef GPIO_InitStructure; $ s/ e2 [- c" U4 M+ P
  32.         RCC_APB2PeriphClockCmd(        RCC_APB2Periph_GPIOB, ENABLE );        % Y# c% K( R2 f% g5 h3 v) C7 H
  33.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;//定于SCL连接到STM32的PB6引脚上,定于SDA_OUT/SDA_IN连接到STM32的PB7引脚上
    - N8 w8 X! ], _
  34.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;   //推挽输出
    6 {3 X6 v  u0 z+ W. X
  35.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;3 ~  c: ^0 K) N' e6 f
  36.         GPIO_Init(GPIOB, &GPIO_InitStructure);
    : T2 f; J/ Z) m1 N9 D; @
  37.          SCL=1;//根据SHT30时序要求,默认时序是高电平(SDA拉低时,SCL跟着拉低,开始数据的传输)
    . V, p) F1 ~( l
  38.         SDA_OUT=1;//高电平还未开始数据的传输,拉低时开始数据的传输
    $ {1 y0 y, J2 Z$ q
  39. }        ' h+ `0 V1 q  J2 [, }/ n5 ?& T
  40. //主机发送确认字符ACK
    5 n0 Y% F9 J& o9 w$ `8 ]0 e
  41. void IIC_ACK(void)//IIC协议,需要主机发送确认字符ACK来判断数据是否接收无误
    ( E) X+ s* J2 t0 X" h
  42. {
    " @5 x! v; N3 |; b, t
  43.   IIC_OUTPUT_MODE_SET();//配置PB7的SDA输出为推挽输出模式% k* H1 }- O8 `( d
  44.   SCL=0;
    ) z4 c' c, g3 w7 v, l$ _# _
  45.   delay_us(2);
    ! e! s+ g. z8 O, Y
  46.   SDA_OUT=0;9 H1 r4 S: D+ H3 J" h
  47.   delay_us(2);     
    ( X$ }) K+ A: k# W$ Y
  48.   SCL=1;//数据接收完成之后,将SCL拉高,以便与后面主机发送ACK给从机
    . i( w. \: j" W0 H
  49.   delay_us(2);                  
    $ b  {8 ^9 T7 t1 k2 S5 p6 w
  50.   SCL=0;//数据接收完成,主机发送ACK                     ; g- e6 Y% x& w: a! x4 `
  51.   delay_us(1);    " Q+ A' y2 P( R9 `
  52. }8 h$ @: h1 {4 }7 R( [0 V
  53. //主机不发送确认字符ACK* J( M+ z, J, N; n3 z# H9 {
  54. void IIC_NACK(void)//IIC协议,数据传输未完成或者数据传输有误,主机不发送确认字符ACK% P  i; {$ z0 h0 S5 C
  55. {% L( v* o. J% _
  56.   IIC_OUTPUT_MODE_SET();//配置PB7的SDA输出为推挽输出模式* ^8 L6 A% }4 @( g- `
  57.   SCL=0;) ~- W4 X- @8 n7 Q
  58.   delay_us(2); 0 J, S" q- c2 Y$ U; O5 Y
  59.   SDA_OUT=1;
    8 _  ]! c6 i" i
  60.   delay_us(2);      
    - j, W) J# A8 U. f  c/ q5 m1 Y
  61.   SCL=1;
    4 b0 w8 c! m) _0 Y5 k. D
  62.   delay_us(2);                   & F( w& u$ ^+ @. h2 {5 f2 b4 H
  63.   SCL=0;                     
    5 n( K, ^  e2 g
  64.   delay_us(1);    - ~8 @: K0 z. u1 Y, Y! b. t
  65. }
    8 S' d; u% }' b, x1 }; Y
  66. //主机等待从机的确认字符ACK. L5 V/ t3 r+ n9 J
  67. u8 IIC_wait_ACK(void)//主机等待从机发送ACK,从而判断数据是否接收完成. T9 {" T4 m) ^8 b/ @
  68. {
    / X( \; m6 ?* ~* Y. t
  69.     u8 t = 200;8 Q' o$ {2 {; p3 o/ i
  70.     IIC_OUTPUT_MODE_SET();
    : B+ k! ?- n7 K5 n. \0 T
  71.     SDA_OUT=1;//8位发送完后释放数据线,准备接收应答位
    * f" u5 H, {7 o2 T0 S3 b
  72.     delay_us(1);
    6 X* \1 B6 a) S# n) M
  73.     SCL=0;
    - H. u: Y7 Z2 q2 \- _* M! k3 i& I7 c
  74.     delay_us(1);
      j1 V( v# k5 o$ h; B* `- |5 A3 \
  75.     IIC_INPUT_MODE_SET();
    3 r, r) ^6 n9 R( r6 [, K
  76.     delay_us(1); 3 P- g! d* h% o( c6 g4 d" e( m
  77.     while(SDA_IN)//等待SHT30应答7 T8 C% z* f5 f& b* q3 k
  78.     {
    ( K- i4 H% }1 u
  79.         t--;) P, T% N$ j  N1 I1 r
  80.         delay_us(1); 6 E1 G3 x. K; B2 M0 z
  81.         if(t==0)& R, k" X8 I7 e* c8 L
  82.         {
    , f/ w- W+ t9 Y/ P) _
  83.           SCL=0;
    6 |* s: h- x& `* f
  84.           return 1;
    5 m6 ?( q9 }& F. U
  85.         }: }1 k+ m9 T7 B, R: W( \
  86.         delay_us(1);
    ) _& x/ q. G2 E# w/ ?3 v
  87.     }; Z! G6 G0 \+ Z8 a0 k
  88.     delay_us(1);      + B. \9 A$ N- _9 q% r' l8 l+ L
  89.     SCL=1;
    ( A7 T+ r0 s. t: d; B2 y3 F" z/ |! Z, C
  90.     delay_us(1);
    - {9 }$ {0 e5 @, B2 s& @' U- z
  91.     SCL=0;             : R* l. }& S+ \- B- j+ @1 v' o
  92.     delay_us(1);   
    6 \* W# Y: q2 ]8 f0 G
  93.     return 0;        
    : c) ~9 }1 q0 y
  94. }) \* ]" q  r+ h# B0 M
  95. //启动IIC总线进行通讯,发送IIC通讯的起始条件8 h, o1 a  B8 V7 N' x* s; {) @" e
  96. void IIC_Start(void)//启动IIC通讯# |) D6 ?2 o+ |, n
  97. {& o* r4 _8 j' g; p+ T2 l9 _. g
  98.   IIC_OUTPUT_MODE_SET();//设置PB7的SDA为推挽输出3 p# R) b! c( n+ ^
  99.   SDA_OUT=1;//根据SHT30时序,启动之前,SDA配置为高电平. t2 U1 l' X; U3 v. d
  100.   SCL=1;//根据SHT30时序,启动之前,SCL配置为高电平
    . r  s( {! [! f& n* w( C) K; z* f
  101.   delay_us(4);//延时4us,给硬件一个反应时间$ m+ l" r9 C$ B. K
  102.   SDA_OUT=0;//SDA引脚拉低,开始数据的传输
    2 T0 t1 p4 r. }4 s: i
  103.   delay_us(4);: P7 |; z6 ~% x& e/ S" w& O0 E
  104.   SCL=0;//SCL拉低,与SDA对应,响应SDA数据的拉低,表示正式开始数据的传输& W, @9 [5 l4 H3 @4 Q, P
  105. }% ^# V) W) e0 b

  106. 0 Q4 [2 N0 @+ D9 ]  d* U4 U4 j) @
  107. //结束IIC总线通讯,发送IIC通讯的结束条件9 v4 p$ L" I& {, g
  108. void IIC_Stop(void)% V  ]9 S: V" V% l- v. q/ z* P# W* H
  109. {* X. a' S: a) N* c3 s
  110.         IIC_OUTPUT_MODE_SET();" @1 q% o1 W: d, x2 A$ z4 X0 U
  111.         SCL=0;//结束IIC通讯之前,查看SCL是否是拉低状态
    ' h2 f' @1 m" ~( N- m2 L
  112.         SDA_OUT=0;//结束IIC通讯之前,查看SDA是否是拉低状态  " ?  v( a  U" J. A9 `9 u3 T/ ]! W
  113.         delay_us(4);        7 L3 e* G! k/ `. u" E8 j* n) e
  114.         SCL=1;//将时钟拉高,表示已经结束IIC通讯
    ; N- `4 _/ n7 P3 \$ v) a
  115.         delay_us(4);( g4 R) |* V% i5 ~; T
  116.         SDA_OUT=1;//将数据传输引脚拉高,表示正式结束数据的传输9 w& a+ W$ q" x8 v: i; q+ P. x5 K
  117.         delay_us(4);8 [. h, y( y/ L5 Y' s' `" Z
  118. }
    9 P2 w# k0 w, y' o6 C* F
  119. ; Y7 K  G; Q7 z" e3 P6 B: {
  120. //将byte数据发送出去
    1 N/ `% g' ]" n3 W- F6 M- x
  121. void  IIC_SendByte(u8 byte)
    5 J  K; d$ G+ t2 F, t0 i& y
  122. {: ^& C- J% f0 v0 r
  123.         u8  Count;
    ( T7 w+ B0 f5 A" U1 p$ q0 @! J
  124.         IIC_OUTPUT_MODE_SET();
    $ W) E0 L6 ^; ?( K& D
  125.         SCL=0;//将时钟拉低,开始数据的传输
    * I" c8 K; q9 k. B8 \
  126.         for(Count=0;Count<8;Count++)//要传送的数据长度为8位% _0 W# f* Q9 e' h( K" e
  127.         {( a6 |& Z& K9 J
  128.                 if(byte&0x80) SDA_OUT=1;//判断发送位,发送位为1,则还未发送数据: F9 [8 ~% U9 O- a, H) r1 h% R0 Q
  129.                 else SDA_OUT=0; //判断发送位为0,则开始数据的发送
    ) |: o9 }$ \; ~0 r2 |
  130.                 byte<<=1;
    ) ^5 F5 D& ]7 h/ Y& k. W) q' g% }
  131.                 delay_us(2);
    ' b' e* G- W+ z9 _( T% A0 q2 C
  132.                 SCL=1;
    ' a8 }& T2 L. c% g& u
  133.                 delay_us(2);
    : ~' A) G9 r6 s
  134.                 SCL=0;4 ?# f% k  G% [* b0 }# n. @
  135.                 delay_us(2);
    7 ]3 n+ h8 c' a9 N' l
  136.         }/ O/ k' v% U0 p9 b5 M  [
  137. }! O' s& k. o* N: k" L

  138. : I) g: W; \  {
  139. // 用来接收从器件传来的数据    9 u0 }& G+ F( i8 V
  140. u8 IIC_RcvByte(void)
    ) n  R- y, w' Q+ F; J2 ?. b
  141. {- L" {/ |' r' t0 H! Q9 u6 i
  142.   u8 retc;
    . \8 P& B7 Z6 |
  143.   u8 Count;! w( K* t( M) B9 a' K
  144.   retc=0;
    0 |# n: h: I9 s$ r/ i% Y' z
  145.   IIC_INPUT_MODE_SET();//配置数据线为输入方式1 d' R! h7 }( [9 c/ n( T
  146.   delay_us(1);                    
    1 C: H6 N- }. U) v  G- M4 u
  147.   for(Count=0;Count<8;Count++)( s3 q8 p) l! _$ o  c8 v6 y1 `
  148.   {  
    - O+ Q+ b+ k# _5 ~5 e+ P
  149.         SCL=0;//配置时钟线为低,准备接收数据位
    & P3 K! M9 j$ X3 }! |3 y: Z$ V' c
  150.         delay_us(2);               
    / o, a/ x. h6 t) v
  151.         SCL=1;//配置时钟线为高使数据线上数据有效                8 [: d7 r  ?- D+ p4 O; X
  152.         retc=retc<<1;
    2 I* q# y' ~" @8 \) D2 M) k
  153.         if(SDA_IN) retc |=1;//读数据位,接收的数据位放入retc中
    * T) r6 q( a3 V9 R
  154.         delay_us(1);
    % a! ~# S/ W0 w& _2 l3 l0 n
  155.   }6 }4 B9 V+ T. ^
  156.   SCL=0;    % L% m2 ^; [. n! J- r
  157.   return(retc);7 h5 F& B! K6 c0 t* S, y; u6 l
  158. }0 u+ B9 R0 C: }1 Y0 d0 Y6 e
  159. //用来接收从器件采集并合成温湿度
    9 N0 A& |; q) r+ d5 {% q/ Y! U3 ?
  160. void SHT30_read_result(u8 addr)
    # p/ U, ^+ w5 u$ W% @6 `! f
  161. {
    , @9 R+ ]9 _$ h' }+ M' j2 U
  162.         //SHT30有两种读取数值的方法,分别是状态查询和数值查询,这里我使用的是数值查询,发送指令为0x2C068 B& a2 d! U1 W9 w( \* ^
  163.         u16 tem,hum;//定义存放温湿度计算公式的变量
    / _9 w. u* a6 @- D$ B7 `
  164.         u16 buff[6];//定义6个字节的数组,存放温度高、低八位,湿度高、低八位,两个字节的CRC校验位) c9 W8 {! x: Y6 P. P# ?

  165. 6 {* a8 Y1 R: }* L, k% D
  166.         //发送指令为0x2C06(默认)- T! ]$ I) [: r( l5 [$ S- I
  167.         IIC_Start();  e8 A# A3 w. `* }( P; J1 T
  168.         IIC_SendByte(addr<<1 | write);//写7位I2C设备地址加0作为写取位,1为写取位4 d7 P$ l; d' J
  169.         IIC_wait_ACK();$ H  ]7 r! s/ O- H
  170. //        delay_us(1);
    2 n4 y) D  Q9 n- ^
  171.         IIC_SendByte(0x2C);//前半段发送指令为0x2C9 j6 `/ Q  o4 j- b' G2 v
  172.         IIC_wait_ACK();' }: [' _  `0 u
  173. //        delay_us(1);' r/ Y! [$ z1 f, X
  174.         IIC_SendByte(0x06);//后半段发送指令为0x065 R5 s" c6 d& }4 b- g/ w
  175.         IIC_wait_ACK();& @; c- b% u; m4 n
  176. //        delay_us(1);
    3 E2 Z% s5 B" Q7 j& P8 H
  177.         IIC_Stop();
    7 I5 Y/ b* C. c+ ^7 e( F' i
  178.         delay_ms(50);
    3 J, S  a( p3 \& j8 B; T9 A2 c
  179.         IIC_Start();% q1 r$ r3 P9 X, L  `: b0 q
  180.         IIC_SendByte(addr<<1 | read);//写7位I2C设备地址加1作为读取位,1为读取位; h' _7 X2 }" `* d2 W2 T7 i
  181. //SHT30返回的数值是6个元素的数组
    5 L5 Y4 r2 Z3 m1 b, ^% C
  182.         if(IIC_wait_ACK()==0)0 L0 q: D* \3 V, ~& U; y
  183.         {
    9 S! L% w5 `& P  J5 |+ F) E( }
  184. //          delay_us(1);
    9 n9 ^3 a1 i5 s/ i2 o; m! f  f
  185.                 buff[0]=IIC_RcvByte();//返回温度高8位
    + X) W  h# ~4 p
  186.                 IIC_ACK();5 |. ?$ ?0 U2 N+ K
  187.                 buff[1]=IIC_RcvByte();//返回温度低8位$ S- I7 b* i7 J4 ~3 @6 Z9 ^9 w! k6 E
  188.                 IIC_ACK();' C8 Z+ a% a9 T* A! _7 D9 D
  189.                 buff[2]=IIC_RcvByte();//温度crc校验位
    2 Q2 g: J& W9 o
  190.                 IIC_ACK();, e! t. d8 A3 G% @* d* G; _: h4 t& r- U
  191.                 buff[3]=IIC_RcvByte();//返回湿度高8位
    % ]* D8 ~/ g# H
  192.                 IIC_ACK();
    , D4 Z& T9 l- F9 [4 H; I
  193.                 buff[4]=IIC_RcvByte();//返回湿度低8位. O, `. v9 T! a4 X/ ^
  194.                 IIC_ACK();
    : w  r0 J6 X  U2 Z: k
  195.                 buff[5]=IIC_RcvByte();//湿度crc校验位. O" p8 e: H) f: g: s
  196.                 IIC_NACK();7 S4 C8 z6 d7 A! |: I- p9 l
  197.                 IIC_Stop();
      p/ y1 E7 r* h6 g2 G( k7 e  `' V
  198.         }: i& W+ w) U4 y  R" p* B
  199. //        tem = (buff[0]<<8) + buff[1];5 j9 U. r* O; \# c+ [) e, v* [
  200. //        hum = (buff[3]<<8) + buff[4];
    % d; [& ?8 v1 i" n: Y7 r' f0 `+ z
  201.         tem = ((buff[0]<<8) | buff[1]);//将buff[0]采集到的温度8位数据与buff[1]采集到的低8位数据相或,实现温度拼接
    + W1 {; @' }" g: P1 g" U/ K. i) @9 y) \
  202.         hum = ((buff[3]<<8) | buff[4]);//将buff[3]采集到的湿度8位数据与buff[4]采集到的低8位数据相或,实现湿度拼接& b/ i1 ^. p" G, U( M9 K. p
  203. 2 i2 X6 F2 a7 O. `7 P7 C
  204. //查询SHT30数据手册可知,温湿度的计算方法如下        
    0 ^8 X, K  s4 g$ r$ x
  205.         Temperature= 175.0*(float)tem/65535.0-45.0 ;// T = -45 + 175 * tem / (2^16-1)6 L: Q) g9 K7 G3 r
  206.         Humidity= 100.0*(float)hum/65535.0;// RH = hum*100 / (2^16-1); F9 R. }# a/ a, l
  207.         / q5 Z* e" b2 X  m1 ?( i. O
  208.         if((Temperature>=-20)&&(Temperature<=125)&&(Humidity>=0)&&(Humidity<=100))//设定温度和湿度的阈值,超过这个阈值则返回错误提示$ k0 p9 I* K* q# ?* w- N% t$ b, u
  209.         {
    ( s) S- n$ S: P* {8 J% |) i; n
  210.                 //printf("温度:%6.2f℃\r\n",Temperature);6 Z& Y0 M$ _& }' ^
  211.                 //printf("湿度:%6.2f%%\r\n",Humidity);4 N" ^1 U3 f8 ]# d+ R* F. f
  212.         }
    7 g0 K# ^( G$ T5 Q: c; R( |0 ]
  213.         else% q, C  }9 R! i8 X  \
  214.         {
    1 X' I- I! S. O6 s) _) z- M4 J
  215.                 //printf("温湿度超过给定阈值!\r\n");( H* t8 t' C  z8 D, V5 X1 U2 d
  216.         }8 i# N& k! c1 P: @2 t( g0 k
  217.         hum=0;
    ! S1 X9 }9 l6 i; D  J3 s2 Q
  218.         tem=0;        
    ! Q. ?9 d1 i$ h: ?

  219. 0 J$ O8 o# k  m
  220. }
复制代码
# C: B+ h6 `0 A( U' m
下面这两句不明白的小伙伴,我另外一篇博文会专门介绍
! Y5 B9 E5 g4 |  V8 C9 l+ R" x# _; o) {1 G* p2 m. _7 I( n- g# [* y
  1. #define IIC_INPUT_MODE_SET()  {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=8<<28;}//改变PB7对应位为1000(CNF[1:0]MODE[1:0]),设置成上拉或者下拉输入
    # E4 L7 W/ o/ _* \0 I' b
  2. #define IIC_OUTPUT_MODE_SET() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=3<<28;}//改变PB7对应位为0011,设置成通用推挽输出
复制代码
" f! A& A# ^* d$ b% Z' P; z2 K8 V& J
三、主程序- F  l% w4 ?4 C: r0 I, ]8 o
main.c% u; m; R4 v/ n# N$ H

5 i+ D8 f7 S) w  b
  1. % Q/ M- ~# z1 O) r  W
  2. /*------------------------TFT3.5接线--------------------------7 q1 _7 M$ o# P! b) j( \/ p

  3. - {7 f6 C; b( u0 \
  4. //              GND   电源地; U& R  h+ i% ]  z. ~
  5. //              VCC   3.3v电源
    2 G: g3 ?: l( P% J* m; y  Y0 }: n
  6. //              SCL   PA0(SCLK)
    ; d% C/ {' D3 y$ t7 d- q
  7. //              SDA   PA1(MOSI)+ o) E1 F2 s3 s  o
  8. //              RES   PA2
    - |9 P  X# y' R, C$ H3 M( k% U' k
  9. //              DC    PA3
    8 v: [% M4 J( E8 D0 L3 L
  10. //                                                        BLK   PA4 控制背光
    + k% Z8 H# u9 ]+ z
  11. //              MISO  PA5
    . O) K5 ~" S, v+ u2 }
  12. //              CS1   PA6 : l/ B) w3 b! p9 q+ V; M4 m" ?
  13. //              CS2   PA73 c' o/ k: ^/ V# t8 m8 T
  14. ----------------------------------------------------------------*/
    ) C' C; \# D- I0 E' Z# Y
  15. 3 L3 F/ ~% o( W2 y5 U) u
  16. #include "delay.h"
    % X9 W+ I7 ], y' M
  17. #include "sys.h"# J" a. i0 S/ i0 v6 \1 @
  18. #include "led.h"- a$ L9 t  I0 y$ a# c
  19. #include "lcd_init.h"" N4 W1 D% j. Y
  20. #include "lcd.h"* J- G! q  t0 w) x$ `+ g  ~
  21. #include "pic.h"
    / u, g( ~3 E7 O6 l9 w- W
  22. #include "usart.h", z7 ?* r# c- E7 q  R
  23. #include "SH30.h"5 f8 ~6 C' |7 e
  24. ' O; Q* A5 V! ]; t  e! U$ b4 `
  25. 5 G: J) o# q$ _6 r+ i2 S
  26. extern float Temperature;
    9 w3 Q/ ~" f' F, v2 l
  27. extern float Humidity;% k8 H' k0 C! m' U# ]. Z9 W. N5 k
  28. 4 k$ A3 v( Q7 }: w% t! F  L
  29. unsigned char buf[2][24] = {0};
    # C3 i2 o% t& T6 j
  30. " ^- g# w5 l6 E$ c, {. e5 K
  31. int main(void)
    # f: P* O- i: `( s* i' n; v2 v
  32. {5 c" |, p  ]* G: y
  33.         u8 i,j;( I6 b6 k0 V) M& [. }
  34.         float t=0;! _0 y' G  b6 v5 ~
  35.         LED_Init();//LED初始化* O/ P& e  }' {- Y5 l, `
  36.         LCD_Init();//LCD初始化: O4 r4 E( ]+ N- K- h1 {1 p
  37.         SHT30_Init();: v2 V" P4 @: O+ u) E' ~& m1 b
  38.         uart_init(115200);
    " L3 n4 r1 e5 n8 R& A
  39.         printf("SHT30初始化正常,已准备就绪!\r\n");
    8 E% L& M* P& E; o# n7 z$ q. x
  40.         LCD_Fill(0,0,LCD_W,LCD_H,GREEN);
    * q/ W- J# n& Q8 S
  41. % L9 C- u! U2 H
  42.         while(1)1 L5 M% }. }6 s6 E6 {3 s
  43.         {                4 S( j( ]$ l4 ?( c% F9 p1 g5 E
  44. ! M8 |: s! R6 U/ Z: ]* ^, u
  45.                 SHT30_read_result(0x44);# S3 n# t* `0 j) V) U! ]
  46.                 sprintf((char *)buf[0],"Current Temp:%.2f",Temperature);1 X5 o/ j  l. \$ e# o9 i" D6 l
  47.                 sprintf((char *)buf[1],"Current Humi:%.2f",Humidity);        
    6 J5 w* E! u' b* m' o
  48.                 LCD_ShowString(40,120,buf[0],WHITE,RED,32,0);7 N5 _% G3 @% F" Y1 J1 u
  49.                 LCD_ShowString(40,160,buf[1],WHITE,RED,32,0);
    0 ]% j( _1 g" D* B
  50.                 delay_ms(2000);
    - |. b3 n8 P! B* q* ^
  51.         }
    ( v) ?' i- }: G8 [/ {6 {& l
  52. }
    ) u# T2 N0 M+ v1 ~
复制代码

$ o; X5 s! n4 z0 c, U4 B四、实验结果
& X' u9 e3 Z9 t& R, `, `$ c8 ]

7 p0 g1 E- x* f" ~/ N( @5 x" I  o) j 6a2a8f89b6714e60a365101e20d0efec.jpg
9 m, l( I7 v% `2 ^6 L
9 f1 N: z0 t- c8 n: `7 l————————————————! r2 B% \0 b8 d* S9 W) H
版权声明:@slow-walker
6 `  t5 |. n, s
1 C. a: N; j; s$ L
3 U0 Y( M7 {: s# m) E& G* E
收藏 评论0 发布时间:2022-10-26 22:11

举报

0个回答

所属标签

相似分享

官网相关资源

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