【年中粉丝节】+SHT20传感器 今天收到年中粉丝节的活动,看了看,对不起了日天兄,我得水个好几篇文章了。既然是分享ST开发板与传感器的文章。今天先来个SHT20温湿度传感器。 先贴下参数图。 首先通信接口是IIC总线方式。 这张是性能参数。可以两个湿度传感器精度可以达到12bit分辨率,温度是14bit分辨率。 到这里我们需要看到其发送数据的时序,逻辑,同时知道需要知道寄存器的地址。 在程序中对应。虽然地址配置的是0x40,其实是在发数据的适合地址进行了左移一位的操作。 - float SHT2x_MeasureHM(unsigned char cmd, unsigned short *pMeasurand)! Y- r7 T; j5 p; x
- 3 ^# [: p! A$ y! X: D
- {6 V6 ~6 i5 C F7 U6 J
2 L/ H# R9 {9 B3 W: w-
* H5 N% _. J4 C" b
6 O- Q3 Z8 c* m: Z2 w" z. t- char checksum = 0; //checksum
6 E) |, a& T: X( r3 m. |( s
6 e, M2 R7 i, w; \4 h1 N0 C T* f- char data[2]; //data array for checksum verification
4 l) m. D& h3 Q8 v2 F/ O% k7 H - 6 L+ {& u! {' }) z/ s
- unsigned char addr = 0;5 U3 F0 r3 [ _+ u
6 T# r, k# D/ ~7 ]- unsigned short tmp = 0;
7 c3 C! \* M' p
" L% H& c1 C" u7 Z: R- M- float t = 0;6 o4 E( \. s- z9 {% O
# p9 p; f9 W+ w6 |! q8 q! d- # t E8 ~6 k6 r) G
- : Z. l4 i; T# u; H
- addr = SHT20_ADDRESS << 1;
. u3 c& H+ m1 q6 _' D! L - % p. c$ F @* [) W
- 2 @- S8 _3 {9 i' F7 e* S
; q+ ]% {7 v- w# H; f. o- IIC_Start();$ |: J- f4 e# N& e' l9 _" ]- Z& X0 V x# Z
- 2 |5 W- L: m" Z6 |+ z
- 3 r( d% c9 B8 H9 h+ ^
- ; l! `8 h" ?, n) B
- IIC_SendByte(addr);/ z1 l5 u$ Y+ z5 K: H% u9 M
- + [! ?( ~4 L5 [2 K& @; c
- if(IIC_WaitAck(50000)) //等待应答* H& i4 r' x9 B6 N
! r+ W7 e; J! a: e- return 0.0;4 S, B. \" `" ?3 |% ^! Y- A7 e1 J
- ) Q& G q' f8 Q) k
- ( _. R. t# U; Q" d
- ; N( P* I! Q' G6 H
- IIC_SendByte(cmd);
) b- A% N, S/ c( U+ g - 2 v" D4 D9 N! u( H5 j. z7 v B
- if(IIC_WaitAck(50000)) //等待应答
% r8 o! R: o* O3 v
& \% H3 m& P5 U8 S' U- return 0.0;& J; c; U2 ^ k- ?" I+ @% y# y
- + T$ _2 e' o$ E4 r/ y: c' Q: ~ N) ]
- 7 F2 X# R) d( e" j' b
- j- P+ \: \7 H' T- IIC_Start();# B# `" V6 L }" y' u, o7 T8 E
- 6 Z* a. p/ r; O* u
- 4 s0 ]1 Q7 K/ o( t) }: R: h e$ r
- % M& k" l, R; j6 {4 M
- IIC_SendByte(addr + 1);
# R- z9 }, Z* l6 J5 i S* ?4 [* z - 5 d+ t" }. F& g% C& P' z2 O
- while(IIC_WaitAck(50000)) //等待应答
& Q# X: z' e' U - , X. q8 m# D; Z% t
- {0 c( k, L5 Q/ L; u0 w( G+ N! u/ F P
- ) o( J9 ]9 T2 K1 c0 X. ^; e4 i
- IIC_Start();$ U: B+ I$ C R
6 w/ ~6 _1 Y6 P5 A- IIC_SendByte(addr + 1);3 c+ a4 E2 h- U& n
5 h6 p* N7 C/ O- a: f- }9 x2 A) e3 J. H- K) p+ i) C
) _7 X! @: S: W @. [-
' T; ?/ j# \, b1 p9 x - & {+ ]; {8 k8 T/ `' W' x
- DelayXms(70);
/ B1 R/ A) o; b% }
8 h7 G( v7 X% L& K7 E8 |- ) y/ Q: H5 b0 _" { G8 o! p
k# I% R7 C. w1 m1 s- data[0] = IIC_RecvByte();
+ u$ ^2 ~3 T8 C3 I% J
( T3 N* i5 _* q \0 ~1 Y- IIC_Ack();( {% D/ I, i4 Y1 g) V
' o; _! e5 M# j5 R9 Y& X5 Z( e- data[1] = IIC_RecvByte();/ V, _" j/ J6 M. I2 W
- 8 N7 J* A9 J% ]1 @) Q8 Y. Y( k. G
- IIC_Ack();( p, \2 B3 Y* m+ b Y, y
( p1 ]9 p: J# b: _9 _9 H-
7 m* j' E6 \ r- {5 ~, B" i% g5 W
# B& H; X: W: E: Y8 Z- checksum = IIC_RecvByte();8 [7 i8 ]2 R, V/ r# E+ V
- ; I2 ^4 T+ p2 }# o7 {, d0 E2 L4 _& K
- IIC_NAck(); s' a1 s/ U. X; w
& d9 K8 Z. H) P9 y( n-
/ u, |0 B$ r' W: u6 A$ Y% a7 {. b - ( X$ z. h0 X7 w/ w2 p W4 c) ]
- IIC_Stop();9 P! V' T" @9 V4 ?8 y$ i) Z! g
- 9 l# H0 X# G( ^; E% d# X
-
1 r7 V6 S0 i; ~4 V8 D. O* z - ! U/ u& ?* q5 p' e9 L0 u) D2 l7 _
- SHT2x_CheckCrc(data, 2, checksum);
% H( D: Y: C5 X# i4 H/ Z0 K" u
; E. ?2 h9 u- h# Q7 Q- tmp = (data[0] << 8) + data[1];
2 f( ^1 T* h8 J. q* t5 a
, C+ Z8 Y% I$ ^. F# @- if(cmd == SHT20_Measurement_T_HM)/ R+ e2 L' e/ j3 ^
- " G$ V, s( C+ `: g' ]
- {& |0 K0 t1 P# C8 q9 |
- & R# f1 G }$ a% I ]' d
- t = SHT2x_CalcTemperatureC(tmp);( ^; h2 m/ l1 X; S" k& p+ M
- 4 X$ E+ Y: ]. w+ o9 {
- }9 `' U9 @* _' c# L6 }5 Q
- 2 x9 G: D/ t/ [6 e, ?
- else" j0 o& M+ `! r4 [' r5 ^
& ]2 w% U [! L- {
7 l/ P1 `* w0 R - 1 k9 r+ [. n4 q# }
- t = SHT2x_CalcRH(tmp);) g- G. T6 ?. C4 C* f! {+ r6 [
. x, M3 m& C. C& X- }+ Y/ V, E5 s d8 L. s
) g k8 d" z4 v$ K* V" D-
; Z4 c4 k4 k; t" q - # Z, ~/ g0 N. o5 T! j9 H
- if(pMeasurand)
5 X# {; @5 k$ H
- e' \) k" P; I- {
4 X2 K: |% v# ~) Y$ h: w8 G
* l% z8 O* H/ F* z, v" Y6 x$ j% j/ |- *pMeasurand = (unsigned short)t;
5 W1 X! p- o# |, U
- B2 ?, o7 y% R! x3 V& B8 _/ m- }
* i. Z/ e% [7 c1 d2 [. J! l
# ]! L+ [# N; i q9 d-
4 K _% `: Q6 t) G6 o- X - 0 c6 ]8 Q: X5 ]
- return t;
+ v U, U/ |% @+ h - ( L: r. R/ j( Q& b
- 6 t" F+ t1 P; E9 F0 F! j
: e' U. V# v* m6 `/ ^8 H- }
复制代码 + N" D' S; x. C3 T) ^
上面就是对应的读取温湿度寄存器里面的值。 最后读取出来的需要进行转换。 如上图。 最终串口输出数据。 单片机使用的是STM32F103VET6。板子上还有其他传感器明天接着水。
, ^, r1 {$ E) I1 X# r1 F E, ?- { |
一晚给你水一篇7 j3 B! E% y/ L+ \3 P" ?