【年中粉丝节】+SHT20传感器 今天收到年中粉丝节的活动,看了看,对不起了日天兄,我得水个好几篇文章了。既然是分享ST开发板与传感器的文章。今天先来个SHT20温湿度传感器。 先贴下参数图。 首先通信接口是IIC总线方式。 这张是性能参数。可以两个湿度传感器精度可以达到12bit分辨率,温度是14bit分辨率。 到这里我们需要看到其发送数据的时序,逻辑,同时知道需要知道寄存器的地址。 在程序中对应。虽然地址配置的是0x40,其实是在发数据的适合地址进行了左移一位的操作。 - float SHT2x_MeasureHM(unsigned char cmd, unsigned short *pMeasurand)4 ^1 S2 q7 b' i! _: [
. K# e3 D% t2 k6 z- {
$ B* @6 Q9 [7 w3 K) j* I4 y - # _% V( o# n% T+ C2 E2 L' e
-
' ?0 }! G% A, J! g - 4 R A0 F% ^% m) Z0 ^! `
- char checksum = 0; //checksum) I! B7 U( r5 j6 m5 W. b
- 7 H4 j0 ~8 O+ w5 d
- char data[2]; //data array for checksum verification
3 U" Q( a" r# I( |3 R
2 X- y- t L f A9 v# k4 y- unsigned char addr = 0;, c/ O D1 ]" { y# H
- ! s+ M7 }0 f8 M' R. e
- unsigned short tmp = 0;
" j P5 B) p, C
$ G- C, B6 A4 `4 t- float t = 0;0 D% q `& a* C
- ( A# B n4 y6 W% Y; @) m
-
" X- M0 n9 m y# @5 _ - 9 T, v3 x) R* d7 N% h8 q
- addr = SHT20_ADDRESS << 1;
4 V: q0 I$ K( r" I+ f - " C- Q8 Y: M. e( D% ?. ?7 b
- 9 l; _4 X9 R, X: v8 `7 b
7 _3 R1 T1 t# P. D$ P- IIC_Start();! v4 ~7 `9 e7 \( c4 _( r
- 0 \* B) E: ^& l( d0 i$ A! f
-
# ~2 X% C3 n% i% s - & p, p! | v- o. N+ m, b0 _0 r
- IIC_SendByte(addr);0 w% R: u! ~+ l( n1 W- H: S
0 |; }, M$ q8 ]5 \ g- if(IIC_WaitAck(50000)) //等待应答# T8 d! ^ Q/ U# i, t/ ~) u+ `# s
4 H' _2 q6 [1 S. g; B H, @- return 0.0;
* i# A! H# m4 ~/ j. i* s - ' Y" f# ^7 o A' N9 |- M
-
& B. W q& O. n
' h8 _, S9 p1 r! ~- IIC_SendByte(cmd);/ _- S" M! S. ~; V& G7 ?: p$ `
- ( m" H4 Q I& L( b3 o! k
- if(IIC_WaitAck(50000)) //等待应答
! M3 ~1 ?2 N! h1 C7 Y" _
. s; a* `1 i* r# n! h- return 0.0;
9 n% `" y8 } s/ K - ' t8 u4 G" W9 P) Q) b8 J6 S
- 7 ^& T) T6 x! o/ j, H" x( e
' r/ @8 }2 U6 y- IIC_Start();
$ G9 `* @2 _+ s5 h3 d - . O8 v9 ?, ~( A' o
-
% p; K: @3 \9 e+ r1 \5 m& q
$ I4 U) I- B6 N- IIC_SendByte(addr + 1);4 J+ @0 A0 M* ^' X7 n. y
- ' j d3 D7 Y, o2 M! a
- while(IIC_WaitAck(50000)) //等待应答
3 h; ?( Z2 u* q
D6 W0 e* j. R- {
8 T1 z2 d* x9 H2 D: l - . j' m j3 D: v# ~8 I4 U) m
- IIC_Start();, e! n1 n0 r- @' w
1 t0 x+ s; R0 f) U3 u2 q1 B- IIC_SendByte(addr + 1);1 [ R. t0 U; H4 V; v/ u
4 o8 E3 g- r% u8 x: `- }' k6 M7 b3 p. M5 R& b; f4 ~
- : K* o; X8 Y d, w
- 6 z7 e+ u1 \* `# \; p7 |
5 a% [" J6 |4 b; S; B- DelayXms(70);" W' J2 C" Y; n: ?0 S+ j
* R: F% T- b0 C+ I4 {-
7 J( {" \2 B) z* @3 t ?5 c
7 H) H/ b' a7 Z; C4 ?- data[0] = IIC_RecvByte();
1 F5 G/ b% N* f* z9 C
( W: d& V2 j1 n5 g- IIC_Ack();. ^' |3 C" u! A8 I8 ?6 M$ e
- 2 {1 b. w N. g+ y, D6 c
- data[1] = IIC_RecvByte();1 Z4 i8 l& G- f3 m) {/ V
+ X- S( }/ ~& l- IIC_Ack();
0 W2 U+ J A: l6 W- E/ U
8 I. P5 @" m8 n! p-
4 l' y' h0 o5 ^+ q
, d: d) L! Z, z: }( X, d- checksum = IIC_RecvByte();
: T/ k3 I" D# g# h: v5 _( j5 H5 V - T& b4 A& b7 x- @$ s9 ^
- IIC_NAck();
: Q( a- z9 m! ?1 [
. l2 d8 R! X2 R$ y1 B4 `- * S& t/ E$ O; a
" t' P$ ~ U+ |4 @' X9 E- E- IIC_Stop();1 B$ n- Q0 J$ k. t& S9 W
$ l3 \, V, \8 U U7 |& u7 R- P-
! ~2 k$ ^# k1 J) k0 V2 H2 R - % Z# O1 \. N2 Q2 f! W$ a0 |2 R7 j; S
- SHT2x_CheckCrc(data, 2, checksum);
- V. { R. f% d( h t, G - 5 c8 r2 u, j# t7 L* v4 |
- tmp = (data[0] << 8) + data[1];
, r0 m+ \) R1 l - 5 g8 u% o: U/ u7 z* l' _
- if(cmd == SHT20_Measurement_T_HM)
: S$ m a2 f" B. ?+ a7 `
; \/ {& u! D, x* O( C' S) f# S- {5 R' @$ q' p% {# \+ f
# H) {5 a4 _0 F, C- t = SHT2x_CalcTemperatureC(tmp);1 k9 ]% `4 U0 Z+ R& G! f
5 [6 @5 k8 ]& `5 M3 r- }
6 |( J3 j2 o {2 R$ V8 b% V
7 h; [7 }; H5 B" v: Y E/ X- else
6 O) d5 C1 ~4 X/ _; k% z - , `/ w3 O- v7 I( v3 {" C' m
- {2 Q; n5 ^1 H# _7 F
- ( I( i7 c( B5 G. l, B# E% J
- t = SHT2x_CalcRH(tmp);
. q6 z! Z6 s! ~' ~6 C9 {4 R, o4 C - 5 J) F( N+ P% u& e& |4 h2 m
- }9 {8 s0 [$ |. y3 Z z. g
- ( Q8 O. x6 |. r" t: A
-
/ p. h$ M2 L2 v0 ^4 O
: p$ e! @4 g) @0 d6 a- if(pMeasurand)
- F3 }, s9 V3 G5 H9 q
2 k+ E& P8 _8 x h/ @5 A- {6 ]# c/ `0 F/ I D7 p5 b* s7 A
- @4 C( s7 {& A, J5 m- *pMeasurand = (unsigned short)t;7 m! H2 m: ]% k
1 N/ n. ^$ o6 E; Z, y- }+ T5 e$ T% j& r9 k0 j- X
0 B9 @0 i) L* v- 2 e2 L6 A% h! ?! V3 M
; c4 W, L" i5 `" ?- return t;4 w4 f8 ~. a4 u, b1 E, P
- 6 }+ c! N0 d- {- U7 ` D% X# O3 p
-
+ q9 \7 ^2 z. ^ H& U6 _ - ; H& [4 y) w5 B2 j
- }
复制代码 5 v8 @; v/ v( v3 y5 w
上面就是对应的读取温湿度寄存器里面的值。 最后读取出来的需要进行转换。 如上图。 最终串口输出数据。 单片机使用的是STM32F103VET6。板子上还有其他传感器明天接着水。 ) g1 C7 E M. c
|
一晚给你水一篇