【年中粉丝节】+SHT20传感器 今天收到年中粉丝节的活动,看了看,对不起了日天兄,我得水个好几篇文章了。既然是分享ST开发板与传感器的文章。今天先来个SHT20温湿度传感器。 先贴下参数图。 首先通信接口是IIC总线方式。 这张是性能参数。可以两个湿度传感器精度可以达到12bit分辨率,温度是14bit分辨率。 到这里我们需要看到其发送数据的时序,逻辑,同时知道需要知道寄存器的地址。 在程序中对应。虽然地址配置的是0x40,其实是在发数据的适合地址进行了左移一位的操作。 - float SHT2x_MeasureHM(unsigned char cmd, unsigned short *pMeasurand)
! ~+ X6 y! g/ _: Q, t - ! ^8 s/ U: c1 q* C* m7 |3 R
- {# P$ ] H" f6 s7 h+ f& Z+ A0 W
- 8 i8 S9 m$ E- ~& Y* I
-
6 a; ~7 G* i+ p9 i2 m - + L( E# C8 n* S( T5 h0 f3 R" |
- char checksum = 0; //checksum$ h/ J; O1 H* w
- A6 p9 o2 T( U! @
- char data[2]; //data array for checksum verification
" K7 l3 }, ?% F
; u* D6 w$ F6 }$ k/ J5 i; b- unsigned char addr = 0;' A. I) m+ i) K; V" y/ G
- % [) j7 H9 c% O6 j7 p7 i, j
- unsigned short tmp = 0;
4 z0 L9 i4 T- _. f6 F( [3 \' X
% E" E0 r- k5 ^, F" U! J6 z- float t = 0;% ]- g9 t' ?# L; y3 i
- * D: j. ~ ~9 t+ m6 H
- - S2 t! |: T+ R
9 y2 a$ V2 E/ r- addr = SHT20_ADDRESS << 1;
. v+ A: G- r y9 r# _
F- d( D+ @4 e3 P& n- ' ?0 o# Q7 q& y/ O3 y+ D: s; Q. c
- ) M& y; {" B4 X& a
- IIC_Start();; B1 [9 S( M( E6 r
- + I9 m7 s+ W) s1 J0 P! T; F+ o
- & G# H$ n6 Y2 o- |5 \/ }, }: j4 R
- { x0 g( t/ i. L2 [$ [- IIC_SendByte(addr);
9 K" C8 M% e4 B* B
! U1 G5 g5 G& I! r# C0 W- if(IIC_WaitAck(50000)) //等待应答- m5 m2 D/ [5 J
. W! T6 W& b2 _( V5 S- return 0.0;$ B; B( O; |( n: X0 R) b
! R2 U' C5 \( J) } r9 I0 q-
$ G/ i1 D' Y- ]3 [+ m# |7 i) ^
1 }+ `$ k% C4 V* t9 a- IIC_SendByte(cmd);9 g8 ?8 H- E9 Y% ?# {' m
2 S! N ~: a2 u; M/ X, i. s5 ^! u- if(IIC_WaitAck(50000)) //等待应答. V5 _' S j9 S* e& e; I9 c
) C( k1 P* Q3 D5 ?- return 0.0;
7 Z7 W' I6 F( k1 ]+ o - ) E" Q; E3 W" i) G
-
K. i1 _( Z. V* T5 u% p- F
' l/ k" c1 R8 X. X9 p+ U& @; T( Y- IIC_Start();
. z4 B! A3 e! @ - 3 u& s2 ? K: U: O% ~( x; k3 R
- . h& U- H7 [' N8 @3 B, P
% U. j( P9 ^9 K) \" H- IIC_SendByte(addr + 1);" Q9 L) ?) ]' F; g# g U3 X
# G% e! e4 h- ~$ Z. {- while(IIC_WaitAck(50000)) //等待应答
; W3 ?1 ?% j5 f$ S - 9 Z. q/ B' m0 a" s1 W9 [; h: I8 d2 I
- {: [) m* J6 H$ V; r
6 ?) R; v: U3 k+ q, E0 T& a1 q) N- IIC_Start();
$ U+ w5 r( ^6 u) [
5 m( J5 k, E; D8 {/ i" R- IIC_SendByte(addr + 1);
3 I5 Y& w6 X) x! w; t2 X - - G' B8 T/ C) K1 s9 m4 ]. x
- }
4 r* O( C) @# s/ V, r( y - - J8 @/ O9 ~" w* F
-
' u* X. N& V: g8 V6 [: T% ^
8 Z3 ~+ y) D2 r2 a; \% U. N- DelayXms(70);& ?2 \' _ g' Y' _6 Q, Y: L
- 1 O2 I+ E! {6 d. |
-
/ L8 j$ n3 n q3 c j M
1 d5 D2 Y$ s3 c' @& g2 |- data[0] = IIC_RecvByte();
7 j! w9 W3 _# r - - T' `. F" K8 U
- IIC_Ack();" j% o' q( C# U
/ k4 z3 d% Q- S% \ ~' W3 t- data[1] = IIC_RecvByte();
2 K4 ?) P7 h/ ]$ z! a. p
" [3 q8 x& m- c ^% M- IIC_Ack();( K2 B! D" ~0 u4 P5 I! }
- ( G0 q \5 P& [+ x( q
- ( D% _. M. V% d/ L% u
- 7 M, m- E! K3 H9 `; c4 H" a: m
- checksum = IIC_RecvByte();) B$ A+ q2 p% L% C5 B5 y9 _7 T4 C2 z
+ Y/ G6 L. i5 S- IIC_NAck();* f9 b) L; x* X: R2 k: B
$ e5 M+ @6 o0 ?6 B! L9 N- + w/ `" P) T4 }' c9 x( |5 n m8 I
- ! N# i4 q- w) z6 R9 W. O
- IIC_Stop();
/ e* @4 Q' N( \6 N" C; D) _0 U% | - 8 q3 \ w: j( K* `. l
-
( n+ n( }% s( Y. ^ - 2 v6 e6 S! H+ u+ O; g
- SHT2x_CheckCrc(data, 2, checksum);
! N+ o7 @8 R! ?: l! s
$ u! @+ {* n3 s7 ?+ z* _' k) s; h6 B3 Q- tmp = (data[0] << 8) + data[1];
* G$ ]' S5 y# U9 ? - ' k# @& p1 k* N5 L
- if(cmd == SHT20_Measurement_T_HM); g+ W6 q# Q7 c* G1 L' S! j+ O4 X; Q% @
+ J# M: R$ X4 Q9 `/ p% q- {1 T* e4 A; T- w& k, k% s
6 S. a0 _2 e3 ^8 V/ [( p; G- t = SHT2x_CalcTemperatureC(tmp);. e; Q, W) f+ V
- ) x: z9 U! Z3 q$ C" B1 d" E
- }
; W1 x9 ^+ K+ n4 s F - $ s& Y1 g" d& H/ D0 ]+ i5 p2 ? z
- else
6 ^7 |2 g9 y8 A4 e - 4 u1 D/ n: ^4 d! a0 a
- {
) Q1 T' q: s: X6 f1 p
% e& ] X1 C& O6 s9 z7 P- t = SHT2x_CalcRH(tmp);
+ n1 R# G7 W* j$ W* v1 ?2 T
4 ~: l' m% |" M- }
! X1 R0 g9 \3 t+ ~ - * c( K9 w7 X! L* H0 C- \1 u
- ! v( v% G# ^$ |' G) ?+ f
- 1 y' L$ Z, w; Y
- if(pMeasurand)
1 t! u+ K$ i* |+ {9 M. G
3 R6 G3 H( o, R- {
" r# q+ U1 x5 ~" \: v3 v
\- @: r# g8 v, \- *pMeasurand = (unsigned short)t;
$ Z1 _) x7 t5 U2 U# v - 7 Z$ i7 n& r7 a, G0 y: A2 e
- } r" `6 g5 _, F+ d
- ) I" k/ h! @- I% z5 [, ^' k3 w! ~
-
. }/ O& _0 A6 N* Q- d. p# V! {
; ?' A) B1 q1 |- return t;" c$ |1 v3 j4 t* M3 V! H. F; p' o
$ d% W2 p1 G, _-
% M( u+ J4 d [, \: G. ] - 5 e! l9 F, p9 c8 A. B
- }
复制代码 % q! K9 a- x: U. H
上面就是对应的读取温湿度寄存器里面的值。 最后读取出来的需要进行转换。 如上图。 最终串口输出数据。 单片机使用的是STM32F103VET6。板子上还有其他传感器明天接着水。 # a! [4 W# _7 [
|
一晚给你水一篇