你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【年中粉丝节】+BH1750光照度传感器

[复制链接]
liuxingkeji 发布时间:2021-6-8 20:49
【年中粉丝节】+BH1750光照度传感器
今天就再分享下一个光照度传感器。也是比较简单,和之前的温湿度传感器一样的是使用IIC接口,所以两个器件是可以挂载在同一个总线上的,因为他们有不同的地址。
1.png
可以测1-65535lx的光度值。可以用在LCD调光方面。
2.png
下面是芯片内部架构,其实使用的是16位的ADC,输出是12位的,所以可见波动是很小的。
3.png
上面的图是描述的芯片读取数据的一个流程。
4.png
上面是芯片内部寄存器的一个表,同时下面很重要的是器模式配置,可以配置1分度的,也可以配置更高的分辨率0.5和低的4。
5.png
下面直接跳到重点,首先是确定其器件地址,我们这里把ADDR 脚拉低了所以器件地址就是上面是七位同样需要左移一位。变成0100 0110。也就是0x46。
  1. #include "sys.h"
    " U6 u  }! H! C# x+ o. j5 R
  2. 4 ?; H+ ~- K; ~: w$ V! U; f* T' Z
  3. #include "delay.h"* c5 m2 `0 G3 o
  4. ; |( M! A8 P7 z
  5. #include "bh1750.h"8 D2 F0 ^9 y; [
  6. * d, {' z4 H( l. _  x7 P; L1 q

  7. 5 I5 F0 c, ~% X8 q6 g5 B4 P

  8. $ k( \5 z- Y6 y1 W& A1 ~
  9. 7 o+ S# r0 {( c; M- `( ~
  10. 1 V" U; V2 D4 q3 i) W- ^* O
  11. #define   SlaveAddress   0x46 //定义器件在IIC总线中的从地址,根据ALT  ADDRESS地址引脚不同修改
    , d9 N6 G9 z" E/ K/ d
  12. 8 s! W  `7 F% t
  13. uint8_t  BUF[4];                  //接收数据缓存区
    ' ]2 M/ {+ Q! ^5 I
  14. 0 z) Z% W8 ]9 h, x" U4 S
  15. extern uint16_t Light_Value;
    1 t4 t+ i2 m- Y

  16. & n* X: q% O, T% ]: I
  17. //uint16_t Light_Value;
    9 l4 {1 _, P! a/ {/ A' n
  18. . ]8 j$ U1 Y6 s7 {$ l1 c# O8 q. v
  19. ) F; R$ T: I7 g5 L6 m8 h4 o
  20. : s/ s  r" |) c  R- d
  21. void BH1750_PortInit()
    ( K+ k* G- n) L& F1 Z  A# [
  22. % p7 {5 Q: w/ L+ l+ n/ L6 d
  23. {     1 z4 r6 g. X1 c* F; ]: L

  24. 5 y; F+ @( K- J/ n
  25.        GPIO_InitTypeDef GPIO_InitStructure;# G/ p$ ]" V* A6 u7 P. ?" ~0 A
  26. 0 |+ W4 D) Y+ \! I, Q9 B  w% K6 h

  27.   f* B% n9 x! |* p7 R% I' q
  28. ' {4 ]$ {. q3 B1 T4 Q
  29.        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC,ENABLE);0 |' `7 d+ X4 C; X7 `2 l0 w. ?
  30. 0 F0 Z# ^4 ~; u9 ]7 f6 b
  31.       $ V6 ?0 x7 U1 M5 Q

  32. % \+ X/ J6 a3 P( l9 g+ z
  33.        //PB6-SCL PB7-SDA PB12-ADDR
    4 l" N, L" M  M; B0 D  _
  34. 3 a1 I% ]' g+ E4 v
  35.        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;
    7 o4 U8 g& L. d/ ?2 {' r2 F
  36. , d7 Q4 r) ]0 @, T! K$ W6 y
  37.        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;   //推挽输出! g: E$ a4 ~: ~% h

  38. 9 D/ n7 ^$ p% @7 n; C
  39.        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;4 s. m5 s3 j9 c

  40. ! j, U. h( K. Y7 M% d, j( _) p
  41.        GPIO_Init(GPIOB, &GPIO_InitStructure);. H1 N# t) T- |/ k* p6 y' |4 m
  42. % s/ y3 E8 |  G" t# z
  43.        GPIO_SetBits(GPIOB,GPIO_Pin_6|GPIO_Pin_7); //PB6,PB7 输出高+ X  p# _" C/ b+ g( B  m" S. \

  44. 3 ]5 X1 t- [4 c
  45.       
    9 c7 U6 J* T! Z) n+ H7 e

  46. ; q; u5 i- P1 M# l( P" V( q
  47.        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //PB.14 PB.12
      G4 Y; o% l2 k1 l/ d
  48. + \7 a. I7 X1 }1 R
  49.        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    ; Y) B8 a$ L" n9 ?) s% h+ F
  50. 6 o2 k% P$ i2 _
  51.        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  //复用推挽输出
    # G- v% M: v! E0 e4 [
  52. 1 e) ~! S% b' ^
  53.        GPIO_Init(GPIOC, &GPIO_InitStructure);
    $ c7 n0 g! J4 _) t# ^" Z' a; k

  54. & l; g2 f, J! P
  55.             
    ! w9 u: a* ]1 z% q6 B. O+ X3 e; r
  56. ( O8 c5 t6 k' ]  a5 Y2 e# F: T
  57. }
    / f3 z1 ^& r4 c( c1 {9 h1 G! v
  58. ; z0 D8 c& T+ l9 c
  59. 6 ]* j" P/ s8 w% S- [

  60. ! L0 g) Q, B- B

  61. % c) G8 |, p. h* Z$ Z. N* _
  62. 3 Y# q' x; N; b
  63. /***************************************************************
    ! Z# c* {0 V$ W4 |1 v+ j
  64. . D+ i; S# I. d8 X- j+ W
  65. ** 功能:     产生IIC起始信号
    , M! }, a* u. ]6 h4 R; x
  66. : V  Y1 V" v) |5 o8 L  P# y
  67. ** 参数:        无参数
    $ N' \* [% ?. {2 ?* U, `2 q
  68.   ]+ a- {- g& p0 L# I" J
  69. ** 返回值:    无# Z8 S6 u8 ~7 i5 b# x. I( A* }: W
  70. 9 B0 d9 N  G8 p, u7 ]- ?$ T' k) t9 b
  71. ****************************************************************/
    1 j. e9 X9 S( G3 c  E

  72. 3 E7 ]2 x3 _4 ~' S- @% `
  73. void BH1750_Start()
    " U/ N- ~1 l- f
  74. ; G3 o% a& X  A& g: [" I" Y5 w- f
  75. {
    & J9 ~- t! K2 A0 A* {

  76. ; d6 G# h4 w% x" n, X" K
  77.     SDA_OUT();     //sda线输出
    ( i4 }7 w" L1 Y' l% U) u

  78. / b' n$ S8 A' N! k3 r% M& k
  79.        IIC_SDA=1;             - b, ?  v. O5 l. {0 n; T# ~

  80. " C3 i  b9 w& O( M. u7 A2 q
  81.        IIC_SCL=1;2 n* U' H* o+ P1 k% @1 g/ G# {
  82. : M; `0 ^1 c% j! L. Z' c
  83.        delay_us(4);" I/ }/ S- n4 n
  84. & `# w9 B" S. v4 A0 \
  85.       IIC_SDA=0;//START:when CLK is high,DATA change form high to low* j$ k, b6 O: f3 m/ s
  86. ; F4 w* ~3 `$ t/ F
  87.        delay_us(4);
    / }& [. W# v" }: W8 S; ?" l
  88. ' A$ f/ a: @- R! p
  89.        IIC_SCL=0;//钳住I2C总线,准备发送或接收数据
    : P3 k* m& M( }+ O+ z( _  o

  90. ! U! X2 k$ Y8 ~( }# p
  91. }
    ) a5 e8 I9 ]. @' I6 D, s' a

  92. + v6 F0 }" ^: h- m: h) A
  93. /***************************************************************
    $ U1 a) N# Y! x% e- v1 P: l
  94. 4 M' K4 h+ J3 s" c3 |
  95. ** 功能:     产生IIC停止信号
    ! x3 P$ G* T3 I- `" d, @7 T
  96. 4 ^# X* q) Y. {( B# ]4 P. I9 }# [6 `
  97. ** 参数:        无参数
    : s! a; J3 p& t
  98. ' E9 L, H5 f3 a. q
  99. ** 返回值:    无* l' X8 N5 e$ z5 Z/ y
  100. ! d5 v# i5 I+ f( G2 U
  101. ****************************************************************/3 J$ K. C+ W# X( h/ A& V* S
  102. : w0 e4 F5 {* }* a
  103. void BH1750_Stop()( l$ F  Y1 q/ w! J6 g' x
  104. 1 ~" {% X( r4 d
  105. {/ \! R5 ?  b1 U! v" e( d/ O( U

  106. ; W2 d8 |* I) D
  107.        SDA_OUT();//sda线输出4 l4 K1 c8 `' v4 W

  108. 8 ]3 P& |& [8 O8 a0 ?$ \6 |) k. `
  109.        IIC_SDA=0;//STOP:when CLK is high DATA change form low to high
    9 |- A! `# i- ^3 G. ?) C& v' e

  110.   |; S- J* U  E
  111.        IIC_SCL=1;
    ) ?/ n8 {# z: I; n& T9 J3 W3 X. \

  112. ( j, E2 D) x& E/ q" j
  113.       delay_us(4);9 [( K, k1 o3 P1 g- B& d
  114. 7 v; S) e( v  e7 z  J% H
  115.        IIC_SDA=1;//发送I2C总线结束信号" `" i- d/ O7 `
  116.   R* S# H! o. n! a
  117.        delay_us(4);
    7 t+ g# E$ G2 Y+ ?9 A
  118. 8 F! i2 q+ i4 X7 D; D+ s" [. \
  119. }
    / h) F& Y( C1 Y7 D0 o  J

  120. # |5 q% p5 b6 a- ?7 a1 t& M6 o
  121. /***************************************************************
    ) Y4 y7 c$ q% |0 Y! \3 U6 r
  122. & O8 \! N( \# Y! V
  123. ** 功能:     产生IIC应答信号% E& I3 t( t1 W

  124. 1 {! f: Y5 S5 A2 R. h0 Y8 [2 ]
  125. ** 参数:        无参数" M  |8 X) O. T. q
  126. 6 t1 g, T$ [: `3 C
  127. ** 返回值:    无
    " {! w! z1 E5 w2 s
  128. # f" i  m1 o; U6 ^9 \
  129. ****************************************************************/
    : l. g5 K) F# [
  130. ) R5 J" H$ t5 k) I8 s6 C
  131. void BH1750_SendACK(u8 ack)
    3 I" i  O; }% f$ o% l
  132. ) W7 ~8 B# Z# \# W
  133. {
    ! q! |, T3 u' l' Q+ m9 `+ P4 C
  134. $ Z$ U6 q8 n4 z
  135.     SDA_OUT();          //sda线输出
    9 ^# P* C2 i! K; \

  136. & D/ x) ], R. s& d: \( W
  137.        if(ack)IIC_SDA=1;   //写应答信号
    8 \6 R9 _) s5 C0 V" }7 f
  138. 2 J+ q: u7 k4 _. ?; B/ F
  139.        else IIC_SDA=0;         , ^2 j& P$ V/ [5 g& f

  140. , ]7 P! z2 K7 y# L7 G6 t* Q5 W
  141.     IIC_SCL=1;          //拉高时钟线) g, x# \2 S( ~& D5 G
  142. 3 A( ^# E2 f. y/ P
  143.     delay_us(2);        //延时
    2 J' b" h6 Z" ~. b6 I
  144. # Q5 l* L- c# v0 e8 n* f
  145.     IIC_SCL=0;          //拉低时钟线9 S' D, W4 J+ I  K/ |
  146. ! y/ S. }; G& F+ F
  147.     delay_us(2);        //延时
    5 D2 k+ X+ r8 v% p

  148. * ^( P0 G& g! U- [
  149. }$ H- X& o$ ~$ ~  ^  o7 {
  150. 4 s9 d# i0 @# f

  151. 9 n. W! x+ r; }; u9 {; u3 L' j2 g

  152. 6 z) h. N  ]2 j
  153. /***************************************************************
    ( D2 ~* h! ^# H# F/ G- u+ E& B
  154. + @/ a- t+ P- ]) E6 [: R: }7 \
  155. ** 功能:     产生IIC接收信号
    . g9 P9 h7 O  R* G1 ^

  156. 6 G2 U$ X: i) S  N1 H9 ~
  157. ** 参数:        无参数( x; |5 A! s1 [/ L! I7 ~

  158. 8 y3 u/ Y3 l# A
  159. ** 返回值:    无: i/ H9 X. q. M4 [- W! y
  160. : e# Q6 ?" l! u4 j' o7 ]
  161. ****************************************************************/
    ) U$ f( t7 w" U3 [
  162. ' F- j: K, @1 a7 K4 m! V" m  G3 S/ r
  163. u8 BH1750_RecvACK()! r/ |* V4 r8 ]+ F

  164.   H4 L5 n/ \# c8 l/ \( Q
  165. {5 g- l) r* t$ P' y, h
  166. 7 _* e+ u) J; q) T+ n* P/ f7 ^
  167.     u8 data;
    0 o' m3 f4 G1 S0 {& e9 C/ \, P

  168. : L8 g/ K" X- N! V
  169.          SDA_IN();         //SDA设置为输入9 e$ v) N* X1 H0 r
  170. " ], y1 P, U) K! f! p" F
  171.     IIC_SCL=1;        //拉高时钟线
    " C$ K4 |1 ~; h$ e- [6 Z
  172. / G9 f1 p0 i# t* L  \
  173.     delay_us(2);      //延时
    . e$ u# R) X6 S- H$ W- _( m& W
  174. 6 B  {  F0 D3 O4 e
  175.     data = READ_SDA;  //读应答信号* A0 q- q. j( @8 N1 s: Z- i

  176.   W# k- X, K9 m" y5 G* v0 }, `
  177.     IIC_SCL=0;        //拉低时钟线: T6 N, b+ b! T- g3 a* ^" w
  178. 2 Y$ A7 D5 A2 y7 F; B+ `
  179.     delay_us(2);      //延时* ?( g/ I3 A( G. q

  180. . j- w) Y+ N5 r% i6 f+ ~# B3 n. f
  181.     return data;
    + R! S: e  ]7 Q9 @# J

  182. 9 q' t5 E$ o$ _/ }% s% o
  183. }) N: m2 ?0 U! A* a& Z$ r& |# S% V
  184. : D6 w4 o1 a$ c4 m
  185. /***************************************************************
    4 h5 y. H, u, _1 u. e
  186. " X. L9 r& U2 S% d9 N' ]' P( b
  187. ** 功能:     向IIC总线发送一个字节数据& {3 r* Q- j2 l6 }8 A! h

  188. ( J! a5 t; {' c+ ^0 r: f3 W/ Y- a
  189. ** 参数:        dat:一字节数据) l5 b' H- M. J: J. S* G
  190. 8 A& H# F% r# ?0 B: z5 x
  191. ** 返回值:    无
    0 p5 S( c/ s1 `% ~$ P5 q

  192. " d# r7 Y# V. z2 z& J2 h
  193. ****************************************************************/
    3 d- {# U6 m' _% K0 A/ ^8 {0 o
  194. 8 [& {2 ~4 L* \( E1 Y- S0 [
  195. void BH1750_SendByte(u8 dat)
    # ~; X* e. K- d+ r4 ?$ o# }5 ?
  196. ; F8 f( m* J5 K6 [
  197. {) \: Z, G  y$ J% e" V9 M) t
  198. ; Y' L. r! O: ^6 x+ u# c
  199.     u8 i,bit;" t( P1 R5 W4 M) }% _" A
  200. ( e* X  k. c6 Z; t* }
  201.        SDA_OUT();               //sda线输出4 G; g) `/ M& U& X( U% l

  202. 3 G; ~' v. v) Y" U* x( j
  203.     for (i=0; i<8; i++)      //8位计数器7 v% ]7 n4 \7 B% E( J5 I3 v
  204. . @0 \, z- H- w3 Y. r. W
  205.     {# `4 V( o4 u- W2 |8 P/ k+ L4 ^
  206. : u" T. @) i3 Z
  207.            bit=dat&0x80;$ P1 ~: S) j' i1 j$ W
  208. . V4 d( B$ G6 [
  209.               if(bit) IIC_SDA=1;" x$ y; t% T' `3 T

  210. 6 z* z1 y/ X1 [; P/ e
  211.               else IIC_SDA=0;
    : E3 _$ D% I  T# b2 w' m
  212. . ~2 I# I. _) z
  213.         dat <<= 1;           //移出数据的最高位
    2 i) L# `9 D. |2 x" O( \

  214. " L# {& a- r- r
  215.         IIC_SCL=1;           //拉高时钟线1 |9 s/ {2 S: f& I

  216. ) L8 J/ P5 z" ^- p
  217.         delay_us(2);         //延时
    & f* M0 v8 ?: p7 @# |1 m
  218. ! {7 {+ c) K1 f, Y3 f5 o- ]4 C3 g
  219.         IIC_SCL=0;           //拉低时钟线8 A# n2 l* p2 W
  220. 4 i4 y: @0 @: n
  221.         delay_us(2);         //延时5 J# v) }- j% n
  222. # r& j  U' |+ x
  223.     }" s% E, U0 u% A3 e# O+ w: P

  224. : A: A8 P# {1 }9 r
  225.     BH1750_RecvACK();
    / S+ F# W; a' U. }6 {; r& b( R

  226. 9 e4 s  |. ~+ r4 h7 F
  227. }
    # ]! ]- b! Z" z* ~% A( o; y
  228. " ]: n0 A0 k9 u% u1 `
  229. /***************************************************************2 N/ T& I; G1 o, Y
  230. + R7 p2 z* ^. u9 p
  231. ** 功能:     从IIC总线接收一个字节数据
    9 r8 |$ ~; I" v( H

  232. & ?" C" H& z1 p2 d! u
  233. ** 参数:        无参数
    ; Q# w2 X1 W: v8 o& W

  234. 5 ~; x0 e6 O1 X2 b5 C
  235. ** 返回值:   dat:接收一字节数据$ a8 ?. j$ K1 w2 |: Z& ^
  236. + t1 _* C3 I6 M7 x5 I" o# r
  237. ****************************************************************/+ w$ Q, D% S6 T4 c; p( l0 l
  238. + C3 x$ [/ H1 |4 G5 ^) X) K7 e
  239. u8 BH1750_RecvByte()
    1 O) I% O5 O4 H1 W& e( j

  240. ; g& K6 P+ V/ U! s0 b2 R
  241. {
    ; @# f, h( w; Q1 V3 i  ?

  242. 6 N2 P% o3 J& F2 Q: q- _4 o* _
  243.     u8 i;0 q% V' J) S% I# Y% C: a' \; E
  244. 6 X% E( r5 I# I4 J; k
  245.     u8 dat = 0;
    , G5 h1 e' D, P4 r* H
  246. & e4 S  J' p% c# I% p
  247.        SDA_IN();               //SDA设置为输入
    . F# u* ?* N+ B# a) o2 ]

  248. ' v/ _' L0 H5 W' |
  249.     IIC_SDA=1;              //使能内部上拉,准备读取数据,% Q# T& S6 U# K' D
  250. " E; X9 r' H' }4 C# Z
  251.     for (i=0; i<8; i++)     //8位计数器
    ' v7 T4 J- o/ S. S8 n4 ~9 D
  252. ; a% m5 b$ L. a' X" n! g
  253.     {1 [  P' Z+ @! p* G; ]' d6 o

  254. ; Y3 Q3 D6 {; L: s
  255.         dat <<= 1;7 Z* x2 y# m' L! I4 K
  256. . H6 M' n1 Q) E7 P$ V9 v
  257.         IIC_SCL=1;          //拉高时钟线
    $ T' v8 T: Z$ T

  258. ' r; z, Q: S5 w0 p7 C
  259.         delay_us(2);        //延时
    , _' \: y* b2 ^: ^/ ]. x
  260. # R. E( ?, U) S/ B  m9 T
  261.               if(READ_SDA) dat+=1;              * L1 T7 W  W. {% C; X% i% n

  262. 2 X; t7 t; k& x  d% o
  263.         IIC_SCL=0;          //拉低时钟线, t/ r0 b% n% c8 s+ u

  264. 7 B2 ^, v. k4 W, n* Y
  265.         delay_us(2);        //延时
    % [8 K7 W4 @( E% V

  266. 1 `7 ^! Z* @5 d4 q% K. }' T0 N) X
  267.     }# f8 G5 I2 C8 ?# u& Q7 h- z. r

  268. / B) e1 l1 x% O# H8 `3 R5 \
  269.     return dat;
    1 x4 Q3 S5 k; T9 t
  270. 8 S7 O* t5 d3 w9 r; I% b
  271. }  y, |; ?; v* I( g& U+ [9 M  u. }$ |2 e9 B

  272. 6 a) ?4 {. {! A) _! c& c$ n+ k
  273. 4 l" i, Z8 w" M0 c# G5 {
  274. ' Z, d! {9 a+ |3 z
  275. /***************************************************************- Q; L' F- j, D2 h+ p; Y

  276. ; u. p( N2 M, @$ A2 ?0 `/ v- B
  277. ** 功能:     向bh1750写入命令
    , A! H" G4 L2 `) \1 T1 ?- v) x
  278. 4 s' ]+ @9 z+ W2 \1 Z% P
  279. ** 参数:        无参数
    6 S$ m# D; m+ G
  280. . ~; V! v) a" @+ l, D  w
  281. ** 返回值:   无
    - j; W) C# d1 k8 z6 T. ^/ t

  282. 6 F% O6 M% t' K
  283. ****************************************************************/2 r2 j) Y6 p: ]  n* N8 z
  284. , r/ K& B3 P2 J' Q$ l+ k* P$ n: E
  285. void Single_Write_BH1750(u8 REG_Address)
      m5 [! Q1 k! l- M9 D+ h2 v$ ?
  286. / k5 }; f3 Q: c) D4 i
  287. {
    * M0 ]0 ~1 k; |

  288. ( D: C; e! ~' Z
  289.     BH1750_Start();                  //起始信号6 M$ ~3 O' n2 @1 W3 b" b
  290. 3 E6 K) G7 B, w8 c6 L
  291.     BH1750_SendByte(SlaveAddress);   //发送设备地址+写信号1 c  x6 I" J& D6 K! h
  292. , {, W6 @1 @- M0 c
  293.     BH1750_SendByte(REG_Address);    //内部寄存器地址,' Z! |& v1 E* K& T& y+ t. M+ C
  294. " ~8 m& B, `9 M& a. r
  295.     BH1750_Stop();                   //发送停止信号
    & C; }; H& m! o, A
  296. 8 ]3 Y) D, ?0 {
  297. }* ?# d4 p+ Z. A/ T7 ^
  298. 3 e. V" H' e% m& ^

  299. $ O& L5 Y; f) l, v- f. x  Y
  300. 8 F" v1 ^2 O3 ^) @- R, {
  301. /***************************************************************
    + z" E2 O% u1 V5 H  H% ]
  302. . h+ ]3 T2 Y! y/ v9 u% q0 w
  303. ** 功能:     连续读出BH1750内部数据  H7 [; p& J$ t

  304. 7 F; x  d- U) L5 T& `
  305. ** 参数:        无参数
    5 I1 a9 p( x5 N2 a5 N% j+ k
  306. 0 x, W) |, q9 u- z0 G
  307. ** 返回值:   无
    $ _8 @0 v+ n( w9 q6 d# V  e3 P

  308. / V; Y3 g! r4 K9 v
  309. ****************************************************************/
    2 W7 Y" C1 {7 o( @3 u
  310. , E0 S8 J' z0 e6 I( ~+ n
  311. void Multiple_Read_BH1750(void)! V' m0 ?1 J& n7 Q3 I7 z' E
  312. & }  c. n) O1 h
  313. {   u8 i;
    5 z3 M1 i# a, _; W
  314. 4 j" n6 t+ Q$ c; J% {# w, K2 c1 ?$ h
  315.     BH1750_Start();                          //起始信号! b7 I6 ^; H6 I" i/ T' U6 g+ w; k! l, O

  316. + @) Z/ R7 _3 t+ ~
  317.     BH1750_SendByte(SlaveAddress+1);         //发送设备地址+读信号
    ! S5 r. {+ ~" I& h- [
  318. 7 q8 g4 @7 d3 ~/ W5 u) v0 ^
  319.       
    ; h0 q2 y5 x# i
  320. % H' k+ ^( B4 k
  321.        for (i=0; i<3; i++)                      //连续读取2个地址数据,存储中BUF* I- v, X0 t$ u6 m6 |
  322. 7 \" s/ e, y5 Y2 [2 l/ ~% s5 ~
  323.     {
    4 w6 _! Q( F$ w9 t/ Z7 i
  324. 1 p. r1 O" _' u0 K) K
  325.         BUF[i] = BH1750_RecvByte();          //BUF[0]存储0x32地址中的数据
    , N) |! X5 }' X6 V. g
  326. ' W5 ~# M% ]. h4 w
  327.         if (i == 3)" B; V. U9 j' g: t% F" n, R' t$ F
  328. $ V6 ]; Z; V, F" W* G* ?
  329.         {2 W& y9 I1 s+ ^4 h" J
  330. & Q. r4 ]4 L  R
  331.            BH1750_SendACK(1);                //最后一个数据需要回NOACK) \- b5 V) e3 \0 N  W+ x  U" v

  332. 3 \7 M' C+ N; n, j6 h! \" d1 y
  333.         }1 @7 D. O8 W0 U% u# F  O4 `. \

  334. 2 n" ]! F' ?6 Z- F. H8 W
  335.         else
    & j0 u; g  {8 D9 u2 \9 d2 m

  336. 7 g6 m+ \3 k' a
  337.         {            ( V1 b, B" `0 r' s. i  Q. w

  338. ( C0 b' D5 P8 Z  |* t+ I' R/ T
  339.           BH1750_SendACK(0);                //回应ACK
    ) X* w+ f2 A; H" s( P, k: V/ W- R

  340. + U$ }3 c% I( `1 l3 f1 P
  341.        }
    2 Y" H, T0 m' s0 _
  342. 2 E& x2 ~8 K3 S% v/ B. [
  343.    }
    / W1 Z4 V5 c- }5 H/ O

  344. 8 A9 b' @8 B( G; O; F
  345.     BH1750_Stop();                          //停止信号
    , k- Y7 ^& S1 {3 C* }; @6 O

  346. $ K& f% G3 H+ B! m" D
  347. //   delay_ms(150);
    $ D; X* Y) {. k0 J- q
  348. 2 }, T+ d- f2 v1 N' G) r- X
  349. }) S6 {; x3 H* v- O
  350. 5 ]) l* t. h9 o8 k

  351.   m% _7 b9 C( A

  352. - ]. w5 f( |% h/ V- p0 B
  353. /***************************************************************
    7 U. y- \( f/ u* f
  354. . d) v2 R% T; e( \7 i( o( U
  355. ** 功能:     初始化BH1750) u/ D! Y1 x4 b# ?( a
  356. / Z, |4 c, a# p& c, e- A
  357. ** 参数:        无参数( H; n0 q/ p! n" h2 o1 u
  358. 8 O% [( K' ?/ o9 s: m
  359. ** 返回值:   无# L% k, `6 ?; N% @+ V

  360. 7 e! i! E; \, x8 p, v) `2 C/ j
  361. ****************************************************************/+ F# N; K/ ^/ j

  362.   a8 t8 @4 f' ^. R( A7 D
  363. void BH1750_Configure(void)
    ! y+ Y4 `+ A! F2 q
  364. ( J* r, r7 N! a/ O  @" E
  365. {
    9 y. N8 h+ b6 \) ~; l1 U
  366. 2 t9 H5 z. c- b. N& t
  367.    BH1750_PortInit();, y6 t9 h) ?/ e3 P8 q
  368. 0 b0 k' w8 R$ N! S+ S$ P) {, }. `
  369.    Single_Write_BH1750(0x01); 2 k: @$ T% A  l9 D

  370. 6 i! N- b4 P% a( l
  371.    ADDR = 0;                                        //将ADDR位初始化拉低
    - H$ Z$ E- t, |; t$ v. M4 ?
  372. " c, b9 I: d# F
  373. }
    3 v* Z5 l( G& n4 V
  374. ) f9 k5 i6 D7 a3 t& v) E5 O  m
  375. - f2 @  s2 K* u3 m7 {. i8 `2 x' S9 b# b5 _
  376. # u: |+ b0 E! k* F3 I# [' Z2 k3 Z
  377. /***************************************************************! p* V$ X1 G# c) v

  378. 3 _5 I7 P7 [  s. p
  379. ** 功能:     读取光照度
    # z: |/ O$ w6 E( \
  380. ! @8 v+ U1 y' ?  X' F+ u
  381. ** 参数:        无参数9 H' W! a3 Z' W( i" y

  382. * a4 G6 `9 [1 [4 {' c* Z
  383. ** 返回值:   data:返回光照度值. s, R% n% N( }! j3 }+ _
  384. ( q8 ~2 x3 Y+ C# S$ M
  385. ****************************************************************/
    " ~! |, i& |! f7 X
  386. # N7 u' c/ |3 I5 E& C
  387. uint16_t Get_Bh_Value(void)
    2 j0 g/ V9 ?/ E$ j1 ?; k
  388. 1 m% E, P# B- z; O+ R: d; o
  389. {   B9 T0 v$ ~( g+ Y" `
  390. 2 ?& E( p8 I( |0 j
  391.        static float temp;$ P) I7 L4 u) o" r* `/ {

  392. * T  Q1 |+ J% |* @/ A) B% \! T
  393. //     u16 data;* b# x. S, ^2 }: `1 v( Z9 `4 Q

  394. ; ~% H3 z2 R% I# g% C3 Y* P- D! ]& M
  395.        int dis_data ;. q2 b* o0 W' R; r$ n  h- K

  396. - M8 Q, U$ h' \  b9 L! }  @
  397.     Single_Write_BH1750(0x01);   // power on$ @! c0 g; U* ?
  398. ' p0 D6 m- y; G% w. r9 u! k
  399.     Single_Write_BH1750(0x10);   // H- resolution mode6 W! V- p2 Q" R6 ?" S

  400. * h8 V3 a. n1 X) D2 T5 z/ q
  401. //    delay_ms(200);              //延时200ms
    3 p& q+ t; H0 h9 S7 C
  402. $ S1 z! P9 R* i1 u  I; C, p
  403.     Multiple_Read_BH1750();       //连续读出数据,存储在BUF中
    - z+ X2 T  ~% s! [/ `/ l! s1 C
  404. 9 m4 L( ?4 ^! H5 y5 l# R8 I
  405.     dis_data=BUF[0];1 p- j5 D* m5 P# N$ J% W3 ^, D
  406. $ ^# E; r' r) w0 G* A" w8 L& v! |% F
  407.     dis_data=(dis_data<<8)+BUF[1];//合成数据,即光照数据$ ?' p% H; a" R5 v6 b! T
  408. + ?6 W4 m7 v1 i! a  C
  409.     temp=(float)dis_data/1.2;/ U. M  ?4 w2 _$ O( F6 u1 h

  410. 6 \. ~: I; z3 F
  411.        Light_Value =(int)temp;+ r0 ]4 a( M7 C6 y% ~5 q

  412. 6 c4 ]0 O4 ^8 C  F) |( h" ]( L
  413.     return Light_Value;       / {4 s& F. V- C6 J4 p# s0 S4 }- ~
  414. ( k; A4 j, {: w( m' J% [, I
  415. }
复制代码
0 s8 a. B& I* G$ l- c% f' g) i
上面是所有代码,我们只需要在主函数终循环。Get_Bh_Value(void);就行。
6.png
我们这里就是使用的简单模式H-resolution mode,没有用其模式2,模式二可以更改采样时间,从而提高精度。感兴趣可以自己去看下,就是比较靠后的就是模式二的用法。
7.png
当手机手电筒放到其光窗上可以测到最大54612。还没有到65535。
8.jpg
同样使用的是昨天的板子。
. J8 z3 ?$ o3 U8 X
收藏 评论2 发布时间:2021-6-8 20:49

举报

2个回答
STMCU-管管 回答时间:2021-6-9 09:42:48
用的什么STM32的板子可以介绍一下/ {% r, j% r& R5 f6 E7 h0 x
liuxingkeji 回答时间:2021-6-9 10:57:02
STMCU-管管 发表于 2021-6-9 09:42
  B. @; h0 y0 W5 C用的什么STM32的板子可以介绍一下

# ^) W1 W( S9 P* v+ r4 w用的是自制的STM32F103VET6开发板
, l) D# p8 b5 m- R  x# }
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版