【年中粉丝节】+SHT20传感器 今天收到年中粉丝节的活动,看了看,对不起了日天兄,我得水个好几篇文章了。既然是分享ST开发板与传感器的文章。今天先来个SHT20温湿度传感器。 先贴下参数图。 首先通信接口是IIC总线方式。 这张是性能参数。可以两个湿度传感器精度可以达到12bit分辨率,温度是14bit分辨率。 到这里我们需要看到其发送数据的时序,逻辑,同时知道需要知道寄存器的地址。 在程序中对应。虽然地址配置的是0x40,其实是在发数据的适合地址进行了左移一位的操作。 - float SHT2x_MeasureHM(unsigned char cmd, unsigned short *pMeasurand)& D& q7 ~* e3 Z! V) e9 d2 h7 w0 t
1 c! C1 P& y$ C% _" M- {* C$ h5 k! ~) r8 k9 n: r" r, t
6 C# \: l h8 Z/ Z, b9 Q- 8 h& k$ s$ y. O, Y
2 v; p* D3 ^; t1 y* c- char checksum = 0; //checksum
* h V, U" A7 l" h5 o; @6 F* k
7 S2 w2 q0 ]2 b" q, _- char data[2]; //data array for checksum verification, C( _$ j- u+ k: q) }/ `3 t% X* U
- & S! D. t# k! |' N, u5 s
- unsigned char addr = 0; g$ d5 ?% t* T5 u. w
' X5 q8 H4 {2 k0 k0 I- unsigned short tmp = 0;
# h3 g- i0 g" @3 D O( d2 ~ - : x/ u9 b/ `. `) w7 e- M' A/ [' ~
- float t = 0;
$ u* m4 ^+ E+ d6 F! {: ~* V2 x+ ^ - 5 p2 o ^. [) L
- 0 F3 l2 z9 S+ c# b- J5 Q
3 F3 _3 w+ q# _1 b2 b4 c- addr = SHT20_ADDRESS << 1;
; Q6 }: X" @5 y* F6 B$ s3 ~- p - ; b w9 r& S( J$ P k
-
* a5 P' o# l+ u. H. h, ]5 K0 `$ t( w$ ~, ` - " u. z1 h8 ]" M& u6 I
- IIC_Start();
) M% q* R. c3 b& s$ ^- ]8 {
9 V+ L2 M; y/ ^% n, ~- / F' G' l, C+ N6 v
- 2 Y$ I: X! v3 \/ W/ I& g1 K( T/ L+ w, q
- IIC_SendByte(addr);
+ l! K% i& M6 P
/ ?' V: F0 @" H" F. ^6 j( t- if(IIC_WaitAck(50000)) //等待应答
: V( P7 i- C, z& Q7 L; ^% | - ; g& N* N, i& G
- return 0.0;
' \4 x( ~8 p* a% d
+ [, A0 N( p& G8 Q, \) i" ^- . N7 w( R0 \1 H5 v5 E' e3 M
- ! ?7 R& k+ g; b/ }+ m5 o
- IIC_SendByte(cmd);
3 u* v4 ]; O4 F l* r6 I, e
/ I/ A; _' A9 [# @- if(IIC_WaitAck(50000)) //等待应答
- R* z. {+ Y( F4 F) v$ {9 l
- l, H( A1 W, |; x: `- return 0.0;. U+ w) J1 X7 [7 _8 S
3 V: a! P( n7 ~0 c m: a-
8 G( O( f* v: ? - $ z( W) N' w# R3 s: X
- IIC_Start();
1 h: D) z3 U% Y8 J1 p; I
4 J. q7 X t# \# ?6 V3 B-
! g, ~+ E" B, w8 k. s - 6 o0 a+ b N" w2 @* }
- IIC_SendByte(addr + 1);
: @1 b8 r4 z& y$ F: l4 V3 W% b8 H3 e
. z% H# y: N# a1 w- while(IIC_WaitAck(50000)) //等待应答
& f" }- B0 w' o" G2 w3 E! M* \5 P - ; S2 A; p1 [) S/ W
- {
1 B3 G- r9 D+ |% }0 h5 s - 3 w; q8 a% d; m1 M6 o( X$ b
- IIC_Start();
, u0 a7 r% h5 @, r0 m# g g - 2 x- J. |6 R3 e0 O+ I
- IIC_SendByte(addr + 1);
7 U: ] l2 A# l9 j) A" C" }# J - 8 V% n5 U' h- |. o
- }
5 o$ f! R0 T9 i5 y4 y; z% U5 M% t/ r
4 F7 z3 d' g V/ [! q-
/ g8 W9 [! m+ e" |. Q8 z" j# @
9 ?# z6 h& N4 r* a( N- DelayXms(70);
6 @& v1 j1 y6 T% e8 t
" ?- F$ ?) w4 s/ O% J6 G6 G6 G-
8 Q: ^' e4 n6 P# c% k( S+ {: g - ; \8 m3 s* H2 E7 `- l0 W
- data[0] = IIC_RecvByte();8 v+ u, v- M- f
- , i; F' s* |5 N
- IIC_Ack();
" q$ H* g; E2 G& r( @
! k* R2 _" U+ s3 N2 D V- K c7 {- data[1] = IIC_RecvByte();3 V8 O$ \7 |0 x3 Y+ k9 t
- ; e" Y. ]& o& H" p+ G3 s; i
- IIC_Ack();
: W# G5 A' m! b4 U
2 K! x, W+ `4 \5 t9 h7 T: ^- 3 S! q! o8 n/ j/ v
5 Z/ q# T/ A9 M6 g+ s- r- checksum = IIC_RecvByte();( {5 O9 @8 i) f2 b' G9 l6 [
- m7 ^( q' E' @$ x) s
- IIC_NAck();
! }, [7 ?/ G9 ], z: S. G6 h# t
- _6 l! p' E9 X$ h7 ]+ x- " R, ?8 m3 \3 O( f, r6 n0 ]
- . E! y' R3 z- r) V
- IIC_Stop();
, l { u" \6 ?/ F# f- V9 x - " O( N) Z( i" I# V5 g2 W# X" R
- + S/ N" K: U1 j4 m9 ?( f
- : a+ b) f- e1 P) o- H. h4 H
- SHT2x_CheckCrc(data, 2, checksum);* c( ^; E* v/ }5 T$ A3 }
- " _" N6 ~* m0 N% ~
- tmp = (data[0] << 8) + data[1];& H2 ^8 A- `- Z: ]4 x4 o# x. c
- ' h! f0 e. ]* o
- if(cmd == SHT20_Measurement_T_HM)4 B: ?" e- u) i# G
7 k- G5 o8 _% I- { F4 V1 }; F' r
- s$ G, }1 j9 E6 `
- t = SHT2x_CalcTemperatureC(tmp);" h' F3 ~* J- Y
6 \) ?, U6 r& Q- }7 r" `* Z; o2 }7 y! X+ v
/ d9 N. H5 o1 |, Q$ {( @' b8 M- else& O/ q5 `0 |6 V2 T
1 z3 d V3 ^+ }9 w- {2 W, D" C/ z4 Q
- 9 r0 Z6 v9 ]/ j" T# o
- t = SHT2x_CalcRH(tmp);
4 R! {$ C( L8 g
2 V* y' @+ j- F3 a6 o( E! s! P- } N, B7 @- w0 Y% A! Z
- 0 `' [. y! j7 }9 O+ n' F
-
, Y; W9 @. O7 L7 r' M
' O& P8 a- P; j* G. b2 C4 v- if(pMeasurand)
8 r3 ^$ X4 z( l C4 ]. c5 Z - ' e! m. G, Y* b2 S: p- a' d
- {! p. w: I. {4 }! r- R
( q% R- L5 P, Z. B3 h U3 f- *pMeasurand = (unsigned short)t;/ X$ Y$ l* F& G- U! Y6 B, L e
8 n B% P! ^. |; k3 x) a0 u5 p- }% E6 C, K: L& A8 l4 U8 `2 ^8 h
; h. ]! ?. u p0 N% m$ M- ) l2 j, i- m9 z- p- @% z
3 K( y" e K1 D. W3 u. V1 [. ~- return t; J1 h) w0 b4 S: Y
- * l# v9 P S3 U0 h3 C
-
# U ^ A$ q: J7 I3 c5 a4 H - . `% t0 X& s4 P
- }
复制代码
) L& N6 _, r' g! V7 K7 {上面就是对应的读取温湿度寄存器里面的值。 最后读取出来的需要进行转换。 如上图。 最终串口输出数据。 单片机使用的是STM32F103VET6。板子上还有其他传感器明天接着水。
" o$ G# U! ]) N3 Y5 Y. H# F |
一晚给你水一篇2 g0 R) K2 d4 }: X