【年中粉丝节】+SHT20传感器 今天收到年中粉丝节的活动,看了看,对不起了日天兄,我得水个好几篇文章了。既然是分享ST开发板与传感器的文章。今天先来个SHT20温湿度传感器。 先贴下参数图。 首先通信接口是IIC总线方式。 这张是性能参数。可以两个湿度传感器精度可以达到12bit分辨率,温度是14bit分辨率。 到这里我们需要看到其发送数据的时序,逻辑,同时知道需要知道寄存器的地址。 在程序中对应。虽然地址配置的是0x40,其实是在发数据的适合地址进行了左移一位的操作。 - float SHT2x_MeasureHM(unsigned char cmd, unsigned short *pMeasurand)
1 [1 R6 j, P8 d( Z; O( ] - 1 ]7 Z) u7 w5 C4 S
- {8 s" ~6 q1 O5 |0 k; C F
! e& [4 E( o) R. y% V0 D3 G( S; Z- & z% b! B; g# u1 T' C8 S
) B$ `" d7 t6 Z* G# c- char checksum = 0; //checksum$ R! C: Q" r l. i0 t$ T
- 6 }& r; l/ e4 _9 B# g1 A
- char data[2]; //data array for checksum verification
* u1 e9 E, m; ]6 L - : h/ E6 A/ w1 r! }
- unsigned char addr = 0;
9 C; C& r* E6 m p( m1 U7 Q - ! b. Z3 T* j9 L
- unsigned short tmp = 0;- d! e m& d; U! L+ Z: @) x
- # b* H% m. ~" F4 W
- float t = 0;
# L& Z R1 g9 D7 ?/ o
' g }% l" T h# Q& [# d4 q3 A7 O3 B-
; [ X9 L9 ?5 m E - % c: F p# y1 M8 V! e& G
- addr = SHT20_ADDRESS << 1;
6 F T2 \" ?' q( m5 z3 i) C7 y - ( t2 g2 Q. e, D& \
- 6 L' \3 x7 y) y. l% ?! S1 C3 D+ j) k
- 2 Y0 T" W: K r# C: V4 N
- IIC_Start();
, e( J3 i+ |' \5 z
% z' |" {/ T1 v* i$ q" I, \) I-
5 Q( @1 E" h F. u - / Z# @/ o8 d V* q
- IIC_SendByte(addr);
, E& j, a$ L8 j# e0 }- u - x' e: g/ A u& {
- if(IIC_WaitAck(50000)) //等待应答
' |, W+ \$ O/ @; k$ P: U; F' L
. ]/ x5 t! i2 O; |2 A6 f: O, d# u' n- return 0.0;
/ e: D: Q1 D( f2 P4 J4 Q2 a9 ^
' U* \! y" b& }0 H3 J% a# T, D-
8 b0 ]) g- M/ |" F4 H - * S" V0 d7 L! Q
- IIC_SendByte(cmd);+ j' f7 V8 L! {% [; g
- 1 D6 e! G* x. ~
- if(IIC_WaitAck(50000)) //等待应答7 L# L8 ?" p8 r8 U) i. [
- I) ^+ F R; p+ s
- return 0.0;2 N# Z( {/ n0 Z* ?& j
1 V8 r7 a/ f6 S& r- c# V# f1 ^- ; ^8 I6 J! Y, `5 o9 A! @
- 1 f u- l8 }7 Y4 E1 F
- IIC_Start();0 f; J( k, G" m) o y9 L
- ( g( \0 Z4 c- S0 ` n/ q' R# K3 V5 p
- . C- ^1 x) h, T, E: v
; w/ N) _5 \. A- IIC_SendByte(addr + 1);# Z1 @' s8 p) o% ~9 X! K
- ' H; H4 B. ?4 X! t2 D+ L$ u$ z
- while(IIC_WaitAck(50000)) //等待应答
% Q; N& |7 P0 S0 S: T, r - 6 r* y! ~* b1 ]% J; Y
- {0 S# a' X0 M( r* t$ X' v
. I0 w. A& Q0 t- IIC_Start();" w: u0 t9 E8 F: a/ b* P6 i+ p
1 z3 T- F' Q7 {8 |& m5 ~. I% t- IIC_SendByte(addr + 1);
! C' K' ~5 y1 {; S) o4 t( d& O0 q! s7 X - - |6 _: @' k2 l1 | j
- }
% [! C; G% Q3 S$ ]+ Y+ T, A5 e+ I6 {
- \. F' N8 ]' J0 L# Z-
6 k1 R" O. R$ B& p9 k: d; G6 r6 Z - * @" G5 D8 t: k$ a( {
- DelayXms(70);
* z) V- r& O* K, m" l - 1 T) {4 A6 h: ^- F/ c& h7 s. O
-
# \6 N( k& {6 Y, |) ^9 I1 O$ G2 L - 2 o% n0 ?9 _6 e4 [
- data[0] = IIC_RecvByte();5 ?8 C5 n/ q8 f$ `8 O- j
- 3 J* B3 G' t+ g1 g! U7 k# `* i
- IIC_Ack(); j, t6 J6 u. t" p
9 |8 g( _5 t) I+ B; R- data[1] = IIC_RecvByte();/ y( G: \. q) c! k' ~& d
$ D% ]! `+ x: V- IIC_Ack();& i+ C( r0 h& V5 P% G' _( a6 T
4 W. I$ j- x9 k) [6 H- : a" P% Q7 B9 ^- Z! r
! H2 i5 D' e4 A* }2 ?7 \; q& {- checksum = IIC_RecvByte();9 Y4 ?; ^5 w$ O- i m% k" r( |; v
- + K3 k6 T [4 s; P
- IIC_NAck();
8 v( H6 a+ \' P6 Q' i: e9 R6 t
" u( r& V' _- c- {% D/ {! I j3 S. ?
3 G6 t7 D5 {* D- IIC_Stop();+ N9 V* e8 Y7 m2 W: e
- * }2 O; u3 Z4 W: j
-
& ^/ m J# P. y$ ^ - ' m, C6 q9 a! o
- SHT2x_CheckCrc(data, 2, checksum);8 g, k, m9 A/ T# Z
* P% D. a( e0 g* @1 l- tmp = (data[0] << 8) + data[1];
/ B; c2 l: F. H% g- L
2 K( s& {2 U2 k1 D) I- if(cmd == SHT20_Measurement_T_HM)
- E2 F- H; `. V: T
7 v0 x/ t, V* \* d, f; W- {$ R. }! c; r* W. ^2 K7 ?1 J; I
8 a* J$ u: M3 w: G% J4 z- t = SHT2x_CalcTemperatureC(tmp); I: D7 K: w: C- Z8 {6 j
" S* R& U6 n1 \- }+ X, n5 Q @% z: _5 z& O) ^
- ! K$ \- [8 I; D3 D8 X T
- else4 ~. r, k. ~# m# L+ F3 ^0 n' V
7 z# O9 N: k2 c; Q) y1 |+ C- {
) F. x5 m5 f6 E+ q* w& q: [( f; W
4 B, M) q' `$ R8 z- t = SHT2x_CalcRH(tmp);5 Q: G9 R4 ?/ @ \7 B
- 2 n" ~ m/ v A5 s% Y) q- @
- }
2 ~% E+ V: n; g6 C! D0 h: R - , V) U' c3 }; c+ z! I4 ^9 R# _8 |3 q
-
) @0 g/ ` d9 e( E$ W
0 @1 t) r: R- {# M- if(pMeasurand)
5 Z6 A' _* e1 O1 y
/ x: |5 [1 M( A: R- {! N2 G m4 d, c# k) R; W1 z
i: k( ^, _& L' p. g- *pMeasurand = (unsigned short)t;
% ^, O. z$ T- j( `" B2 s - : `; S4 Q4 l# N/ }4 M3 X. V4 k8 D
- }/ g/ v; d: X4 ]! @, L- J
# D3 E% x" g1 M/ @9 W- 3 W* X' q4 x) ?: c9 \) T( S; t. ~
- . v5 h, w# t: c6 D" V
- return t;
8 @1 X6 s/ {6 b0 R8 Y - # B) p; e( b6 c. Z8 p0 S5 X
- : I7 i+ f( v: e8 X, _! j9 c. b8 O0 |
- ( m( _; F3 u8 ~; Z7 e6 B; H
- }
复制代码 4 m1 r- |' H; C
上面就是对应的读取温湿度寄存器里面的值。 最后读取出来的需要进行转换。 如上图。 最终串口输出数据。 单片机使用的是STM32F103VET6。板子上还有其他传感器明天接着水。
1 R0 Y/ S. ]* @0 D |
一晚给你水一篇* j2 E; B4 H# b9 \' s