【年中粉丝节】+SHT20传感器 今天收到年中粉丝节的活动,看了看,对不起了日天兄,我得水个好几篇文章了。既然是分享ST开发板与传感器的文章。今天先来个SHT20温湿度传感器。 先贴下参数图。 首先通信接口是IIC总线方式。 这张是性能参数。可以两个湿度传感器精度可以达到12bit分辨率,温度是14bit分辨率。 到这里我们需要看到其发送数据的时序,逻辑,同时知道需要知道寄存器的地址。 在程序中对应。虽然地址配置的是0x40,其实是在发数据的适合地址进行了左移一位的操作。 - float SHT2x_MeasureHM(unsigned char cmd, unsigned short *pMeasurand)0 x, G! J! C. e
$ s8 o, w3 n0 b5 r( |- {
3 N& J5 R( z3 n! ?
) o, y) \; r X- d1 M# L" g: g; t- 9 ~( f1 ~! F8 F
- 3 h! g5 t2 ]7 R
- char checksum = 0; //checksum
! N1 G7 } p: s! \$ h4 J - ' W. |+ }6 K M4 a
- char data[2]; //data array for checksum verification
3 ~9 V% a# \1 B/ }( O) Y* C - ! B4 d3 ^! D- H) |% Q
- unsigned char addr = 0;
* V. [( U. k4 @" j$ C* Q F - & f5 ~# U4 e: b
- unsigned short tmp = 0;& [4 O: K$ `/ X! r( k# v/ w
7 `) B0 P# U0 ^2 M& w- float t = 0;
3 f, j$ b2 O; {0 A - ! L4 T$ v5 |4 D
- M0 x* s. Y/ o! J: L3 R( }
- : l& s: B$ c( Q. f
- addr = SHT20_ADDRESS << 1;2 F: R/ I7 \' Y2 V9 j( j/ z, W1 n* n1 S3 ?
% M5 g/ ~9 j) X% p! f+ o4 ~- ) c3 {8 c+ _3 ~& l% ~5 s4 F2 V% u
- % G' Q2 T7 [" w* y, V6 E
- IIC_Start();3 E! W5 |0 f* R0 f- X. c
- 4 s) M+ K- Q. A# t3 R7 [8 r
- 9 |! \6 ~1 n3 F: [- n' b8 h& d; |& I
2 M/ y; _- Y( D' W5 Q) n: w/ [- IIC_SendByte(addr);
; q9 z, d* N+ F2 j: b9 b5 e4 q2 v9 U2 K( L - / n" w1 {" T- U8 [1 `! `
- if(IIC_WaitAck(50000)) //等待应答
5 O) j" N$ m. a. U2 Z! G6 T
" a+ Q4 ]6 B& U. p J `- return 0.0;4 u( ~- D/ R* S; z( O" m
- 1 L/ @8 d( Z1 c# z
- 7 E! d, v1 _& E6 O4 W
- # L5 a) k( m4 n Z f7 C4 _
- IIC_SendByte(cmd);
) G3 g8 M; k7 ?! J2 ^4 K3 z - + V: [/ U) d: c" u) ?/ J/ B7 K
- if(IIC_WaitAck(50000)) //等待应答
6 Y# @' v, G" Z3 _ \+ ?* n6 t - 2 o: T0 `7 D4 n9 e1 _
- return 0.0;
+ R) u9 n" v, Y. t8 {" z - 7 Q# d' \/ i+ {5 `. k. A# {! H
-
& }' {" ]1 A- f. p0 r( I; G - * F+ Y/ R5 {4 l( L
- IIC_Start();
- p k+ F! _+ S; F; r* d( k g
, S4 M# L+ g- D2 P: }2 K- ) q T; @, X/ S7 b- g6 ^
}/ ^7 j0 u' _" ~* x* G/ U9 d8 o( M- IIC_SendByte(addr + 1);, e+ V" p% D/ C# r( h
) b& ^ J2 K8 I0 J* x- while(IIC_WaitAck(50000)) //等待应答# |1 T/ l& e7 R/ a& U; R
- ; B) ]+ c" B& k( F% ?
- {
3 ~" ^/ t) [+ b( @+ t$ @& H - 1 C% q" a4 m/ e. K- G- o: b; x
- IIC_Start();
7 L; _9 N. O# u - 7 e3 w0 }. J2 d# d( K" @! ]" _; n$ K
- IIC_SendByte(addr + 1);
& K5 f7 \, T' J* z* F" M
( Y4 X9 `* k0 Y& f8 n. U- }0 B3 \8 T1 r4 {+ l
- 3 p+ ~$ R0 B- X- Y/ ?. I1 ?& I
- ) l4 K$ @- q8 F9 c$ U+ ^8 X/ V8 z% T3 R
- 3 a. ?$ C! Z, K) l' U) J" a
- DelayXms(70);+ X/ D( T2 n! r' U1 c
! t: l7 d" U3 L9 G8 b-
3 x2 t* @" [ g9 _
) q m, a0 Z+ T- data[0] = IIC_RecvByte();
" r! e. b' O3 K1 k" O2 D* | - & @' K, @8 i8 |% m9 ~, ~) T2 E
- IIC_Ack();# j( l4 k# G4 Q& x3 @6 C7 O* r
- ! \" H& f3 N9 [& z
- data[1] = IIC_RecvByte();
$ u6 I, S2 u. n( _6 A
1 }8 G' \7 K+ w ~- IIC_Ack();, v" c, z- G6 Z9 r
- 7 R" X" P* X S4 {9 N" y
-
3 L% w8 C; J/ J- ?+ }& H
2 h, u" }" S9 n m( e- checksum = IIC_RecvByte();+ X F- O! `4 {" }5 }- t0 j
* w8 D# {& ] ]' M- IIC_NAck();( z" v: q% T$ i/ I% P. S9 U& f7 H
- 8 V3 r" [# {. D$ N9 O* g' |* \
- ' r9 b+ t4 l4 k
- ! j/ p0 ~: J+ N1 E: U4 a% h' J
- IIC_Stop();, ]# V `/ ~7 N3 \$ ]& o* I
- 3 e; z$ Y0 W( S: E, ~
-
& I; e: |$ P+ q- v3 r
8 S. O4 B% P' u7 j! X4 N- SHT2x_CheckCrc(data, 2, checksum);
7 s: N# ~5 X! J" ^
4 Y' C W J, q) {1 R3 z. C- tmp = (data[0] << 8) + data[1];+ p! m/ K$ [# r8 L" d) U
: l9 U6 X6 _% y' w/ \- if(cmd == SHT20_Measurement_T_HM)
+ b% ]- U# }3 {) A, d0 Y( c; O - e0 X, T% x! N" ?6 q9 } ]
- {
9 P! }2 e0 k4 ~& z) K* s7 C$ y
t, M* o+ i5 N' ?5 `5 _' t) j5 E- t = SHT2x_CalcTemperatureC(tmp);
. y4 G* q3 y+ O) {% j
) _' u" m; ]8 `+ V; l. U- }# y" Y$ q+ _7 ]; i/ L
- : N6 Y+ D# p, N, f
- else6 \6 Q S9 |9 F. R
- 7 \4 l9 ?/ W3 g M+ u' y& S0 H
- {( H( h5 F7 x9 g. Y% Z* |0 Q
) \! {& a: x6 V4 d$ I: p! d- t = SHT2x_CalcRH(tmp);7 [8 Y2 M6 S; H8 h
6 n. z. X2 ], g- }
% o) |5 v4 q5 `( m; h, U
' R |) I5 _ s1 f/ h1 d- |-
( `6 C4 C+ ~ [" x
+ m- Y& X1 N, Z' O- if(pMeasurand)" l8 q! k: A% o9 }4 q0 l. N
- 2 z4 c* k; _1 C' P% \
- {3 E( F( N- ?6 r9 Y' t$ `
- ' _6 j+ s0 h6 l% B6 V" S
- *pMeasurand = (unsigned short)t;
2 M y6 ^ K% O - # X* @7 w/ p, Y
- }
) ]# ?' U- I5 T2 L5 E, n5 V
# @" X; i% R a* }' V- / a4 }* g' w9 H4 A0 n6 v1 d
; [1 x2 U, J) h( S+ X# p; q$ t- return t;: Z$ G6 V0 Z+ F* Z/ V' n2 j
- : p5 l* n8 t4 O, d0 z
-
6 Y; N o" B0 d* h1 x
3 u/ q$ q: W+ p- S8 C- }
复制代码
$ ~ |8 c+ g3 f+ Y ~上面就是对应的读取温湿度寄存器里面的值。 最后读取出来的需要进行转换。 如上图。 最终串口输出数据。 单片机使用的是STM32F103VET6。板子上还有其他传感器明天接着水。
1 S9 m6 u1 H7 g% Z1 u) J |
一晚给你水一篇