|
【年中粉丝节】+SHT20传感器 今天收到年中粉丝节的活动,看了看,对不起了日天兄,我得水个好几篇文章了。既然是分享ST开发板与传感器的文章。今天先来个SHT20温湿度传感器。 先贴下参数图。 首先通信接口是IIC总线方式。 这张是性能参数。可以两个湿度传感器精度可以达到12bit分辨率,温度是14bit分辨率。 到这里我们需要看到其发送数据的时序,逻辑,同时知道需要知道寄存器的地址。 在程序中对应。虽然地址配置的是0x40,其实是在发数据的适合地址进行了左移一位的操作。 - float SHT2x_MeasureHM(unsigned char cmd, unsigned short *pMeasurand)
; y, W; Q4 V! x' h- \ W k- r# Y
! ~, a6 h$ q) Y8 C- { c% P' b( A* l, j
5 h$ T* a* v. B" Z' C$ |# r- 1 i5 R R0 o! ~; e) j. c" j- d
$ p5 E1 t$ `; y$ b- char checksum = 0; //checksum
/ s; E, H, T% v# S* i; C - 0 \; X+ t) M8 q- d5 s: k- f
- char data[2]; //data array for checksum verification* z! Y+ c" I* |1 U& h
, y. k9 m: B8 [" G* y/ n+ k- unsigned char addr = 0;
* S& ?4 s8 Q2 ], v9 q' M - ' _- \4 i9 F R& d- Y* w( X0 ?
- unsigned short tmp = 0;
" e2 ~9 x& t, Q- r+ \% F
1 u- _( {# G7 _5 d* u Q Q- float t = 0;
4 D5 G6 X3 O) q
) N* ~# B. }# s' |2 d4 E-
! t9 V3 ^" [6 d6 q) ^" e# K
6 R- v$ n& _4 X! F2 Z1 D3 c- addr = SHT20_ADDRESS << 1;7 Q; ?# W. x, q7 E
- # R4 y1 N i" P9 m8 [
- & f# T# H5 J+ r( D
5 P2 m$ F! u* @1 `- G- IIC_Start();2 X/ X( e+ F: k7 U# [* Q( G3 |
- 2 I' Y( C3 B! c2 N5 Y8 Y7 x! T
-
, L# N' m- R( l a. [! U - ) _# j% F$ L# `+ s W6 M
- IIC_SendByte(addr);; @0 V2 v# o: a5 B0 n
" a: s2 ~5 J ^( ]- if(IIC_WaitAck(50000)) //等待应答
$ J$ T5 x- B5 U# X1 W - 4 L& f" c4 B0 Y3 o* W- f1 V; R
- return 0.0;% |% T9 D6 b* n
& Q+ Z( K/ B2 [$ C; K. K-
5 l9 b9 _4 ^. C) x7 r; W* @
* q3 Z" R+ o( T b& {- IIC_SendByte(cmd);2 i# g# d7 M# U
+ u. p5 {( u+ p7 _- if(IIC_WaitAck(50000)) //等待应答" M/ L5 x( E `' R, p* U) p L
; H7 }' p$ C" G j% L# t- return 0.0;
) q) v" d& D9 n1 @( X+ a" q - - @ V. [& `% M/ O! |9 s" [. a+ S" p
- ; |2 k& ]( g& Y9 I: l. F
- ) o5 `, ]% D l' W- C
- IIC_Start();
8 n$ r, F/ Y X8 m! `# m4 p9 h( s7 T
+ p/ ~3 n% l1 @% }- # G8 V0 h+ s0 a) H
& r: R, ^; D( H5 p% T" I3 g' L- IIC_SendByte(addr + 1);
1 L1 D, y, g& @1 b7 ]5 n! G4 m - ; m8 Y; Q, ^# z
- while(IIC_WaitAck(50000)) //等待应答, k6 ?. Q: l; R: m7 }! F* M
- 4 x! g6 V( b7 ]$ J4 s$ x
- {
! M4 D9 g: X4 ^9 t1 A7 k4 N0 b6 E% u - ' y. Q6 {! \' ~9 h: `& \
- IIC_Start();
% c j! b3 C# e9 W3 T, @* g3 Q6 u$ _
' S6 @4 r' a, z2 f+ C5 m5 X- IIC_SendByte(addr + 1);$ i9 Y. i' @8 M! M
- , {% j, ?: A6 w& S% J3 q1 l) h4 _
- }+ i1 f0 q& |5 a" y2 A- o0 U
! p, d" b9 w! z( @% b/ ?/ s- }-
) }" r3 ~3 l L1 Q - : t: [/ M" {4 G+ ^3 l; x8 x
- DelayXms(70);, ]7 r" T+ C$ \
+ i$ a- H6 z3 p4 e. S# `7 R-
2 S% Z# C% A6 J5 G; D' M - 9 g& D# l5 X+ o, }3 k9 h; p
- data[0] = IIC_RecvByte();( w, q8 b, j) b1 W7 X! d0 p
- ! H; Z' z' V4 r
- IIC_Ack();4 u6 P1 c- G5 a
- % n2 u; M z) ?3 H1 S% i
- data[1] = IIC_RecvByte();/ u ]- n, A) u8 p8 s
1 c# ]8 a7 O: [, ?6 I) t" O- IIC_Ack();! x$ W8 c$ f+ H8 R9 e& Q2 d
' u* m. f. D3 ~; T8 d4 y-
1 }0 l' i* U& j5 \ - 5 Z) v8 r) n1 V
- checksum = IIC_RecvByte();0 z7 M- W% _' g) z' F
- + V+ g x" I' B+ W3 L5 H
- IIC_NAck();
/ S8 z' G1 f9 T
$ H8 b0 O6 R+ m6 @4 y9 j-
: s% x% v" w4 b L/ c/ p
8 E+ \7 Q D5 o- IIC_Stop();* H/ m" Z4 ?2 m5 t$ z
- 9 k6 l9 f# b$ E
- 1 T2 x& q6 r0 r) Y& y0 d
2 E; `) N" m6 I: i5 u/ {8 X- SHT2x_CheckCrc(data, 2, checksum);
5 J3 @* G! _- _* g) }* P) o
N/ q6 F7 s. c# S3 N- tmp = (data[0] << 8) + data[1];5 Z" D9 ], A1 z2 K, m4 k$ r: y( L
0 G5 h+ t" g) V* F) f- if(cmd == SHT20_Measurement_T_HM)
3 ]& i# P7 h% x+ W
3 k ]1 d D7 P% C- {
2 I, D; }/ _/ G9 s
4 }+ d5 x/ u3 m' I- t = SHT2x_CalcTemperatureC(tmp);
: ~/ `1 E$ A3 f* ]5 J: P8 Q" D - $ D8 S' X! M8 w- I1 n# I' x
- }
4 E& V/ q! m6 @8 w& ]' k, q0 X
! j& ^9 m& x1 E ]7 Z- else
- O! M" D- c' }8 X0 h
& z$ m. N7 Y( t( u- {0 j8 m' z+ Z' A6 ^$ m1 p8 d1 m
6 J; E1 S# q; d) ]1 U$ Q9 h3 @& M- t = SHT2x_CalcRH(tmp);
# t$ j# x; n. S$ Y) H' h1 q
1 i$ `9 o. M1 l6 i5 i, S- t- }
* @ I2 q% F4 @8 p7 k( N
% A& [( q4 K$ O- / ^ H. w5 }! L- u8 w$ R; e" x
+ I5 N& a6 w! q' {; j/ G. {- if(pMeasurand)! d; ?. g4 A, h; N: M4 k) L' f8 y
- - k6 ^. |8 W, }& K0 P
- {+ J, ?7 h; c" w) ?4 f; ^6 G4 Z
- ' F) J# m$ J3 f! N
- *pMeasurand = (unsigned short)t;
9 q* y0 P3 T, _" K* k' Q/ Q, D - ; ?, m$ \" E" G1 s$ G/ p) H% {
- }
]% N* c6 m* K7 m2 X - ! v; g) D+ W4 i& W" R5 \" q9 A& `3 ]8 a
- $ S/ i5 a9 ]# Z: Y6 K0 p9 j2 E$ V
- H0 ~2 y2 t* z! Q0 y b
- return t;- `+ u3 L6 V& \" @/ u- P
2 O0 r+ J* [% n$ U5 ]-
S1 v0 S% J2 j6 t' r - 3 c, {3 g% f/ T9 s" B5 B: p
- }
复制代码
" H6 g t0 M* w; p上面就是对应的读取温湿度寄存器里面的值。 最后读取出来的需要进行转换。 如上图。 最终串口输出数据。 单片机使用的是STM32F103VET6。板子上还有其他传感器明天接着水。
8 j s$ M7 M, a, ? |
一晚给你水一篇, V; M) a% n2 {8 e+ t0 Z