|
【年中粉丝节】+SHT20传感器 今天收到年中粉丝节的活动,看了看,对不起了日天兄,我得水个好几篇文章了。既然是分享ST开发板与传感器的文章。今天先来个SHT20温湿度传感器。 先贴下参数图。 首先通信接口是IIC总线方式。 这张是性能参数。可以两个湿度传感器精度可以达到12bit分辨率,温度是14bit分辨率。 到这里我们需要看到其发送数据的时序,逻辑,同时知道需要知道寄存器的地址。 在程序中对应。虽然地址配置的是0x40,其实是在发数据的适合地址进行了左移一位的操作。 - float SHT2x_MeasureHM(unsigned char cmd, unsigned short *pMeasurand)
x6 Y+ V+ I# C6 |! n5 P - % F) n! T- h3 O: y# m" x
- {% |0 D6 {; Q- L0 V: o& t" q: I4 O8 f3 t
- * `* @; U: o* r
- 2 O7 }- N% N2 s0 O4 f
+ ^* G; d) ~) j N& T- char checksum = 0; //checksum
, i" G5 v" ~: T8 s. j* Q- r8 K - ' s$ k! j4 ?: |# e
- char data[2]; //data array for checksum verification9 {2 i0 I/ C# }0 X0 ~3 P2 O
$ q0 ~ R8 @2 ^5 ~/ {9 ^- unsigned char addr = 0; {. _ U1 P7 [% q* J
8 a* i6 Q6 R* r+ _- t- unsigned short tmp = 0;5 E7 g$ G; `: O2 l: v5 j' k, |
7 f" a- X; } h: u% Z% B- float t = 0;
8 u$ T; D' q9 q9 d! Q9 R, ]: t - 9 m. t* |7 F9 [& u, c3 J% S
-
, }* h/ I. z N$ ~7 W9 L3 a
7 ^. F5 ]# L# ]! f& r/ ~- addr = SHT20_ADDRESS << 1;" a$ T2 h( C: y* ^5 ?
: r3 n& o$ D. j2 H- 6 F$ g4 T- k1 m2 S" b4 b
- & Q C9 x* p. I/ }4 }# d3 _
- IIC_Start();
. V4 b+ I% l9 \/ {# n2 e4 P - ( o. w# K! D# `- x
-
" K0 ~+ s- P a/ d - # E) Q J8 b9 D) E5 m
- IIC_SendByte(addr);. T0 X; C+ f% T$ X1 \# C9 W5 M
c' Q- M! v; z- if(IIC_WaitAck(50000)) //等待应答$ x/ R! Q6 ]0 |8 x
- 0 d4 H* t5 ?. A2 C! C( Q, z
- return 0.0;
+ @; |! _& ]! f8 s$ R, K4 K0 Q - ( G2 n4 ]# p$ H5 m0 ^6 `) h$ x
-
( J3 T; |! m3 v0 v) V' L
1 L; v" t& ~6 |& e- IIC_SendByte(cmd);
. z, H2 D j& Q: q
) q9 u0 _% R7 r- if(IIC_WaitAck(50000)) //等待应答
1 N+ c" P/ N# P) {$ j7 t( [ - - j7 ]* |- m+ c$ b
- return 0.0;
, D9 l' u0 v: I) K6 t$ V2 b - % F4 h9 A4 y* D/ r9 h
- 3 W Y0 B# m" v4 ~* r
0 O5 S3 N. u* z- IIC_Start();8 f7 c+ v; m" }4 a9 _) k! }4 ^3 X& e
$ b8 @8 P5 T- X$ O% O7 v @# O3 t-
( ^6 c ~0 u! @4 c% y" P4 \
" t3 ?0 }# k+ }4 H; W- IIC_SendByte(addr + 1);
. a* L/ y4 [+ r! ~! u& Y7 {) H
) a; ?; N' G K- while(IIC_WaitAck(50000)) //等待应答
; g& N9 c+ e+ f, R" M - " b4 _4 d" i& j" A
- {6 }8 } x6 Y2 }& U( o
- # j& t1 j& \ E* D
- IIC_Start();9 B$ V, O2 n% t8 s3 r& w
; S; z( X. E; j) _: j8 N. g- IIC_SendByte(addr + 1);
! w/ Z9 T% J! M, `
' h8 |+ k- @. N0 x. N" W( d- }- x1 i4 V; W" x5 W+ f& ]+ E: P
% f/ q# z Q( r$ X& {-
5 ~. v4 b0 [7 Q) J L - : N* k! d1 s7 \" ^2 s, |! q- ]# h- G9 C
- DelayXms(70);
9 p2 Z0 v1 N& d) }9 A0 C
, S& u+ R- l2 X/ z+ W( b6 F- 6 a$ P4 M5 l: |0 G8 W8 l
- 2 ?& b! ]% O& O6 s: }
- data[0] = IIC_RecvByte();
# i- g: {+ D& C* _6 h3 M3 ]2 ~" J
( F4 d" {. Q, @# H: K8 \- IIC_Ack();0 Y' w& }% y8 J, q
0 i) v* B7 A/ W- data[1] = IIC_RecvByte();- O" T& b* o8 x# h! b
3 ]2 ~- h7 @4 C- \8 _) y ^1 p- IIC_Ack();/ u5 U/ p% D: \- U5 V- R
% ^) |- V. t! Z" @2 c- " J8 y$ ?1 W6 C( A0 y5 ^5 ^! M* i
- # `/ x4 G! E0 b( V5 `2 Z
- checksum = IIC_RecvByte();
% {6 C1 }8 m, I; h9 b! Z
$ Z. t) B H: X' q5 h9 w; S5 L- IIC_NAck();$ |, f+ b* ?7 {* V. v& k
' ~. J* I) K0 I( r% e- 1 \$ m$ o( |2 u$ J, P
- / m8 S/ L1 V5 C! ]& u
- IIC_Stop();- X! D: ~0 w; i$ ~; S7 K1 ]
- / {/ p* m1 M1 H7 R3 ?
- ; Q# ]$ t! T7 W6 e6 {
- 6 V$ c: I" Q- o8 E* r, R8 u
- SHT2x_CheckCrc(data, 2, checksum);
* N% q1 S9 W$ k) z @6 F* M - ( y5 {+ s. s5 R& Y- t6 E/ [
- tmp = (data[0] << 8) + data[1];. Z7 u. C) n }' l6 Y- i# F$ c; l
7 p9 M/ ^7 l& J9 c1 B- if(cmd == SHT20_Measurement_T_HM)
& R4 p" U$ s- k* z - / }0 L1 V* Y! a' m- |
- {
F# a) p* y ^0 _* K
0 v/ x8 ~/ C( F$ K! f Y- t = SHT2x_CalcTemperatureC(tmp);
& h7 [2 ^* s0 v! {, D" O
: X7 i8 B5 k% }- }5 k' Z s/ h2 I9 P/ I
6 U9 V5 H* h; ^' ?- Q* r- else7 Q! ? X4 H$ V4 q+ P$ o
- 1 Z! [8 `; R4 P1 ^3 ^2 V% R
- {
1 I& C6 |8 p3 Q9 h i - 8 ~2 U5 {( X( B }7 Z
- t = SHT2x_CalcRH(tmp);
' u" N, e5 @' N; D9 k - ; v- {4 v# n/ {
- }
# c, q3 h7 R* h7 G" U. V
. Q, }% v- }6 K0 f- ' _* ~' g2 l1 `/ m" ^6 p: I
. v& p" m( L w* [, M- if(pMeasurand), d# X2 w/ x/ Y& A
) H) q+ h; R4 g* V- {
# O1 k0 P+ P) \# v
% f0 |" k+ Q# V+ K8 s7 d- *pMeasurand = (unsigned short)t;0 M' s8 K R6 a( t# \
- 1 W5 i0 @, o3 } h- [' L0 K
- }
; j/ m% |# i | - 2 ?0 G& W" l9 w9 f$ C
- + p0 `5 t+ f5 x& H
3 | ^5 q* L) q! V" t- return t;6 ]2 x$ n7 x8 y! Q
9 B/ g- x; l8 |3 K. H- 4 J% T. M2 ?& B% w( W4 w/ L& o8 s* @
- / Q% W6 u `" F2 G1 A) R. W
- }
复制代码 , o; _4 l* v6 C9 l) \2 K
上面就是对应的读取温湿度寄存器里面的值。 最后读取出来的需要进行转换。 如上图。 最终串口输出数据。 单片机使用的是STM32F103VET6。板子上还有其他传感器明天接着水。 * g) r3 z& ]9 Y1 c
|
一晚给你水一篇3 E: V& A/ K A# }7 ~, v, r5 e