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

【年中粉丝节】+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"  q6 y- Q( u. M" ~0 A7 l1 c) a) R
  2. : @; @3 L8 g8 t/ P& |& ~; h
  3. #include "delay.h") E8 [( s7 B7 B' p4 K0 W

  4. + Z: U: W# g. R& n; [; c" }
  5. #include "bh1750.h"  M1 T7 _$ ?) ^5 r

  6. ' w. G: P; m  C; a( s
  7. 4 u9 D1 i& D* H- ^

  8. * T+ d$ J$ A( H# v' w
  9. 7 c+ n( a( L3 s, H  B# G
  10. & G8 }# q! s& \6 x, Z
  11. #define   SlaveAddress   0x46 //定义器件在IIC总线中的从地址,根据ALT  ADDRESS地址引脚不同修改& l9 }8 F5 ]! H6 D; ~/ E
  12. + u5 R3 N7 {! t4 m/ V
  13. uint8_t  BUF[4];                  //接收数据缓存区
    , z5 ~0 r  t4 w5 G& \
  14. 1 D* P5 B4 Z! R; H- M; J
  15. extern uint16_t Light_Value;
    2 e! L* `) ~9 v' o8 m# j1 j* S2 m2 G
  16. & a- ]5 N: l/ N& l* N
  17. //uint16_t Light_Value;# r/ A& ~3 G0 S+ @% O7 c  Y8 d

  18.   N6 ~, [$ `* r  W- x2 K" X

  19. 0 j5 K/ w, z% S" m& Y* e8 s& C

  20. . ]; p5 \/ x" i! C$ ^* l( m0 d% e$ {
  21. void BH1750_PortInit()
    4 p! m( W! D, n

  22. & _4 J$ K7 e" J; C0 q; H' D
  23. {     
    - H4 N% y- C" Z# Y+ p/ q& H" J

  24. 9 y. b+ z+ k5 H' c5 |3 V) n
  25.        GPIO_InitTypeDef GPIO_InitStructure;. P' S) R8 A2 M- @/ y0 Y

  26. 1 [/ u2 e0 Y8 f! f% Y/ E( H
  27. # U7 I0 Q7 d# g3 A. S# {* c

  28. % l* d+ Z9 ~8 M8 z9 C
  29.        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC,ENABLE);
    8 s' u/ e) c5 Q& s
  30. ! r3 q2 a' A; L: b! F3 i' g
  31.       
    ) W; r1 j5 k" g3 Q) ]+ a9 K  ^' a! ?

  32. ; B& c3 J& {. ~# i% `7 m2 H
  33.        //PB6-SCL PB7-SDA PB12-ADDR( Z. @% ?. v$ Q5 {  V+ D
  34.   C' a- W  K) T9 J
  35.        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;
    ( H' ]! k5 x# h4 m5 A5 `
  36.   f- p% T1 y- O2 O# ^
  37.        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;   //推挽输出
    ' j" G1 A, T" M* U" `8 A8 U
  38. , S& g. s( \9 T
  39.        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    % f. J# z$ u1 g7 X

  40. ( u" p! w1 T! |" z8 F0 ]8 a
  41.        GPIO_Init(GPIOB, &GPIO_InitStructure);
    1 G4 Q: V' C! D  n9 a" b; M1 E% T
  42. 8 h6 |2 Y& K0 M/ Q8 n  x, k0 A
  43.        GPIO_SetBits(GPIOB,GPIO_Pin_6|GPIO_Pin_7); //PB6,PB7 输出高
    ! e- c$ B& }  u# I6 \9 i. R

  44. # I% g; p+ r0 R& ^. C8 Q
  45.       / z3 y8 U  i( S! H
  46. 7 J: W, N- z! b
  47.        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //PB.14 PB.12# J! ]# C' y% r# \) H: M( Z7 M1 G* B
  48. 2 t' U. m/ ?+ I' j  }
  49.        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    ; p$ o" m2 w: \, W, s
  50. $ `: ~1 w; k# x; o/ H' K) }8 n
  51.        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  //复用推挽输出6 [8 ^, D+ V* u7 L. d2 g) p
  52. * s+ E4 a9 G8 R& f% K. M
  53.        GPIO_Init(GPIOC, &GPIO_InitStructure);
    . o" t  h, ]: [1 f& l; p/ S6 x
  54. & `5 H. q7 w7 t1 O
  55.             
    ( x% E% h5 g( f$ k" G7 |3 [

  56. 2 g. g" W$ S. V6 i0 K
  57. }
    $ T9 P2 ~0 C' V6 r# Q7 A

  58. ) x5 s* X6 v2 a  M$ [
  59. ( {% q, h8 V1 z0 F+ Y6 o  v' V

  60. $ S3 k; i7 _, ^

  61.   h# {* H7 `. K
  62.   P* ]7 }2 k0 o( w7 {# ^. Y" z( f
  63. /***************************************************************
    / j) S3 V" n. q2 W1 j* m

  64. ) y# |8 r) I" Z2 e
  65. ** 功能:     产生IIC起始信号3 y$ N$ k  O' y. o% v9 V  C# X

  66. 9 K# Q8 [8 F5 U6 P( @& q$ f9 H' K2 x
  67. ** 参数:        无参数
    ! i, Y/ r  ~3 h1 e4 \+ u4 ]

  68. 8 S8 \0 S1 `# a; D2 T
  69. ** 返回值:    无
    / l9 @' o% u  d( K' U! s

  70. / N2 n1 V5 V, a+ ~
  71. ****************************************************************// R2 M( O/ Y3 {. L) z/ {
  72. 8 ~3 S: f9 X  Q5 o. j, Q
  73. void BH1750_Start()5 Y& B. `( N2 J# f- V4 L( M
  74. 5 k' ~7 e, |2 r
  75. {
    # n$ L3 M% X9 [, X7 U0 W2 b
  76. * q+ G9 l, X: N4 N$ R( R0 H7 Q7 R
  77.     SDA_OUT();     //sda线输出6 \' N  a% z2 d: f

  78. # v2 R( M+ d# O8 }/ p, n
  79.        IIC_SDA=1;             , \3 d& t  F0 C' u5 S: \3 F' G

  80. ( z+ v# L/ r. s% p4 C
  81.        IIC_SCL=1;) {9 \( f+ p4 M  u, C4 ^- c6 |
  82. 4 @% B$ w1 R+ a3 J, s( p
  83.        delay_us(4);
    5 w  L) ]+ |' t  q. k

  84. 3 @$ \$ f8 T8 k6 q6 g. L
  85.       IIC_SDA=0;//START:when CLK is high,DATA change form high to low
    ) O8 c0 O$ n/ \, l$ q
  86. ( e) X& f, ^, n  }  r
  87.        delay_us(4);  }5 E( f7 @; V8 P. P9 r5 @
  88. $ G4 |. q# ^  J  n
  89.        IIC_SCL=0;//钳住I2C总线,准备发送或接收数据' c: `4 s, L. [

  90. ' [, y" S! E. D7 w. P
  91. }9 h1 d0 x% ~  [  m+ f6 X

  92. ) h1 O/ r: v3 y% u9 Q
  93. /***************************************************************
    3 E; a9 \$ l* ^$ G$ v  d: @

  94. 4 p- v- L$ L# l9 W/ i  c4 Q
  95. ** 功能:     产生IIC停止信号# T- G. q6 j$ T, H7 k
  96. + A. M% W" m- X! ^2 R& L$ n9 J
  97. ** 参数:        无参数
    ) Y) Z: D' O0 i+ s
  98. ) I+ `5 F1 B; m  u
  99. ** 返回值:    无: m) e; D) e# s7 w+ i5 K

  100. 6 S% ?1 f3 l1 P4 u/ O" W
  101. ****************************************************************/- l* v4 ]% y' g- T1 ?" n6 e  }
  102. 1 r* H8 Y& p: U3 T0 ^. y
  103. void BH1750_Stop()
    4 o) l7 j) q! o0 y, @

  104. 4 J( {! g" j) D( A
  105. {) \6 M- G' Z& S% r; B" Q
  106. $ h6 _( p9 y5 H1 s! ^2 j4 s$ V
  107.        SDA_OUT();//sda线输出
    7 E/ W) J6 z- n, K3 N

  108. ! ~. n5 k: H! c' Z6 k8 |
  109.        IIC_SDA=0;//STOP:when CLK is high DATA change form low to high: G9 I8 X: t7 I* e, v9 |- }

  110. ' Z* Z( f" Y7 K/ V9 @4 a! V
  111.        IIC_SCL=1;0 f3 M2 @9 W; B1 ^- J/ A
  112. ( G: n4 L) {! ~* n1 S
  113.       delay_us(4);
    ) X6 p  _5 E1 m. u
  114. ) s. E6 P) v5 j1 }
  115.        IIC_SDA=1;//发送I2C总线结束信号
    1 R* [! d6 ]/ S6 A

  116. % Z! N$ m' f, b7 y; I
  117.        delay_us(4);
      y" F+ J4 h+ x# F9 G+ M2 B
  118. ; f% R, e! h4 m; v
  119. }, Q) P" k0 X: E6 R
  120. $ b* L8 b. M5 Y( p" \
  121. /***************************************************************: y1 a+ S* J, }
  122. ( O" j5 N$ }" k# q. S
  123. ** 功能:     产生IIC应答信号- x4 L2 u6 G: A/ J
  124. + w) s/ @' x, y( ?
  125. ** 参数:        无参数- H3 h5 {! B' G/ v% i" ^9 {/ }
  126. - g& a8 t: n! |5 `
  127. ** 返回值:    无
    , B- w1 x9 v3 r+ L+ f

  128. ' }( a  J+ ?: E# [9 H% Q
  129. ****************************************************************/1 i3 T7 d  U" C0 y+ |( \8 w! \3 \7 o
  130. % Q9 ]& C+ r( m9 A: f3 J3 p1 v
  131. void BH1750_SendACK(u8 ack)/ Q/ E7 y0 t9 q" y7 r
  132. + s( Y2 ]; R# Z' b* z8 m% P' E  }. t
  133. {
    , O. p4 d5 W; O3 C

  134. ) t. ~( a* m( R4 ]. O: C2 ^
  135.     SDA_OUT();          //sda线输出
    1 m! K" r" a/ d* o# F, E
  136. & K2 K" P6 s- Q
  137.        if(ack)IIC_SDA=1;   //写应答信号7 P5 j: T! ^, f5 h# V, [' a3 u

  138. 8 R. L! e( y1 B% _* b
  139.        else IIC_SDA=0;         
    + T$ f* |1 B+ d4 p& J

  140. ' \8 N# M) [# B' Y! ]0 D% ]
  141.     IIC_SCL=1;          //拉高时钟线7 I. W; |9 k2 O  |" q
  142. ) x9 y8 W9 D8 X9 R) ~5 p6 B. V4 V" `
  143.     delay_us(2);        //延时
    4 Z% b; ^- {' [8 }
  144. : t  t& Z: X. t2 s: N. o
  145.     IIC_SCL=0;          //拉低时钟线
    , L; t; r. k( J

  146.   u, h1 ~9 J3 [/ y$ W0 T
  147.     delay_us(2);        //延时7 j5 @; y' E$ b2 q( D
  148. 8 ?- J% j: h% x' g& h$ C* N
  149. }7 j4 R* s5 y, f

  150. # w1 c" k8 M2 d  x! C# E

  151. 4 G2 B3 I( n- L# x( D9 q6 f' Y
  152. 3 L/ Y" H6 C; d5 p+ C( K) s, t
  153. /***************************************************************
    ( L7 f- I% j2 _9 [2 `  s! U* w
  154. 9 w& `1 Z5 Z. i% r% ^5 i( W
  155. ** 功能:     产生IIC接收信号
    3 ]  Y) u6 n4 m8 U, Z5 J% Y
  156. ! u+ L4 R) J  b( r0 b# d; W3 ^; L
  157. ** 参数:        无参数2 f" z# T$ m; ?5 W" E/ g. S
  158. , q7 ?" d, t) n& l( g+ c& X
  159. ** 返回值:    无
    " ]% Y1 C7 q2 {* H( A) {% G6 A1 }

  160. 0 p9 n" w, Q' ?8 u) M( _7 t
  161. ****************************************************************/
    9 j# ?$ B. h0 P- b4 c

  162. + j' J) f- j# @0 J
  163. u8 BH1750_RecvACK()7 H. a, V  T  _, \

  164. ( H4 U* x4 ]% g5 G
  165. {
    7 m+ M; r( m: G4 |5 ]) d
  166. % q3 B& ?/ |8 D& s: c
  167.     u8 data;/ o. k0 q. u9 M$ o6 H9 K) @1 N
  168. 8 _1 k" p& [' G, |; d1 f# J0 u
  169.          SDA_IN();         //SDA设置为输入
    + u( @( u% I: T8 S+ K2 n1 W
  170. 6 o. f( @) U9 V) I! ^( G; Q
  171.     IIC_SCL=1;        //拉高时钟线8 O4 }2 I# c. E5 T/ m: }

  172. 1 Z7 H, Z9 X' Y' a; W
  173.     delay_us(2);      //延时- j7 t2 f: ?* S4 A, ?& ]8 D& \

  174. 4 p9 m- p! ^: ?/ k$ X1 O2 j5 k8 }
  175.     data = READ_SDA;  //读应答信号/ O$ y. W# H6 \; Y

  176. , t/ S6 b% H# G
  177.     IIC_SCL=0;        //拉低时钟线
    ! T( {" k2 b( h* L" @
  178.   ]( }9 }- }1 ?' r$ f
  179.     delay_us(2);      //延时* e4 D  b! e1 A  G
  180. $ E  x: {' z! z. K5 u: @, Q  E
  181.     return data;
    : S) z  X# g6 s8 [; \+ W) h0 s) j0 Z
  182. : D" E# r; `- j5 J: {& T
  183. }
    / k$ r  r, }0 K+ ^0 [" b( J
  184. 7 a" s; N6 ]& @+ H+ f
  185. /***************************************************************
    , w# q8 o, Q, [$ K

  186. 4 Z, {9 ^2 @: F7 x7 s5 T! J4 I9 D
  187. ** 功能:     向IIC总线发送一个字节数据, K6 K7 }2 P8 w
  188. ; f( S' \0 _3 |2 e& }, @9 s# G
  189. ** 参数:        dat:一字节数据4 G  c! u, I* N0 M. e& j$ \
  190. ! ^$ F# i' @, r8 t) s) `
  191. ** 返回值:    无; s6 M! G% q5 ^
  192. + h3 V+ f$ C. X' J
  193. ****************************************************************/
    , w) P  o$ K& S7 E6 l
  194. ( @  Q! M2 u+ V2 ?0 ^. O5 D; L
  195. void BH1750_SendByte(u8 dat)
    ' [  A8 Y3 R9 [
  196. : b1 a2 A' f# {9 \, ?
  197. {3 `* {/ L+ e& i, m. B  B

  198. 4 b1 e; l) s( x5 m: p& V2 _
  199.     u8 i,bit;1 P$ U% _' j/ d2 i8 D
  200. ; r2 g2 U+ R* M
  201.        SDA_OUT();               //sda线输出
    $ ]2 }' Y0 r1 m  U: j/ U. G
  202. ' M: h) A2 Q3 H: k
  203.     for (i=0; i<8; i++)      //8位计数器% ~; H  W5 E, b/ k6 R" x
  204. / v+ L! o6 w: M3 c. U: O
  205.     {5 B3 t/ D% k: ~. O0 t
  206. 0 _" ]$ e8 r6 m+ S5 x  s
  207.            bit=dat&0x80;- E3 h! E3 Z0 I1 j( C% Z

  208. " C9 R) V0 ~/ s) ?$ e, X3 J
  209.               if(bit) IIC_SDA=1;
    $ l9 x& `$ ]% i% ]" }+ P; k/ k& D9 `- _/ ?( U
  210. 9 v& j# f/ N# t9 T9 q( y
  211.               else IIC_SDA=0;
    8 n. g% }0 L/ z! z( H

  212. ( B$ ~( j. f" b
  213.         dat <<= 1;           //移出数据的最高位
    1 m3 s7 N& b6 ~( W. \& S; \
  214.   d/ Q, n, y& k% j
  215.         IIC_SCL=1;           //拉高时钟线
    - K( I+ U" b5 ^( S
  216. * M4 }: o8 q$ }7 R
  217.         delay_us(2);         //延时* b/ D' x. `. ?

  218. + F- Z, h# b, ~( t. @# S% N
  219.         IIC_SCL=0;           //拉低时钟线
    ' B  u' O" g, z5 @3 ?

  220. ' I( E- T3 Z% F' |
  221.         delay_us(2);         //延时
    1 e& F$ j2 L$ W' ?6 O* J. b3 e$ [  K
  222. ! g1 s+ y3 l. `2 @* J
  223.     }
    % V5 Y! N  O. X: R

  224. 8 W3 q4 A: ^# A% f& R
  225.     BH1750_RecvACK();- n6 f) o5 e: J9 ]

  226. + t8 j- v5 o, [# s: E7 P
  227. }  J' ^, y: L2 s

  228. 5 v& `9 @* ^/ v% t' ]& S/ w
  229. /***************************************************************
    : G0 M% r- _9 E; N

  230. 6 l+ {. M% u6 ~" f! U3 f4 m
  231. ** 功能:     从IIC总线接收一个字节数据
    0 m9 d( h9 `: H0 _4 [: D: c
  232. * C; v0 ]) @9 ^& @  S" T; {& c  v
  233. ** 参数:        无参数
    & ~& M' w5 S. m  E

  234. ( `* f; c$ ^8 Q( Y) }) z
  235. ** 返回值:   dat:接收一字节数据$ i& a# ]$ H: h8 J5 H! u8 `

  236. ; ^. L, z& S( P3 j3 r$ u& a) y
  237. ****************************************************************/1 a# C  U2 Q) x: @+ Z

  238. 7 ], D: V  i7 y9 _) V: P8 c
  239. u8 BH1750_RecvByte()
    % c0 n$ ]( x0 t- }# v

  240. ' `8 Q$ J$ \! H- h' @0 ?% u
  241. {- {, v; C) }) M

  242.   R; H; I# p, u- B! r' s9 s
  243.     u8 i;
    5 h3 M# X( W6 `+ X" N0 g# g
  244. " h6 P9 X7 B) L6 k2 Z
  245.     u8 dat = 0;/ z' \0 A* W/ e  \1 s
  246. : P' J* g% I/ b  r) Q) g+ a( U
  247.        SDA_IN();               //SDA设置为输入
    / M" J, Q% B* x+ e% \

  248. ! d) B0 K5 v/ B: t7 [0 B
  249.     IIC_SDA=1;              //使能内部上拉,准备读取数据,6 H: Y2 I7 c) h+ s" u( U# `2 `* p
  250. 2 ~, H: k( l0 k% x2 u
  251.     for (i=0; i<8; i++)     //8位计数器
    ( K% p2 U% x4 M" p9 M/ L) O6 t
  252. % U5 S% s. @' i4 n2 S# E, b. b+ @
  253.     {( l, J6 X# Q1 }1 z7 M* }; E

  254. / J( l& q+ p8 c: N5 _- |# P. [
  255.         dat <<= 1;
    ' G5 q% K& n. h% J- A, N

  256. 3 O- L' Y; H+ K* `4 w4 Q8 g
  257.         IIC_SCL=1;          //拉高时钟线
    " G4 K6 o  u1 J6 }/ s/ S

  258. - i/ e( k: o% g& K, p
  259.         delay_us(2);        //延时
    & L& g7 }4 f+ I3 _, T+ b
  260. + ?" p' S; |7 v. q+ \# O
  261.               if(READ_SDA) dat+=1;              7 V9 @( u+ T) g3 Q
  262. 6 Y) R& \/ X( V' H
  263.         IIC_SCL=0;          //拉低时钟线- K& G* K: |8 Y0 D7 m
  264. 1 h* n$ f3 `7 \6 A2 G% R
  265.         delay_us(2);        //延时
    ' h5 Z) n. A% C5 U0 k0 `
  266. : N5 a9 @* G$ e' P  z6 N
  267.     }6 R7 d, G% B& `) d  {. j
  268. : X5 w, c* b* e: {8 [# W
  269.     return dat;% W+ |; {8 j+ ^/ }. N

  270. 4 z. d+ @5 e0 }/ m- e' |0 S
  271. }4 y! g, [" ^  u% r$ s+ I
  272. * S: s' }" Y* D

  273. ) p' U/ T8 W* O# g
  274. 1 k, O1 T/ i# g. F8 K$ M; `
  275. /***************************************************************; Y/ u$ t- ]; H6 C: Y
  276. ' J- C6 y- g9 h' o' o* `1 g7 N
  277. ** 功能:     向bh1750写入命令
    : }! u* T4 I  o+ K: t! D% V; s
  278. ) n7 r, ?% X0 C+ L! `0 u. J) h
  279. ** 参数:        无参数
    & x8 g# ], v% r) X# n  A6 K! o1 h

  280. 5 S( z7 p' G' O% d# S0 ]' k) A1 }
  281. ** 返回值:   无8 F, a& v$ `% @  A
  282. * r. C8 @; C' j) Z  j* Q) m  v
  283. ****************************************************************/: \0 n: ~/ I+ v1 _) K
  284. ; }3 U& K/ l+ p& O! S
  285. void Single_Write_BH1750(u8 REG_Address)4 a- U1 O! s1 L6 \# W
  286. ( Q) y+ _7 \8 y) W# ?4 t
  287. {) p( @( H2 O! x0 x; S5 s

  288. ( q* i1 h% F% X5 |/ A
  289.     BH1750_Start();                  //起始信号
    0 T( i) T# P" k+ R# c
  290. 7 v( C) i; |; J. t
  291.     BH1750_SendByte(SlaveAddress);   //发送设备地址+写信号
    & X/ Z7 Y! n# r: ^; B( {

  292. 5 u2 A6 [  z; s& O- j0 U
  293.     BH1750_SendByte(REG_Address);    //内部寄存器地址,1 L4 S: w0 Y/ K3 ?# |9 g
  294. - T7 }) T, `; ]- x, }
  295.     BH1750_Stop();                   //发送停止信号
    - \3 D- ]4 |! \& s6 ~1 F. R, D
  296. ' d7 W: r& D1 |! O3 V  e. F1 d' a
  297. }
      L& d- n% `+ v6 S- Y. c9 L

  298. 2 C+ i! P6 B4 O( o" b

  299. 3 A: x: e4 t$ u2 J

  300. 7 G( j: I5 u. @% n% }+ W1 @6 Y) U2 {' r
  301. /***************************************************************
    $ w& r9 y8 k' y$ y

  302.   E- g$ I3 p; W) u/ S3 U* K; ~
  303. ** 功能:     连续读出BH1750内部数据" r5 e  _' ^* r. f7 T$ z1 J
  304. " }% y  h' U* C8 t5 n
  305. ** 参数:        无参数
    8 t# Y  f6 v) P  S; y
  306. 7 j: U% L( L' R8 q
  307. ** 返回值:   无* [/ D# g; g2 {

  308. & @+ \6 ]- V, A" c3 E* D
  309. ****************************************************************/4 V: }: w* k& k  [2 o/ b) K
  310. ; E. p" v  c! ]* ^0 A6 r% X1 U
  311. void Multiple_Read_BH1750(void)
    # ~9 H: g3 z) b1 G
  312. 8 j  l' P& c% h! g0 v
  313. {   u8 i; $ Z! Z# U/ }, O. G) v5 T0 U

  314. . D: i# h" w) W+ J9 U/ W7 B8 P0 x
  315.     BH1750_Start();                          //起始信号
    4 a+ R! w4 \" C1 U8 ?. _
  316. $ y' s3 s5 O" q! Q4 ^# o
  317.     BH1750_SendByte(SlaveAddress+1);         //发送设备地址+读信号
    , j( r/ t' w/ h- `6 i+ P) W
  318. $ I, F5 |" C$ a+ z
  319.       
    ' T' P9 H! U3 L  K) C: i2 u
  320. ; R" `9 P$ ]  F9 O/ ~" v) n' I1 r* S
  321.        for (i=0; i<3; i++)                      //连续读取2个地址数据,存储中BUF& M8 R  s& I' S3 c  x

  322. . j1 C& @4 k$ e( n1 n! |1 _+ B
  323.     {
    % r$ I; Y  A6 }$ M4 o# `# h+ K

  324. 6 c+ C5 I8 |& p1 Q# F" ~* X' j
  325.         BUF[i] = BH1750_RecvByte();          //BUF[0]存储0x32地址中的数据
    1 k. P: `- T1 h: a3 l
  326. ; e& K( l6 i5 A7 a/ ]/ ~7 V9 t
  327.         if (i == 3)1 v$ y& q1 E8 z4 i% J) \
  328. 5 @$ c4 ?( |7 f+ U
  329.         {& P4 i  _$ o% l4 }3 P/ n

  330. . {% I& a" _9 T) Z: A
  331.            BH1750_SendACK(1);                //最后一个数据需要回NOACK
    * a( I# o0 ?( e/ ?

  332. + q- v" ]/ P5 [, {
  333.         }$ v* ^. p0 ^# w- Q) `) `

  334. , n# Y: S7 G6 y2 e2 E4 z% h/ ?
  335.         else
    ' t; T! [9 @" f  p
  336. & q) `6 R$ K1 w9 `: W# f4 Y
  337.         {            
    : a! k8 L& V# _% U8 _
  338. 2 p$ _" w5 g0 R
  339.           BH1750_SendACK(0);                //回应ACK6 u+ P3 w& S8 }' ~
  340. ) c# [  \  k: `
  341.        }$ a( L' T% Q5 i9 V; w$ X
  342. & t; ]# M7 f9 E% Z. _/ ]+ ?
  343.    }
    9 ^0 D  I5 J, j* G+ x* i: C7 |! d

  344. . G9 g4 Y( w8 h4 R
  345.     BH1750_Stop();                          //停止信号! h3 ]5 P  h! `' c! {0 \

  346. 3 h$ z1 g( g/ C0 |5 w! T4 ~: G
  347. //   delay_ms(150);
    # X" d4 U8 C, N3 f. n. z5 O( }: o

  348. , N9 c1 ?3 [' J2 U
  349. }
    6 ^% ~/ f2 d6 _$ R( \

  350. & }' L5 `' N6 r4 x: _* L$ ?
  351. / f! n* N5 d6 H% K/ S7 g0 K' J
  352. / b2 |5 i) c* G# f
  353. /***************************************************************" z" |8 X9 o7 w  \

  354. ) b. k  r! f: C$ |
  355. ** 功能:     初始化BH1750
    ) N0 p; Y3 ?/ s6 [; P; p$ w
  356. ! ^8 s/ @7 A9 J8 ]" M5 |8 l, J5 f
  357. ** 参数:        无参数% G4 q' v, V* W! N& @) C; O
  358. # Q% t, O5 _1 F" O# Q$ z1 y
  359. ** 返回值:   无( W% B! x% J  _' I9 }

  360. , E0 D- p# }8 `" a$ ^
  361. ****************************************************************/
    ( p8 Y2 P6 U1 [( w- w% e

  362. ! X4 q# X$ V+ c* q
  363. void BH1750_Configure(void)
    : b) |4 E0 |, F& v6 P
  364. ; C: p5 a; x( Q) X0 Y) w
  365. {5 A4 g* m! \5 I/ d! S  p/ n9 g( b1 c

  366. $ L3 e, q% h: @# O4 D) A' y- ^
  367.    BH1750_PortInit();
    2 Y+ P8 u( H, Y' L) d/ u1 |

  368. 1 w* q" g9 d/ L
  369.    Single_Write_BH1750(0x01); * r: M( o7 M7 a- i* o8 i* D
  370. 9 `; P7 `- Z  ^9 n7 E$ I
  371.    ADDR = 0;                                        //将ADDR位初始化拉低" Z8 i5 F) V- B- b: O7 a9 E" n

  372. 0 g" n7 C9 N6 A$ j
  373. }% y: q: e8 _& H5 ?
  374. ) G1 X/ K: z+ c, u
  375. ) i2 p7 z3 Y1 U! K& F5 u1 E, m
  376. % {3 g$ K1 m9 S0 j
  377. /***************************************************************
    " w" H* s5 k& o  _. L, l

  378. ( |' N4 D7 T' V$ }2 X& B- K
  379. ** 功能:     读取光照度
    2 s( |- _+ p4 H0 f# s9 U
  380.   R0 |% I; U5 x. {# V. d
  381. ** 参数:        无参数; W9 j+ m' Z( G% g. P8 x  `. x

  382. 1 ^8 T( \# @. V0 _. E& W! [3 d5 R4 b
  383. ** 返回值:   data:返回光照度值* B( Y6 I3 f. W' T  ?- a

  384. 2 Q. e0 A  C( |5 B2 ]# J! _8 T- ?0 Y
  385. ****************************************************************/2 [+ c5 R! Z% z  _$ c; o

  386. * v1 Z! L# F9 ?6 O4 _
  387. uint16_t Get_Bh_Value(void)3 C3 J' m; Z3 p0 D2 O* D6 k  g
  388. ! V9 C" p) q* O$ h2 S$ u. K5 A. E
  389. { 1 T1 o% n$ W6 I- i! `: l

  390. / ~( ~6 j' D& e& C/ h$ t
  391.        static float temp;; x. _9 T) T& ]6 [$ a- F

  392. / M' c% B3 v; Q. x' t
  393. //     u16 data;
    . U8 q/ N! B* U* t% V% c

  394. ( u$ s: I2 A. d5 I" [
  395.        int dis_data ;* k7 V: e6 |+ R/ P

  396. % o- W% Q9 q5 H9 f
  397.     Single_Write_BH1750(0x01);   // power on& Q8 V) \3 c2 m  I1 j( ^  m# b5 }2 u
  398. % |/ r8 c! c6 Q4 V" W; P
  399.     Single_Write_BH1750(0x10);   // H- resolution mode
    - I' @, z- q+ d& d' U
  400. 3 P9 y  O; s; S4 I/ I
  401. //    delay_ms(200);              //延时200ms  z3 I7 F' o5 b& W  k6 V

  402. 4 E% c) C7 I$ {& j) e1 T
  403.     Multiple_Read_BH1750();       //连续读出数据,存储在BUF中
    / X+ O& v9 G7 `  z

  404. ' x: t% I2 y4 P9 T; F2 w& c5 {
  405.     dis_data=BUF[0];# ?% N' }# p8 F( O# j! [6 o
  406. 5 c9 i: u' ]/ ?  V
  407.     dis_data=(dis_data<<8)+BUF[1];//合成数据,即光照数据
      i! `  y# j: ]6 ^* z

  408. $ ]( p) b( |+ }+ U9 q( D" I
  409.     temp=(float)dis_data/1.2;
      W7 ~% N- `8 J
  410. ' K3 P% q- s$ O( N* Q
  411.        Light_Value =(int)temp;' j8 C# e* z& q, J

  412. ! f$ u+ u# m, j4 B$ t
  413.     return Light_Value;      
    9 m; ]+ F# C% Q! I. m" s' `
  414. / C( U4 x) q0 q$ S% _+ p
  415. }
复制代码
$ F6 ^! I3 ?( f7 G
上面是所有代码,我们只需要在主函数终循环。Get_Bh_Value(void);就行。
6.png
我们这里就是使用的简单模式H-resolution mode,没有用其模式2,模式二可以更改采样时间,从而提高精度。感兴趣可以自己去看下,就是比较靠后的就是模式二的用法。
7.png
当手机手电筒放到其光窗上可以测到最大54612。还没有到65535。
8.jpg
同样使用的是昨天的板子。

- H8 C. H! ~' I1 d# d' H
收藏 评论2 发布时间:2021-6-8 20:49

举报

2个回答
STMCU-管管 回答时间:2021-6-9 09:42:48
用的什么STM32的板子可以介绍一下
4 w9 l  _" S" i/ M* M8 V+ f
liuxingkeji 回答时间:2021-6-9 10:57:02
STMCU-管管 发表于 2021-6-9 09:42, o0 B3 R) t+ w" G) s
用的什么STM32的板子可以介绍一下

, k& R  f3 G7 [7 U' P: h用的是自制的STM32F103VET6开发板
, v9 ~, F2 `: Q9 U& q: z

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版