【年中粉丝节】+SHT20传感器 今天收到年中粉丝节的活动,看了看,对不起了日天兄,我得水个好几篇文章了。既然是分享ST开发板与传感器的文章。今天先来个SHT20温湿度传感器。 先贴下参数图。 首先通信接口是IIC总线方式。 这张是性能参数。可以两个湿度传感器精度可以达到12bit分辨率,温度是14bit分辨率。 到这里我们需要看到其发送数据的时序,逻辑,同时知道需要知道寄存器的地址。 在程序中对应。虽然地址配置的是0x40,其实是在发数据的适合地址进行了左移一位的操作。 - float SHT2x_MeasureHM(unsigned char cmd, unsigned short *pMeasurand)
- b' e9 D5 C3 e& D% q0 E - 4 P- `, s! w9 Z$ K; z9 E6 D- U* t+ `
- {# S8 e$ |/ u8 B, \9 s
- 3 \" ^7 K% S( |
- / [# S5 {5 k1 o
- 1 `0 \8 w" a7 T. Y% `1 J
- char checksum = 0; //checksum
! i6 ?# g8 F3 o - 5 X% X R7 E$ y" y, f# [
- char data[2]; //data array for checksum verification0 ~3 F4 i; g2 A
' V$ K, S9 j Q- unsigned char addr = 0;
% W3 p2 P6 ]+ w5 L5 ~
$ N& B& O7 M2 v6 H- unsigned short tmp = 0;
! C4 G# i1 c5 o) t% v
. x4 S0 ]+ Q2 F7 E$ {. R/ y- float t = 0;8 W& E( C3 ?1 w( N! Q
% K7 ^6 z# F, Y1 U-
& j' G0 f: k" h! z6 q/ X) l r& l: A
2 q, Q T" Y4 P( |- addr = SHT20_ADDRESS << 1;
3 {2 A" n* G# j k. x& v
; ]2 X3 w' i6 c/ [, ?-
2 o& M+ R& ?5 x- T
3 A/ G2 G- a9 o% P" b- IIC_Start();+ e* K3 T4 M$ ^% z& a
: \" X z2 ^9 ~& i; b u1 E+ ^$ A4 @- 8 a. h( u3 \$ o- Z$ ?
- ) o# ^' P- X7 P7 \
- IIC_SendByte(addr);+ R' a& @# Q) N0 s. r) h
/ n" W& `+ I: C2 T" R( @- if(IIC_WaitAck(50000)) //等待应答
8 r% J+ ^1 i+ d7 L - 7 c. K P! d( U! _9 S
- return 0.0;$ f% f3 c+ @# ~1 h& X& h
% B- q7 H2 ?; d; m5 Q) Y% {-
; p" O, P, [$ w+ |. c" e7 E4 t9 o - ! W8 _1 ?3 ?/ C) {! I
- IIC_SendByte(cmd);
! ]# u" n6 R% K8 G! P
' f! s% G0 m' ^- if(IIC_WaitAck(50000)) //等待应答
' N( P+ S0 t9 o/ D+ Q - 9 S$ _" g; L6 q/ x( Z A
- return 0.0;
2 H% w: j" T7 P. F1 Z9 w9 [
8 b8 m5 l5 v9 W) R-
2 P% A9 Z7 G( o# N; d4 T4 a - / y4 ?, q4 H9 P, N, m
- IIC_Start();
8 F3 n. H9 o: O* a8 z
! n W5 r p/ P: D# Y# Z- 0 s1 ~! i6 U- E2 s
' _9 d; {4 ]$ ^" G0 s- IIC_SendByte(addr + 1);- e% n7 N4 K+ m# p9 A8 I$ j" c
- 8 s! }. O1 O6 m! A1 ^' w
- while(IIC_WaitAck(50000)) //等待应答# a+ O' F! G' t! g3 w
: S# `; m" o& U7 t2 n7 w5 L- {" G1 H8 q# k& N$ }# G3 x
- * v2 e+ a5 C2 n0 R) ^ s
- IIC_Start();
/ N( d' w- m9 ?! ?( E6 m5 L - 3 J% ?) X8 U7 A! N
- IIC_SendByte(addr + 1);
& Z/ b* w. L5 _0 b3 @! z
" D N& B% X: m' b- }
# D% R7 b* T9 [
. {" h# T! C7 a2 A) V4 g- 6 q" L# N& M& M+ ~
- 8 t0 ]/ m0 B# f* ~( l1 ~
- DelayXms(70);
/ D- m: i1 [0 j2 m
8 A3 |$ `/ h9 a, w2 s0 @- Y* T4 q3 v# L- k
" S+ w6 U2 K, V X2 z/ u* F7 V- data[0] = IIC_RecvByte();
; ^( O N( w- c" D
( D2 i# R* D( G0 u% a: ?% i- IIC_Ack();) p- t8 V: \4 j6 t$ K# f5 }
% W7 b2 v9 a; P5 b9 H2 `- data[1] = IIC_RecvByte();
5 b" A- z. ]( n0 A1 N
" {% l. @ V9 F( W( a P2 I) L- IIC_Ack();1 k0 T7 @% N7 D- n/ U, B" S* x
- , E( a8 S6 D# h5 i' f* j
- % L- `9 r/ z! X% `# R0 i/ p" V$ ^
I P0 W8 ` ?7 D- p/ k! u3 ]1 m1 R- checksum = IIC_RecvByte();
4 J3 l3 `0 U- b T0 i. W$ D' L0 N - 5 f: u, v" M/ g( ]$ }7 e
- IIC_NAck();! C0 L4 _8 J( r( y' Y3 A. L
- k! Y& \6 y7 A" |$ c* e; T- B9 o
-
: O9 O) H% \3 \8 U) }# X+ P - ) Y# t* ?9 A7 g4 z/ q' W- e
- IIC_Stop();+ M6 @& K# S) _
- ^4 w# n* F1 ^3 t: w9 F' }-
, h. \$ P+ [( T/ i+ ?2 k - + G$ a- G7 r) |7 G U3 y
- SHT2x_CheckCrc(data, 2, checksum);& {, x# d) x' A& U: d
4 V* z+ @* r* q N/ U$ J5 `- tmp = (data[0] << 8) + data[1];
/ Q' p+ A1 j- x( }# u/ |
8 @& R( k- l7 T- if(cmd == SHT20_Measurement_T_HM)
* m; \3 E$ }+ N0 e - ; Y( h y. C( R4 T) b
- {
. v r) H5 l( K# X9 U$ Z - ' \) c' z$ y7 Y' ?& d- n) X3 M+ a* D
- t = SHT2x_CalcTemperatureC(tmp);. j; @5 J0 ?9 K; O c& B7 d: u
- 0 H6 J; y0 W. Y2 J3 r u; y, f
- }
0 v1 ]- D! h4 Q) G9 |. }- p; D& F - " c+ O' z# Z) c0 ?
- else
8 ?: {, t* R" g. j. Y - ) o$ [: m5 @3 h( ^# y) C) g4 `
- {
$ d$ I9 s2 Z% X. V
: \- x6 i5 R/ ?3 S4 @: ^3 ?- t = SHT2x_CalcRH(tmp);7 Z7 n- c' Z- ]" C
- 9 x% R" l; ?: S+ M- L
- }
* p( G& h2 P) n - 5 h# U6 |0 d0 u
-
: B: V: I: Y: o7 A6 W- Y) Y4 _
5 }4 j: c4 I# O, W/ K- if(pMeasurand)
2 S* M8 l% ~' E3 D4 I1 E @ - $ y( q- f+ {' o7 a3 i8 u
- {" @9 D4 W4 ^. @
- - n2 T$ z7 m8 Y
- *pMeasurand = (unsigned short)t;
$ Z* ?' M+ y# d# D - + y' z: X. w- [
- }$ }0 M2 U$ V) @$ r2 j% z
) F4 d& R) U2 Q+ f- p: q0 ?- # n0 d! p0 b5 v! T
6 r9 L! B0 w# Z* I% u. @- return t;- D& O- L& [# `! Q7 h) @
- $ M: D& L7 [. Y
-
0 w& W# ]) o2 C) ^+ k5 v* J6 w" G - , W+ o, N$ q) C) T6 t# z9 w
- }
复制代码 . e& N) j, G; M
上面就是对应的读取温湿度寄存器里面的值。 最后读取出来的需要进行转换。 如上图。 最终串口输出数据。 单片机使用的是STM32F103VET6。板子上还有其他传感器明天接着水。
& H* i2 Q( t, T/ n `3 ^2 k% t |
一晚给你水一篇' K; Z8 q' ~& H# F