【年中粉丝节】+SHT20传感器 今天收到年中粉丝节的活动,看了看,对不起了日天兄,我得水个好几篇文章了。既然是分享ST开发板与传感器的文章。今天先来个SHT20温湿度传感器。 先贴下参数图。 首先通信接口是IIC总线方式。 这张是性能参数。可以两个湿度传感器精度可以达到12bit分辨率,温度是14bit分辨率。 到这里我们需要看到其发送数据的时序,逻辑,同时知道需要知道寄存器的地址。 在程序中对应。虽然地址配置的是0x40,其实是在发数据的适合地址进行了左移一位的操作。 - float SHT2x_MeasureHM(unsigned char cmd, unsigned short *pMeasurand)- ]3 ?; V/ |2 v3 c. r8 H# p0 l
" G, L p2 G: z! H4 x- {
) ?+ @ I7 i: q$ q% k1 P; M - % A6 R! l1 H9 X
-
9 m2 D! @0 o. T4 l - 6 c! I6 e0 u: N7 M( H
- char checksum = 0; //checksum
: g6 D5 O b2 C! j+ D/ G5 q! f0 ^ - : `( Y3 I0 ^/ X* V
- char data[2]; //data array for checksum verification+ z7 m0 K& K, T( \" ]/ V; [
- ) M: z3 f# c( U. w- l# e
- unsigned char addr = 0;$ p8 m1 W4 j! B$ d
2 ?0 Z' \( \6 U8 r8 U0 h. o0 o6 U: ^- unsigned short tmp = 0;2 h6 @9 S5 v9 T7 C
& c P! d! n/ p$ c1 Q- float t = 0;" }9 L! A" H0 ^0 i/ ~, }
- * ~9 T! U- u$ k, D
- % Y& ?7 @0 C% m+ A6 D' c
- / `: z6 S. z! k8 `4 ~2 C
- addr = SHT20_ADDRESS << 1;
. S) `0 Q ^$ |; `' W3 B' P
$ l# T/ z6 J7 L) o) |2 Z) s, V- , i# s1 C' z. I( W% \/ g5 \
- 6 F9 ?( P# X& C1 T s. U
- IIC_Start();0 g9 t$ S2 S5 b8 r
' A) c* ?( A W1 r/ p8 L7 C- , u7 {8 w* r- a! y' f O3 ^- Q
- 1 G# [* L( n; |% E0 F% j; |
- IIC_SendByte(addr);
9 T2 E( n) P( T7 K1 {- h
6 O: {8 g; w$ k _2 Y7 O8 n- if(IIC_WaitAck(50000)) //等待应答
( f- n3 R9 b' o/ H
8 ~. k4 r) v3 G+ k2 ?6 L- B+ B- return 0.0;
@) l& Q' c/ _
4 T. z" V# [/ c% P- 1 K! V! n' D: I4 N4 Y: M
; F% t& C& a6 p0 t8 U+ o- IIC_SendByte(cmd);
4 M- F# Q& o+ [' r1 m9 |2 o
- d. J9 a- {* [: n! l- if(IIC_WaitAck(50000)) //等待应答; o& j7 `/ e! O. C/ J: B
- ' H2 Z6 V1 S% s1 {5 e
- return 0.0;
) t3 y4 b; i% D, Z3 o& ^ M% F
) X+ M) C% _* T* H- ' P4 _* ]. n9 Y' C% `
9 S* n' {. V5 _# @8 ^; [; ]- IIC_Start();* d! J" Q# C% L% X3 i& ^3 X
- ! ]% \7 I% C9 ^: S3 @8 W% F
-
* B! n( }0 X1 w. S: [ - % E; ]2 p* A( l* L5 \: Y! M
- IIC_SendByte(addr + 1);: S. z9 e0 c2 S( u
5 T d2 N: R9 I" }) G9 h C- while(IIC_WaitAck(50000)) //等待应答; b; N' F; K/ K2 u7 l& f
- 8 o8 `7 w! _! k: J
- {/ g. P( v0 _9 Q1 c% O$ ^8 X
- 6 d7 r& l5 F( X7 F9 D& `5 S( G- S
- IIC_Start();
% L7 ]8 Y' S' i& ?; ?2 l - 2 G- J+ {9 P e: l7 E$ j9 L/ J' ?
- IIC_SendByte(addr + 1);
; Y- ]. X* E& S) l9 J$ l - & _, Q- m9 a2 O2 j+ N4 c
- }4 l- b% W9 Q3 C G9 a" f6 W3 P4 W
7 y) ~" E% l" q/ Q- " F& ^+ h ]8 l* M7 s
- 7 C" C" X9 T0 {
- DelayXms(70);6 i0 k* Y) K' c7 U/ }- L% k5 b
* t6 a1 [5 z; P+ U& M, X1 Z" e6 m-
* x# Z7 W6 z* r) E0 @( f( t5 t0 r - 4 C. y" w8 t4 F8 D; V- r
- data[0] = IIC_RecvByte();9 ~, l1 z6 `1 Y. z. r8 N% m" o4 J
' s! V! |& \. J8 [0 V& Q- IIC_Ack();
- h2 K, R# n, Q+ |' D6 M7 a5 h# ^0 v - % Y, d |- {5 V5 V% y
- data[1] = IIC_RecvByte();
: H/ L: {. V, [5 O1 g& M - # a, E5 N' ?- [: W9 B
- IIC_Ack();# z( R! ~7 y: {& [
- , C; {( D; W% h3 C" P
- " D8 H& w/ H$ z6 C. ~, b
/ D% ^2 N0 t8 l% k/ r* C) K- ?- checksum = IIC_RecvByte();) G7 b, E/ R/ r
- 9 @, S4 I& `+ q4 [) H+ |
- IIC_NAck();: z. ^" R; q; Z- l0 L
- 2 w2 Y' e4 W! K; D$ |; A1 H( s
- ; m* N$ d: ~, [, _
1 C- U$ y$ J3 R3 V- IIC_Stop();
% I: t4 G9 }$ V h- M) }; A - 3 H9 w& c, A9 n( X
-
. w3 Y8 B% L4 M9 K5 i% Y: O1 g+ n
s, J; V% f! @. W: B- SHT2x_CheckCrc(data, 2, checksum);1 D4 I: w7 K/ a6 @
6 {" |* ^3 d& a n/ b! y- tmp = (data[0] << 8) + data[1];+ g( w C. s; q# M4 \
- & B6 \- c) o& J! n
- if(cmd == SHT20_Measurement_T_HM)
# u8 t& k- t8 w( J1 V* v i - : i/ |; j) R, ?+ u/ N; m8 @
- {& g/ L# ^$ Z) ^3 u0 Q' o. M
( e( }) x0 d; f- t = SHT2x_CalcTemperatureC(tmp);+ u# z$ I! H# T) ^& C( g
- 7 E" ?5 c* K7 O. s; B
- }/ u* ?/ `" m, ^, o
- * u; q( @( N8 h* n! j/ ^+ [/ \
- else
0 f+ G/ C( M/ g& P: ?
) B: p. O7 Q# A+ F- {( }) w' j) M% ^
5 @' S$ _$ M8 w; D) [& F- t = SHT2x_CalcRH(tmp);. {8 C' E. u- k# l
- ! G6 A2 C8 j1 A" H X3 ~; `2 Z1 Y
- }: ]2 [. {. Q& Q0 @5 D
- 9 R3 `" m/ F! y* T+ F
- 5 V5 M6 j6 `7 |2 b E7 H
. D4 t F; ] t8 L4 l- if(pMeasurand)$ z3 h1 i T* e/ ]5 R! R
- 5 d7 G1 {- _; C: ^9 a \' C: H
- {$ b7 c7 x# {# J& j
& j* \* |. K0 {# Y9 [) K- *pMeasurand = (unsigned short)t;
5 P( J9 {4 ]# p - l( h2 q9 ~8 J/ m# y' q
- }7 z8 y) E G0 d: t- J
+ ~0 Q4 v, I% ?-
3 |" D$ B% p; T! e1 _
! [3 ^% l4 t; P. q- return t;( R8 @( s$ r @5 M5 ~
- , I$ L. X( J; a) n7 h
- # y* K ^! k. c) O: h2 d
- ; A( m6 `% T* Z1 Y* k
- }
复制代码
3 ?, p; t b& H6 r上面就是对应的读取温湿度寄存器里面的值。 最后读取出来的需要进行转换。 如上图。 最终串口输出数据。 单片机使用的是STM32F103VET6。板子上还有其他传感器明天接着水。 1 M" J( F* j0 I4 h+ M
|
一晚给你水一篇