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