【年中粉丝节】+BH1750光照度传感器 今天就再分享下一个光照度传感器。也是比较简单,和之前的温湿度传感器一样的是使用IIC接口,所以两个器件是可以挂载在同一个总线上的,因为他们有不同的地址。 可以测1-65535lx的光度值。可以用在LCD调光方面。 下面是芯片内部架构,其实使用的是16位的ADC,输出是12位的,所以可见波动是很小的。 上面的图是描述的芯片读取数据的一个流程。 上面是芯片内部寄存器的一个表,同时下面很重要的是器模式配置,可以配置1分度的,也可以配置更高的分辨率0.5和低的4。 下面直接跳到重点,首先是确定其器件地址,我们这里把ADDR 脚拉低了所以器件地址就是上面是七位同样需要左移一位。变成0100 0110。也就是0x46。 - #include "sys.h" q6 y- Q( u. M" ~0 A7 l1 c) a) R
- : @; @3 L8 g8 t/ P& |& ~; h
- #include "delay.h") E8 [( s7 B7 B' p4 K0 W
+ Z: U: W# g. R& n; [; c" }- #include "bh1750.h" M1 T7 _$ ?) ^5 r
' w. G: P; m C; a( s- 4 u9 D1 i& D* H- ^
* T+ d$ J$ A( H# v' w- 7 c+ n( a( L3 s, H B# G
- & G8 }# q! s& \6 x, Z
- #define SlaveAddress 0x46 //定义器件在IIC总线中的从地址,根据ALT ADDRESS地址引脚不同修改& l9 }8 F5 ]! H6 D; ~/ E
- + u5 R3 N7 {! t4 m/ V
- uint8_t BUF[4]; //接收数据缓存区
, z5 ~0 r t4 w5 G& \ - 1 D* P5 B4 Z! R; H- M; J
- extern uint16_t Light_Value;
2 e! L* `) ~9 v' o8 m# j1 j* S2 m2 G - & a- ]5 N: l/ N& l* N
- //uint16_t Light_Value;# r/ A& ~3 G0 S+ @% O7 c Y8 d
N6 ~, [$ `* r W- x2 K" X-
0 j5 K/ w, z% S" m& Y* e8 s& C
. ]; p5 \/ x" i! C$ ^* l( m0 d% e$ {- void BH1750_PortInit()
4 p! m( W! D, n
& _4 J$ K7 e" J; C0 q; H' D- {
- H4 N% y- C" Z# Y+ p/ q& H" J
9 y. b+ z+ k5 H' c5 |3 V) n- GPIO_InitTypeDef GPIO_InitStructure;. P' S) R8 A2 M- @/ y0 Y
1 [/ u2 e0 Y8 f! f% Y/ E( H- # U7 I0 Q7 d# g3 A. S# {* c
% l* d+ Z9 ~8 M8 z9 C- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC,ENABLE);
8 s' u/ e) c5 Q& s - ! r3 q2 a' A; L: b! F3 i' g
-
) W; r1 j5 k" g3 Q) ]+ a9 K ^' a! ?
; B& c3 J& {. ~# i% `7 m2 H- //PB6-SCL PB7-SDA PB12-ADDR( Z. @% ?. v$ Q5 { V+ D
- C' a- W K) T9 J
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;
( H' ]! k5 x# h4 m5 A5 ` - f- p% T1 y- O2 O# ^
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ; //推挽输出
' j" G1 A, T" M* U" `8 A8 U - , S& g. s( \9 T
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
% f. J# z$ u1 g7 X
( u" p! w1 T! |" z8 F0 ]8 a- GPIO_Init(GPIOB, &GPIO_InitStructure);
1 G4 Q: V' C! D n9 a" b; M1 E% T - 8 h6 |2 Y& K0 M/ Q8 n x, k0 A
- GPIO_SetBits(GPIOB,GPIO_Pin_6|GPIO_Pin_7); //PB6,PB7 输出高
! e- c$ B& } u# I6 \9 i. R
# I% g; p+ r0 R& ^. C8 Q- / z3 y8 U i( S! H
- 7 J: W, N- z! b
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //PB.14 PB.12# J! ]# C' y% r# \) H: M( Z7 M1 G* B
- 2 t' U. m/ ?+ I' j }
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
; p$ o" m2 w: \, W, s - $ `: ~1 w; k# x; o/ H' K) }8 n
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //复用推挽输出6 [8 ^, D+ V* u7 L. d2 g) p
- * s+ E4 a9 G8 R& f% K. M
- GPIO_Init(GPIOC, &GPIO_InitStructure);
. o" t h, ]: [1 f& l; p/ S6 x - & `5 H. q7 w7 t1 O
-
( x% E% h5 g( f$ k" G7 |3 [
2 g. g" W$ S. V6 i0 K- }
$ T9 P2 ~0 C' V6 r# Q7 A
) x5 s* X6 v2 a M$ [- ( {% q, h8 V1 z0 F+ Y6 o v' V
$ S3 k; i7 _, ^-
h# {* H7 `. K - P* ]7 }2 k0 o( w7 {# ^. Y" z( f
- /***************************************************************
/ j) S3 V" n. q2 W1 j* m
) y# |8 r) I" Z2 e- ** 功能: 产生IIC起始信号3 y$ N$ k O' y. o% v9 V C# X
9 K# Q8 [8 F5 U6 P( @& q$ f9 H' K2 x- ** 参数: 无参数
! i, Y/ r ~3 h1 e4 \+ u4 ]
8 S8 \0 S1 `# a; D2 T- ** 返回值: 无
/ l9 @' o% u d( K' U! s
/ N2 n1 V5 V, a+ ~- ****************************************************************// R2 M( O/ Y3 {. L) z/ {
- 8 ~3 S: f9 X Q5 o. j, Q
- void BH1750_Start()5 Y& B. `( N2 J# f- V4 L( M
- 5 k' ~7 e, |2 r
- {
# n$ L3 M% X9 [, X7 U0 W2 b - * q+ G9 l, X: N4 N$ R( R0 H7 Q7 R
- SDA_OUT(); //sda线输出6 \' N a% z2 d: f
# v2 R( M+ d# O8 }/ p, n- IIC_SDA=1; , \3 d& t F0 C' u5 S: \3 F' G
( z+ v# L/ r. s% p4 C- IIC_SCL=1;) {9 \( f+ p4 M u, C4 ^- c6 |
- 4 @% B$ w1 R+ a3 J, s( p
- delay_us(4);
5 w L) ]+ |' t q. k
3 @$ \$ f8 T8 k6 q6 g. L- IIC_SDA=0;//START:when CLK is high,DATA change form high to low
) O8 c0 O$ n/ \, l$ q - ( e) X& f, ^, n } r
- delay_us(4); }5 E( f7 @; V8 P. P9 r5 @
- $ G4 |. q# ^ J n
- IIC_SCL=0;//钳住I2C总线,准备发送或接收数据' c: `4 s, L. [
' [, y" S! E. D7 w. P- }9 h1 d0 x% ~ [ m+ f6 X
) h1 O/ r: v3 y% u9 Q- /***************************************************************
3 E; a9 \$ l* ^$ G$ v d: @
4 p- v- L$ L# l9 W/ i c4 Q- ** 功能: 产生IIC停止信号# T- G. q6 j$ T, H7 k
- + A. M% W" m- X! ^2 R& L$ n9 J
- ** 参数: 无参数
) Y) Z: D' O0 i+ s - ) I+ `5 F1 B; m u
- ** 返回值: 无: m) e; D) e# s7 w+ i5 K
6 S% ?1 f3 l1 P4 u/ O" W- ****************************************************************/- l* v4 ]% y' g- T1 ?" n6 e }
- 1 r* H8 Y& p: U3 T0 ^. y
- void BH1750_Stop()
4 o) l7 j) q! o0 y, @
4 J( {! g" j) D( A- {) \6 M- G' Z& S% r; B" Q
- $ h6 _( p9 y5 H1 s! ^2 j4 s$ V
- SDA_OUT();//sda线输出
7 E/ W) J6 z- n, K3 N
! ~. n5 k: H! c' Z6 k8 |- IIC_SDA=0;//STOP:when CLK is high DATA change form low to high: G9 I8 X: t7 I* e, v9 |- }
' Z* Z( f" Y7 K/ V9 @4 a! V- IIC_SCL=1;0 f3 M2 @9 W; B1 ^- J/ A
- ( G: n4 L) {! ~* n1 S
- delay_us(4);
) X6 p _5 E1 m. u - ) s. E6 P) v5 j1 }
- IIC_SDA=1;//发送I2C总线结束信号
1 R* [! d6 ]/ S6 A
% Z! N$ m' f, b7 y; I- delay_us(4);
y" F+ J4 h+ x# F9 G+ M2 B - ; f% R, e! h4 m; v
- }, Q) P" k0 X: E6 R
- $ b* L8 b. M5 Y( p" \
- /***************************************************************: y1 a+ S* J, }
- ( O" j5 N$ }" k# q. S
- ** 功能: 产生IIC应答信号- x4 L2 u6 G: A/ J
- + w) s/ @' x, y( ?
- ** 参数: 无参数- H3 h5 {! B' G/ v% i" ^9 {/ }
- - g& a8 t: n! |5 `
- ** 返回值: 无
, B- w1 x9 v3 r+ L+ f
' }( a J+ ?: E# [9 H% Q- ****************************************************************/1 i3 T7 d U" C0 y+ |( \8 w! \3 \7 o
- % Q9 ]& C+ r( m9 A: f3 J3 p1 v
- void BH1750_SendACK(u8 ack)/ Q/ E7 y0 t9 q" y7 r
- + s( Y2 ]; R# Z' b* z8 m% P' E }. t
- {
, O. p4 d5 W; O3 C
) t. ~( a* m( R4 ]. O: C2 ^- SDA_OUT(); //sda线输出
1 m! K" r" a/ d* o# F, E - & K2 K" P6 s- Q
- if(ack)IIC_SDA=1; //写应答信号7 P5 j: T! ^, f5 h# V, [' a3 u
8 R. L! e( y1 B% _* b- else IIC_SDA=0;
+ T$ f* |1 B+ d4 p& J
' \8 N# M) [# B' Y! ]0 D% ]- IIC_SCL=1; //拉高时钟线7 I. W; |9 k2 O |" q
- ) x9 y8 W9 D8 X9 R) ~5 p6 B. V4 V" `
- delay_us(2); //延时
4 Z% b; ^- {' [8 } - : t t& Z: X. t2 s: N. o
- IIC_SCL=0; //拉低时钟线
, L; t; r. k( J
u, h1 ~9 J3 [/ y$ W0 T- delay_us(2); //延时7 j5 @; y' E$ b2 q( D
- 8 ?- J% j: h% x' g& h$ C* N
- }7 j4 R* s5 y, f
# w1 c" k8 M2 d x! C# E-
4 G2 B3 I( n- L# x( D9 q6 f' Y - 3 L/ Y" H6 C; d5 p+ C( K) s, t
- /***************************************************************
( L7 f- I% j2 _9 [2 ` s! U* w - 9 w& `1 Z5 Z. i% r% ^5 i( W
- ** 功能: 产生IIC接收信号
3 ] Y) u6 n4 m8 U, Z5 J% Y - ! u+ L4 R) J b( r0 b# d; W3 ^; L
- ** 参数: 无参数2 f" z# T$ m; ?5 W" E/ g. S
- , q7 ?" d, t) n& l( g+ c& X
- ** 返回值: 无
" ]% Y1 C7 q2 {* H( A) {% G6 A1 }
0 p9 n" w, Q' ?8 u) M( _7 t- ****************************************************************/
9 j# ?$ B. h0 P- b4 c
+ j' J) f- j# @0 J- u8 BH1750_RecvACK()7 H. a, V T _, \
( H4 U* x4 ]% g5 G- {
7 m+ M; r( m: G4 |5 ]) d - % q3 B& ?/ |8 D& s: c
- u8 data;/ o. k0 q. u9 M$ o6 H9 K) @1 N
- 8 _1 k" p& [' G, |; d1 f# J0 u
- SDA_IN(); //SDA设置为输入
+ u( @( u% I: T8 S+ K2 n1 W - 6 o. f( @) U9 V) I! ^( G; Q
- IIC_SCL=1; //拉高时钟线8 O4 }2 I# c. E5 T/ m: }
1 Z7 H, Z9 X' Y' a; W- delay_us(2); //延时- j7 t2 f: ?* S4 A, ?& ]8 D& \
4 p9 m- p! ^: ?/ k$ X1 O2 j5 k8 }- data = READ_SDA; //读应答信号/ O$ y. W# H6 \; Y
, t/ S6 b% H# G- IIC_SCL=0; //拉低时钟线
! T( {" k2 b( h* L" @ - ]( }9 }- }1 ?' r$ f
- delay_us(2); //延时* e4 D b! e1 A G
- $ E x: {' z! z. K5 u: @, Q E
- return data;
: S) z X# g6 s8 [; \+ W) h0 s) j0 Z - : D" E# r; `- j5 J: {& T
- }
/ k$ r r, }0 K+ ^0 [" b( J - 7 a" s; N6 ]& @+ H+ f
- /***************************************************************
, w# q8 o, Q, [$ K
4 Z, {9 ^2 @: F7 x7 s5 T! J4 I9 D- ** 功能: 向IIC总线发送一个字节数据, K6 K7 }2 P8 w
- ; f( S' \0 _3 |2 e& }, @9 s# G
- ** 参数: dat:一字节数据4 G c! u, I* N0 M. e& j$ \
- ! ^$ F# i' @, r8 t) s) `
- ** 返回值: 无; s6 M! G% q5 ^
- + h3 V+ f$ C. X' J
- ****************************************************************/
, w) P o$ K& S7 E6 l - ( @ Q! M2 u+ V2 ?0 ^. O5 D; L
- void BH1750_SendByte(u8 dat)
' [ A8 Y3 R9 [ - : b1 a2 A' f# {9 \, ?
- {3 `* {/ L+ e& i, m. B B
4 b1 e; l) s( x5 m: p& V2 _- u8 i,bit;1 P$ U% _' j/ d2 i8 D
- ; r2 g2 U+ R* M
- SDA_OUT(); //sda线输出
$ ]2 }' Y0 r1 m U: j/ U. G - ' M: h) A2 Q3 H: k
- for (i=0; i<8; i++) //8位计数器% ~; H W5 E, b/ k6 R" x
- / v+ L! o6 w: M3 c. U: O
- {5 B3 t/ D% k: ~. O0 t
- 0 _" ]$ e8 r6 m+ S5 x s
- bit=dat&0x80;- E3 h! E3 Z0 I1 j( C% Z
" C9 R) V0 ~/ s) ?$ e, X3 J- if(bit) IIC_SDA=1;
$ l9 x& `$ ]% i% ]" }+ P; k/ k& D9 `- _/ ?( U - 9 v& j# f/ N# t9 T9 q( y
- else IIC_SDA=0;
8 n. g% }0 L/ z! z( H
( B$ ~( j. f" b- dat <<= 1; //移出数据的最高位
1 m3 s7 N& b6 ~( W. \& S; \ - d/ Q, n, y& k% j
- IIC_SCL=1; //拉高时钟线
- K( I+ U" b5 ^( S - * M4 }: o8 q$ }7 R
- delay_us(2); //延时* b/ D' x. `. ?
+ F- Z, h# b, ~( t. @# S% N- IIC_SCL=0; //拉低时钟线
' B u' O" g, z5 @3 ?
' I( E- T3 Z% F' |- delay_us(2); //延时
1 e& F$ j2 L$ W' ?6 O* J. b3 e$ [ K - ! g1 s+ y3 l. `2 @* J
- }
% V5 Y! N O. X: R
8 W3 q4 A: ^# A% f& R- BH1750_RecvACK();- n6 f) o5 e: J9 ]
+ t8 j- v5 o, [# s: E7 P- } J' ^, y: L2 s
5 v& `9 @* ^/ v% t' ]& S/ w- /***************************************************************
: G0 M% r- _9 E; N
6 l+ {. M% u6 ~" f! U3 f4 m- ** 功能: 从IIC总线接收一个字节数据
0 m9 d( h9 `: H0 _4 [: D: c - * C; v0 ]) @9 ^& @ S" T; {& c v
- ** 参数: 无参数
& ~& M' w5 S. m E
( `* f; c$ ^8 Q( Y) }) z- ** 返回值: dat:接收一字节数据$ i& a# ]$ H: h8 J5 H! u8 `
; ^. L, z& S( P3 j3 r$ u& a) y- ****************************************************************/1 a# C U2 Q) x: @+ Z
7 ], D: V i7 y9 _) V: P8 c- u8 BH1750_RecvByte()
% c0 n$ ]( x0 t- }# v
' `8 Q$ J$ \! H- h' @0 ?% u- {- {, v; C) }) M
R; H; I# p, u- B! r' s9 s- u8 i;
5 h3 M# X( W6 `+ X" N0 g# g - " h6 P9 X7 B) L6 k2 Z
- u8 dat = 0;/ z' \0 A* W/ e \1 s
- : P' J* g% I/ b r) Q) g+ a( U
- SDA_IN(); //SDA设置为输入
/ M" J, Q% B* x+ e% \
! d) B0 K5 v/ B: t7 [0 B- IIC_SDA=1; //使能内部上拉,准备读取数据,6 H: Y2 I7 c) h+ s" u( U# `2 `* p
- 2 ~, H: k( l0 k% x2 u
- for (i=0; i<8; i++) //8位计数器
( K% p2 U% x4 M" p9 M/ L) O6 t - % U5 S% s. @' i4 n2 S# E, b. b+ @
- {( l, J6 X# Q1 }1 z7 M* }; E
/ J( l& q+ p8 c: N5 _- |# P. [- dat <<= 1;
' G5 q% K& n. h% J- A, N
3 O- L' Y; H+ K* `4 w4 Q8 g- IIC_SCL=1; //拉高时钟线
" G4 K6 o u1 J6 }/ s/ S
- i/ e( k: o% g& K, p- delay_us(2); //延时
& L& g7 }4 f+ I3 _, T+ b - + ?" p' S; |7 v. q+ \# O
- if(READ_SDA) dat+=1; 7 V9 @( u+ T) g3 Q
- 6 Y) R& \/ X( V' H
- IIC_SCL=0; //拉低时钟线- K& G* K: |8 Y0 D7 m
- 1 h* n$ f3 `7 \6 A2 G% R
- delay_us(2); //延时
' h5 Z) n. A% C5 U0 k0 ` - : N5 a9 @* G$ e' P z6 N
- }6 R7 d, G% B& `) d {. j
- : X5 w, c* b* e: {8 [# W
- return dat;% W+ |; {8 j+ ^/ }. N
4 z. d+ @5 e0 }/ m- e' |0 S- }4 y! g, [" ^ u% r$ s+ I
- * S: s' }" Y* D
-
) p' U/ T8 W* O# g - 1 k, O1 T/ i# g. F8 K$ M; `
- /***************************************************************; Y/ u$ t- ]; H6 C: Y
- ' J- C6 y- g9 h' o' o* `1 g7 N
- ** 功能: 向bh1750写入命令
: }! u* T4 I o+ K: t! D% V; s - ) n7 r, ?% X0 C+ L! `0 u. J) h
- ** 参数: 无参数
& x8 g# ], v% r) X# n A6 K! o1 h
5 S( z7 p' G' O% d# S0 ]' k) A1 }- ** 返回值: 无8 F, a& v$ `% @ A
- * r. C8 @; C' j) Z j* Q) m v
- ****************************************************************/: \0 n: ~/ I+ v1 _) K
- ; }3 U& K/ l+ p& O! S
- void Single_Write_BH1750(u8 REG_Address)4 a- U1 O! s1 L6 \# W
- ( Q) y+ _7 \8 y) W# ?4 t
- {) p( @( H2 O! x0 x; S5 s
( q* i1 h% F% X5 |/ A- BH1750_Start(); //起始信号
0 T( i) T# P" k+ R# c - 7 v( C) i; |; J. t
- BH1750_SendByte(SlaveAddress); //发送设备地址+写信号
& X/ Z7 Y! n# r: ^; B( {
5 u2 A6 [ z; s& O- j0 U- BH1750_SendByte(REG_Address); //内部寄存器地址,1 L4 S: w0 Y/ K3 ?# |9 g
- - T7 }) T, `; ]- x, }
- BH1750_Stop(); //发送停止信号
- \3 D- ]4 |! \& s6 ~1 F. R, D - ' d7 W: r& D1 |! O3 V e. F1 d' a
- }
L& d- n% `+ v6 S- Y. c9 L
2 C+ i! P6 B4 O( o" b-
3 A: x: e4 t$ u2 J
7 G( j: I5 u. @% n% }+ W1 @6 Y) U2 {' r- /***************************************************************
$ w& r9 y8 k' y$ y
E- g$ I3 p; W) u/ S3 U* K; ~- ** 功能: 连续读出BH1750内部数据" r5 e _' ^* r. f7 T$ z1 J
- " }% y h' U* C8 t5 n
- ** 参数: 无参数
8 t# Y f6 v) P S; y - 7 j: U% L( L' R8 q
- ** 返回值: 无* [/ D# g; g2 {
& @+ \6 ]- V, A" c3 E* D- ****************************************************************/4 V: }: w* k& k [2 o/ b) K
- ; E. p" v c! ]* ^0 A6 r% X1 U
- void Multiple_Read_BH1750(void)
# ~9 H: g3 z) b1 G - 8 j l' P& c% h! g0 v
- { u8 i; $ Z! Z# U/ }, O. G) v5 T0 U
. D: i# h" w) W+ J9 U/ W7 B8 P0 x- BH1750_Start(); //起始信号
4 a+ R! w4 \" C1 U8 ?. _ - $ y' s3 s5 O" q! Q4 ^# o
- BH1750_SendByte(SlaveAddress+1); //发送设备地址+读信号
, j( r/ t' w/ h- `6 i+ P) W - $ I, F5 |" C$ a+ z
-
' T' P9 H! U3 L K) C: i2 u - ; R" `9 P$ ] F9 O/ ~" v) n' I1 r* S
- for (i=0; i<3; i++) //连续读取2个地址数据,存储中BUF& M8 R s& I' S3 c x
. j1 C& @4 k$ e( n1 n! |1 _+ B- {
% r$ I; Y A6 }$ M4 o# `# h+ K
6 c+ C5 I8 |& p1 Q# F" ~* X' j- BUF[i] = BH1750_RecvByte(); //BUF[0]存储0x32地址中的数据
1 k. P: `- T1 h: a3 l - ; e& K( l6 i5 A7 a/ ]/ ~7 V9 t
- if (i == 3)1 v$ y& q1 E8 z4 i% J) \
- 5 @$ c4 ?( |7 f+ U
- {& P4 i _$ o% l4 }3 P/ n
. {% I& a" _9 T) Z: A- BH1750_SendACK(1); //最后一个数据需要回NOACK
* a( I# o0 ?( e/ ?
+ q- v" ]/ P5 [, {- }$ v* ^. p0 ^# w- Q) `) `
, n# Y: S7 G6 y2 e2 E4 z% h/ ?- else
' t; T! [9 @" f p - & q) `6 R$ K1 w9 `: W# f4 Y
- {
: a! k8 L& V# _% U8 _ - 2 p$ _" w5 g0 R
- BH1750_SendACK(0); //回应ACK6 u+ P3 w& S8 }' ~
- ) c# [ \ k: `
- }$ a( L' T% Q5 i9 V; w$ X
- & t; ]# M7 f9 E% Z. _/ ]+ ?
- }
9 ^0 D I5 J, j* G+ x* i: C7 |! d
. G9 g4 Y( w8 h4 R- BH1750_Stop(); //停止信号! h3 ]5 P h! `' c! {0 \
3 h$ z1 g( g/ C0 |5 w! T4 ~: G- // delay_ms(150);
# X" d4 U8 C, N3 f. n. z5 O( }: o
, N9 c1 ?3 [' J2 U- }
6 ^% ~/ f2 d6 _$ R( \
& }' L5 `' N6 r4 x: _* L$ ?- / f! n* N5 d6 H% K/ S7 g0 K' J
- / b2 |5 i) c* G# f
- /***************************************************************" z" |8 X9 o7 w \
) b. k r! f: C$ |- ** 功能: 初始化BH1750
) N0 p; Y3 ?/ s6 [; P; p$ w - ! ^8 s/ @7 A9 J8 ]" M5 |8 l, J5 f
- ** 参数: 无参数% G4 q' v, V* W! N& @) C; O
- # Q% t, O5 _1 F" O# Q$ z1 y
- ** 返回值: 无( W% B! x% J _' I9 }
, E0 D- p# }8 `" a$ ^- ****************************************************************/
( p8 Y2 P6 U1 [( w- w% e
! X4 q# X$ V+ c* q- void BH1750_Configure(void)
: b) |4 E0 |, F& v6 P - ; C: p5 a; x( Q) X0 Y) w
- {5 A4 g* m! \5 I/ d! S p/ n9 g( b1 c
$ L3 e, q% h: @# O4 D) A' y- ^- BH1750_PortInit();
2 Y+ P8 u( H, Y' L) d/ u1 |
1 w* q" g9 d/ L- Single_Write_BH1750(0x01); * r: M( o7 M7 a- i* o8 i* D
- 9 `; P7 `- Z ^9 n7 E$ I
- ADDR = 0; //将ADDR位初始化拉低" Z8 i5 F) V- B- b: O7 a9 E" n
0 g" n7 C9 N6 A$ j- }% y: q: e8 _& H5 ?
- ) G1 X/ K: z+ c, u
- ) i2 p7 z3 Y1 U! K& F5 u1 E, m
- % {3 g$ K1 m9 S0 j
- /***************************************************************
" w" H* s5 k& o _. L, l
( |' N4 D7 T' V$ }2 X& B- K- ** 功能: 读取光照度
2 s( |- _+ p4 H0 f# s9 U - R0 |% I; U5 x. {# V. d
- ** 参数: 无参数; W9 j+ m' Z( G% g. P8 x `. x
1 ^8 T( \# @. V0 _. E& W! [3 d5 R4 b- ** 返回值: data:返回光照度值* B( Y6 I3 f. W' T ?- a
2 Q. e0 A C( |5 B2 ]# J! _8 T- ?0 Y- ****************************************************************/2 [+ c5 R! Z% z _$ c; o
* v1 Z! L# F9 ?6 O4 _- uint16_t Get_Bh_Value(void)3 C3 J' m; Z3 p0 D2 O* D6 k g
- ! V9 C" p) q* O$ h2 S$ u. K5 A. E
- { 1 T1 o% n$ W6 I- i! `: l
/ ~( ~6 j' D& e& C/ h$ t- static float temp;; x. _9 T) T& ]6 [$ a- F
/ M' c% B3 v; Q. x' t- // u16 data;
. U8 q/ N! B* U* t% V% c
( u$ s: I2 A. d5 I" [- int dis_data ;* k7 V: e6 |+ R/ P
% o- W% Q9 q5 H9 f- Single_Write_BH1750(0x01); // power on& Q8 V) \3 c2 m I1 j( ^ m# b5 }2 u
- % |/ r8 c! c6 Q4 V" W; P
- Single_Write_BH1750(0x10); // H- resolution mode
- I' @, z- q+ d& d' U - 3 P9 y O; s; S4 I/ I
- // delay_ms(200); //延时200ms z3 I7 F' o5 b& W k6 V
4 E% c) C7 I$ {& j) e1 T- Multiple_Read_BH1750(); //连续读出数据,存储在BUF中
/ X+ O& v9 G7 ` z
' x: t% I2 y4 P9 T; F2 w& c5 {- dis_data=BUF[0];# ?% N' }# p8 F( O# j! [6 o
- 5 c9 i: u' ]/ ? V
- dis_data=(dis_data<<8)+BUF[1];//合成数据,即光照数据
i! ` y# j: ]6 ^* z
$ ]( p) b( |+ }+ U9 q( D" I- temp=(float)dis_data/1.2;
W7 ~% N- `8 J - ' K3 P% q- s$ O( N* Q
- Light_Value =(int)temp;' j8 C# e* z& q, J
! f$ u+ u# m, j4 B$ t- return Light_Value;
9 m; ]+ F# C% Q! I. m" s' ` - / C( U4 x) q0 q$ S% _+ p
- }
复制代码 $ F6 ^! I3 ?( f7 G
上面是所有代码,我们只需要在主函数终循环。Get_Bh_Value(void);就行。 我们这里就是使用的简单模式H-resolution mode,没有用其模式2,模式二可以更改采样时间,从而提高精度。感兴趣可以自己去看下,就是比较靠后的就是模式二的用法。 当手机手电筒放到其光窗上可以测到最大54612。还没有到65535。 同样使用的是昨天的板子。
- H8 C. H! ~' I1 d# d' H |
用的是自制的STM32F103VET6开发板