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