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