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

【年中粉丝节】+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"
      \% w1 J1 P2 g% O, J+ h2 i
  2. , J0 x) B9 c$ X" o" p# O& P
  3. #include "delay.h"
    2 R8 D3 P  j6 Y6 \+ t! }% G, w0 j- C
  4. 0 a1 j7 O  a2 B) Z+ C, z! v
  5. #include "bh1750.h"" n7 i1 o/ D2 ?9 L/ l1 w/ J$ h# c
  6. 5 ?  o$ A/ Z2 i6 n& p4 {

  7. 9 ^+ d5 R! r& u

  8. 1 C6 i4 O* \5 a+ _

  9. % e' l, L3 ~4 r8 w4 N3 z
  10. 2 @4 J) I  S# X9 S( T
  11. #define   SlaveAddress   0x46 //定义器件在IIC总线中的从地址,根据ALT  ADDRESS地址引脚不同修改
    - j3 [+ `( {- s  ~& ^* w2 x
  12. 5 `( E& D) V1 a0 ], H
  13. uint8_t  BUF[4];                  //接收数据缓存区6 W% ?7 ]6 R' ~
  14. 2 m$ g% ?- Q5 W+ j4 J; A
  15. extern uint16_t Light_Value;& v  R, c; G! v) A

  16. * A8 S% Z# s; h
  17. //uint16_t Light_Value;' ?1 ?' @( Y2 a$ c1 Y- N

  18. . W# A! I( v( D* U4 N& V' j

  19. & _9 E6 K( N% Q/ [) E- w( g
  20. 0 c# ^+ [- c: [
  21. void BH1750_PortInit()
    9 w- j  E' _1 U: m
  22. 3 ]# P8 J1 R! @' V4 C
  23. {     * r7 E8 c; j9 T6 T, n

  24. 5 v0 ^" X" w3 B0 C, i( U$ C
  25.        GPIO_InitTypeDef GPIO_InitStructure;8 D! T% g: _. y& D# w+ C
  26. & z3 |! p, o6 c! X" P: t, y

  27. ; U& g% _* l# F+ G  A
  28. + c! j5 V$ g* f7 @$ M; t1 v
  29.        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC,ENABLE);
    & r% ?7 \1 Q4 @# h: o, r! d
  30.   P; U5 _2 c+ B* [( N1 m& S
  31.       
    $ x" T) J1 X& i( D) E$ j

  32. 8 J2 R8 I! i9 J" @
  33.        //PB6-SCL PB7-SDA PB12-ADDR, p8 g) ^- c+ e0 y# u6 T. k% |5 U4 I
  34. 1 V7 g) L4 f, J1 E) S/ j; y; S: Y
  35.        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;' S! P) `) F, u) G: C% A
  36. . P8 k: ~4 z/ \0 |
  37.        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;   //推挽输出5 u8 ^8 _3 P9 t
  38. 8 F0 ~. ~1 Y' H; o( o+ ?- g/ I. A
  39.        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    ! r2 ~. @% @" e0 h
  40. 9 C0 N9 W+ l" \+ L0 A  o& j
  41.        GPIO_Init(GPIOB, &GPIO_InitStructure);
    5 b+ y8 p- [& l3 O
  42. 0 L5 Z$ t& I& r( [
  43.        GPIO_SetBits(GPIOB,GPIO_Pin_6|GPIO_Pin_7); //PB6,PB7 输出高8 F* c& P9 Q, b; q2 d

  44. $ R3 C/ x' r9 J. z; j( z( g. e
  45.       7 Z0 @3 \. m1 `7 V2 _

  46. 8 w1 g/ ]1 F1 u; A- b, ~9 ]3 _( c; E
  47.        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //PB.14 PB.12: S" w0 U, z6 ~2 V' @
  48. 2 R5 `  g+ t* U- C4 F1 {1 J$ Y. V
  49.        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    2 }' x9 J& x, U- s- M  z5 h* F

  50. 0 H1 i! T: A  z( D
  51.        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  //复用推挽输出# |8 G( i4 Q" O0 o0 y

  52. 0 \4 |$ x8 A% K& V7 S" _+ o1 B
  53.        GPIO_Init(GPIOC, &GPIO_InitStructure);
    ) A: g# \& w" r, r& Y; H! H
  54. & _$ k) |2 i; P
  55.             
    6 I% s3 f$ s- |+ V: n- w
  56. % N$ g7 v1 r# g0 w( Q: D
  57. }
    4 N; I% O1 k: N8 ?1 {* D* M* f

  58. $ g6 m3 ]( k; X" U* a
  59. 8 n3 ?( g! Q# w; L

  60. ; i* F$ Y  n+ u) o% u& y# k+ O
  61. ) c2 |' w, D! k2 f) p

  62. ! c9 E2 z3 t6 R9 f: I0 q% [
  63. /***************************************************************
    0 S+ z+ v7 X! I; s3 D+ L
  64. ( Z- k9 n1 Q) h! C2 A8 ]- k/ x
  65. ** 功能:     产生IIC起始信号
    6 ]+ B, Y7 r) z

  66. ! e5 N$ b, v, `. e$ D9 R
  67. ** 参数:        无参数# V( V/ V* U' c% x  W; d, a

  68. 0 N8 H% V3 R* h, j3 W. J1 |
  69. ** 返回值:    无
    + i' L5 G& n. W: d, ], o
  70. - s# N9 y9 I4 N$ x
  71. ****************************************************************/) n9 `8 o" ~  F2 S, q6 A

  72. 2 K# c" [5 ]( [) E
  73. void BH1750_Start()
    - D8 @6 q8 F$ ]  s

  74. & t2 F$ X$ g  D9 c/ t* B2 M6 j
  75. {
    - i! u# K- \( H- {6 @

  76. ' m: n) ^8 q; q7 V, _
  77.     SDA_OUT();     //sda线输出, l4 p' V  r3 r5 T  @8 z* ]

  78. 7 }) n% k) w9 M: h
  79.        IIC_SDA=1;             / P8 T( q5 K: _, b* Q, v
  80. - m( X' x% o2 O
  81.        IIC_SCL=1;( J8 v4 b  O" g3 Z

  82. 1 Z( Z( o4 O7 {8 a
  83.        delay_us(4);
    ; t9 Q3 {1 \; _

  84. ! v! z9 z! T- O' {
  85.       IIC_SDA=0;//START:when CLK is high,DATA change form high to low& Z6 V- W: S; e; {& r* D% F. z
  86. % R  x4 A! f( V  C+ E* g) _
  87.        delay_us(4);
    2 N. g: Q; m" H1 z" }9 D. w* w* m
  88. 6 |. v9 B/ O. L, S( |2 B
  89.        IIC_SCL=0;//钳住I2C总线,准备发送或接收数据5 ?  `* z% @! c+ a8 a! ~5 h

  90. 2 }+ I5 U( T( u" g$ g  Q* _
  91. }
    / X/ v% a* i! D: p1 `

  92. ) `* j9 e+ \$ \+ Y. `
  93. /***************************************************************1 L) X1 j" a5 u! \! z) ?- |& D6 G
  94.   I' @3 E4 ~9 n& g. n
  95. ** 功能:     产生IIC停止信号
    . m. J! I6 a* @' \; x/ ^* Q
  96. ! [. C- g1 ]: e/ ]7 b) G( m
  97. ** 参数:        无参数
    - [2 ~  e' q% K" _9 G5 d- ^

  98. 6 L  o3 L4 h& _6 ]; B3 A) m
  99. ** 返回值:    无- k: c" n. {2 f; G) R1 K, U1 M

  100. * c5 o  C! S: ?( q9 G
  101. ****************************************************************/
    & z: w/ P1 P# l" y& K( m
  102. 9 t  R3 a% m: X$ C1 O
  103. void BH1750_Stop()* D$ k* |$ [( S. T5 @5 g
  104. - `- O% l2 Q. S
  105. {
    5 x: m/ o5 W9 r5 K
  106. 2 |4 I* _0 d4 o: ]/ T3 O
  107.        SDA_OUT();//sda线输出  [6 V$ C. w! y: g* T8 ], F) R

  108. ; L3 y5 u& H3 j+ M  g7 H. y" o) U
  109.        IIC_SDA=0;//STOP:when CLK is high DATA change form low to high- v0 x! W+ a, _7 D
  110. , a1 y4 ]5 c* w7 {* n/ v/ z
  111.        IIC_SCL=1;
    3 h4 ~3 i3 z/ L/ r9 Q
  112. 0 K+ a7 \( F7 J- l' y
  113.       delay_us(4);
    1 O+ M1 R" f- D; |- n

  114. 5 [! }7 a: p. p
  115.        IIC_SDA=1;//发送I2C总线结束信号
    ) [% d- ^7 f! i0 D2 @% B& |5 N) X
  116. 2 I0 v+ @1 N- s: R' z* C% ~- g1 [
  117.        delay_us(4);
    6 n! U' Y" [* ^; ]

  118. 2 r1 H/ L: U" t; ^
  119. }
    " f& A- h" M, c8 x& r* r% F1 G* _) o3 g
  120. 3 M- J2 U8 R; ~" W# }( g( a
  121. /***************************************************************
    $ E3 N7 u% f  l' b
  122. # o6 J) C; f; K" r
  123. ** 功能:     产生IIC应答信号
    0 j0 U3 S3 b4 A  a) X- b

  124. ; q% W0 F9 f; f( x
  125. ** 参数:        无参数
    . R1 b2 z+ l# m+ r% G% U9 D3 T

  126. " _0 V6 L  \. \* s2 |1 n
  127. ** 返回值:    无
    3 h; m8 T4 B7 t, t
  128. 8 g/ Y" w, X1 n2 t/ m
  129. ****************************************************************/* F3 s  a; n" m& J

  130. ( s& ~" Y; T! q" n' J
  131. void BH1750_SendACK(u8 ack)' f2 U- W2 m# p. O3 n" w# l
  132. ) U4 q$ `, E$ |' y
  133. {$ a0 j4 x% c& v

  134. , R- c3 j* ]  D! v
  135.     SDA_OUT();          //sda线输出9 K+ z0 h1 m9 n
  136.   [# O7 T& L" F. R) V4 b0 W! X/ n: r9 H
  137.        if(ack)IIC_SDA=1;   //写应答信号
    ! S  i3 _9 s: B
  138. ( P( Z+ s9 u0 e( B8 b9 K
  139.        else IIC_SDA=0;         
    " R' \2 P! g7 l& e

  140. # O5 l$ m$ \3 P% x4 C
  141.     IIC_SCL=1;          //拉高时钟线
    * y0 C+ f9 J7 x4 I& k8 H9 x" I

  142. : Z: F6 B5 d, |' L' q& i. M
  143.     delay_us(2);        //延时8 q7 h# u* f3 `1 V& \# S1 S+ F
  144. # R# H* T4 Q8 [; V
  145.     IIC_SCL=0;          //拉低时钟线9 k! ]; \7 I0 N* |: o, m" N5 _

  146. 0 P8 p# {4 [9 X; N# \! Z6 d
  147.     delay_us(2);        //延时9 B8 B% ]6 g8 d$ h) ^
  148. 9 U; }4 q- q! W% D* |* x6 Z
  149. }
    0 T0 E2 p9 {! w" K3 x# [
  150. 7 W, Y; p4 I9 e' b5 u2 |7 b9 q9 U

  151. ! d) c4 s  O' t3 j1 U7 K- e

  152. 3 e2 @9 t" M: p+ b- f+ m
  153. /***************************************************************
    $ c# |5 O8 q' m+ W, j$ c0 S
  154. 2 C8 H, m% y* F1 i% B* T, Q! c% f; `
  155. ** 功能:     产生IIC接收信号
    5 T7 M2 j) [) Y* @7 e

  156. $ K" s8 y  U1 h, O$ T) ]
  157. ** 参数:        无参数, K( H4 ]- V8 r! U8 U3 U! n) P1 \  Z6 R

  158. - z1 Q. }$ C7 ?" D- k
  159. ** 返回值:    无3 U. l5 q  x3 q0 K; t. v
  160. 5 C" A. F5 E' [, T7 B9 M' C9 ?8 q
  161. ****************************************************************/0 {2 m; g- {6 U& b0 I6 {
  162. 3 l$ q: P. \! t: ?9 m% d
  163. u8 BH1750_RecvACK()" I9 V# b8 g/ J! r' K
  164. 9 s2 I2 Y+ ~; x! `
  165. {
    % H+ V, P2 f4 R7 t: O7 [6 H
  166. ; M$ J' G1 G/ }6 i9 i
  167.     u8 data;
    # e0 f, {% n  E/ s- i! ^9 l$ a
  168. $ n) b! H8 {+ @) g% o9 e' o
  169.          SDA_IN();         //SDA设置为输入! n& e8 D: n) J3 b  z

  170. 4 {9 l+ e$ z  m4 ?# e+ e: j
  171.     IIC_SCL=1;        //拉高时钟线) g4 E3 H, C0 O
  172. % I% }9 H8 B  c7 w" [
  173.     delay_us(2);      //延时$ \  `& r8 Z2 j. j* i. Q9 b8 R

  174. 0 K% P4 J" f' a5 y$ K% w8 t$ t
  175.     data = READ_SDA;  //读应答信号/ `7 F) r: ]/ {% L$ m5 E
  176. ) U+ r: ]( Y5 K, Z9 L
  177.     IIC_SCL=0;        //拉低时钟线, L0 {8 @! c0 v$ l

  178. ' E0 r  L- H/ Z6 \
  179.     delay_us(2);      //延时- O- _& v( P# m) h$ \- d
  180. ) F5 ^& t4 b8 [$ o5 {
  181.     return data;  h- R' \. f9 {8 Z8 c2 r
  182. 6 u9 ?# G$ x# @7 W3 f  \
  183. }* S5 t2 u' C5 c2 \
  184. # B! ~9 Q/ a2 N8 q
  185. /***************************************************************
    3 }* w3 r* @# V* J
  186. 0 ~5 x6 S- _; s$ e
  187. ** 功能:     向IIC总线发送一个字节数据- l8 F' D6 n% S, b; K  t! \2 B
  188. ' O% Z- m- u8 K/ G5 {  g) g
  189. ** 参数:        dat:一字节数据
    ) G$ j$ E& c( I, R" z) y! X4 d
  190. + Q8 I6 k0 q& x8 J
  191. ** 返回值:    无
    " }$ O3 s: c2 {- R/ Q4 c
  192. " i% k3 p4 S2 Y2 I
  193. ****************************************************************/3 }* }5 K9 g2 i9 b$ [1 n
  194. % N5 D# d' {) B. F/ Q! Y
  195. void BH1750_SendByte(u8 dat)" p: V6 |4 f) D1 `; O

  196. # u% d! n' O0 M& L% _/ u- X3 u
  197. {
    3 w5 D' q) W! _- q! ]$ J
  198. * M3 m' }; h% ^$ @# D, H, N
  199.     u8 i,bit;
    ) `  F5 q( U1 g! j! X$ O; u* @$ f

  200. # C9 z" _5 f" W4 R# H
  201.        SDA_OUT();               //sda线输出1 D! N/ `. a; \
  202. " E% M9 u- c/ ^( F0 _
  203.     for (i=0; i<8; i++)      //8位计数器
    $ A6 D% ~/ Q' r  T( S" y6 \

  204. * t; U; f7 h$ F" B7 N& z) Y
  205.     {
    3 M- q1 `3 g- s6 n8 l8 E

  206. 7 O/ u' b* |' E3 x- ?- ~: P# T+ w
  207.            bit=dat&0x80;' W2 Z& \. d( ~2 c
  208. * i/ @; K4 e" |6 i: |9 j
  209.               if(bit) IIC_SDA=1;) p+ P2 [7 G, L2 d- [7 H7 w2 _
  210. ! K: G7 x& `1 `  u8 G, @
  211.               else IIC_SDA=0;& d+ t! A  c2 J3 ^3 O# V1 J

  212. 7 ^9 F6 K: s8 U% V" E0 {! J
  213.         dat <<= 1;           //移出数据的最高位
    0 e3 J( O: b6 f; z* j/ Q
  214. ' Z; O$ B* a0 u$ e2 @0 ?- D8 s
  215.         IIC_SCL=1;           //拉高时钟线
    : v: \9 r6 b* l- Q; Q7 `% S

  216. 0 @7 p4 i+ ]% |- Q( b+ v7 N+ h
  217.         delay_us(2);         //延时
    " S+ H. e9 q- c+ B, x6 y4 G
  218. * f0 m( F+ \- x) z1 h
  219.         IIC_SCL=0;           //拉低时钟线8 k4 y& a7 y2 Y' j8 A/ _

  220. / v  H, }+ u+ n. u; q
  221.         delay_us(2);         //延时
    & P3 }# n! A# |( R& R2 z& `
  222. 9 o: k# [$ x' v
  223.     }
    6 y- ^5 I; b8 k4 |- R7 p) C6 S

  224. ' ~, |( L# z" P% v
  225.     BH1750_RecvACK();. i8 C7 H) M' {/ c

  226. 1 X2 X8 U: m7 o% z
  227. }/ L' ^" l" _! W5 @- e- S' d
  228. + M, o7 J; e. E$ v" E+ r) m/ n
  229. /***************************************************************) L; ?/ k# |& i2 y% x# m: p; U

  230. " M) V2 z' p6 {3 ?+ U
  231. ** 功能:     从IIC总线接收一个字节数据3 C. a& K$ l7 |2 t/ M) [
  232. ! Y- t1 K) q: M6 T; H6 o- o* M
  233. ** 参数:        无参数: {: H0 a8 m) L! ?/ G

  234. 8 i! e9 p' v. ~
  235. ** 返回值:   dat:接收一字节数据- x! W7 ]$ J  b$ G
  236. + o' J  P# y+ k
  237. ****************************************************************/
    ) F1 }) y- a2 \2 ?' s/ V

  238. ; v/ Q* v* |1 o& W7 O
  239. u8 BH1750_RecvByte()
    + w  @9 ?1 _0 M4 i

  240. # g, c0 r; b) `& `7 r2 B
  241. {
    $ G" y3 J9 J6 Z0 ?: m  r

  242. 8 m& V( @- y5 O8 c
  243.     u8 i;
    7 p. l- U/ g1 v/ I" K3 I/ Q' |

  244. 5 `2 l. a1 |; x7 p- _) A7 m( N
  245.     u8 dat = 0;5 Y4 J, t. `' y8 Y% F

  246. + W& @# s* Y/ d$ }7 U1 k% J$ C2 y
  247.        SDA_IN();               //SDA设置为输入/ n: K( z! j7 ]! I. \6 O: s+ \3 Z0 N

  248. 3 ~* a' z4 D9 ^1 ]; l
  249.     IIC_SDA=1;              //使能内部上拉,准备读取数据,
    9 c7 u3 n" G9 N  W; U+ F
  250. 6 K; s  P4 j5 _/ x, S; `- w/ B
  251.     for (i=0; i<8; i++)     //8位计数器
    & w% @% z  l2 {1 g3 J* f4 x

  252. ! B9 U, n; n" ?5 O- A  p3 m' @
  253.     {
    / i1 P6 G+ Z  e6 ]2 w) ?% j8 T
  254. . ^2 M- _' F" G
  255.         dat <<= 1;
    # ]# [, M9 f& x5 M4 c1 `5 `
  256. 1 O' k# n' Z6 R) ?3 a
  257.         IIC_SCL=1;          //拉高时钟线
    ' |: j: u* W- H$ u
  258. * f5 g* V0 v8 G* K6 x
  259.         delay_us(2);        //延时
    # U4 A! Y, g& j9 e7 [' {6 c
  260. , f* |$ u, V1 m2 v, U" y; f$ H2 M
  261.               if(READ_SDA) dat+=1;              2 r! R2 |% v( x3 W+ b* n
  262. ; I4 p/ r' u1 Z: y) s: T: b
  263.         IIC_SCL=0;          //拉低时钟线
    0 C0 h( }2 E/ D8 j" D

  264. . _7 m( x1 g% E2 T$ Y
  265.         delay_us(2);        //延时- j- e9 P+ Z5 m4 g% A( |( R8 s5 a

  266. 1 v+ v* A, I# e0 S; N
  267.     }
    # q9 `" X6 v6 w& L) z7 H4 n; ?

  268. 3 P8 g0 ~0 _* O* `7 K
  269.     return dat;2 x, S7 }5 Z) `4 [3 g/ \2 f! E

  270. + ?% C4 _; \1 P0 K# F
  271. }
    ' l2 z$ O9 g. Q! _# k! z7 ^& u6 n3 k5 I; H

  272. 5 _3 o( W/ C2 t# [
  273. " o% e8 a1 I" \3 Z  T

  274. % J* n' w. ^# k  v
  275. /***************************************************************
    ' x4 K- U3 E& E5 K3 A

  276. # f6 z+ s( l& y1 F/ H- z5 V
  277. ** 功能:     向bh1750写入命令
    9 N7 D; a, H7 }1 Y: k) l/ O6 s; p& T
  278. * C0 A) D  ]3 J% F4 h
  279. ** 参数:        无参数
    : d: {+ L" g9 W' d2 d/ h8 u

  280. 4 \, Y9 f$ p/ {3 j- X9 I
  281. ** 返回值:   无/ `& {9 `6 s( U0 c4 J+ f, A

  282. " v. q4 _4 h. D6 Y: u1 @% z; y
  283. ****************************************************************/
      }0 A2 l. @2 @5 y5 z4 P
  284. 3 ^- U, {4 m' E0 G" t; a
  285. void Single_Write_BH1750(u8 REG_Address)4 N/ d5 N8 j! \6 ~' |6 G

  286. / U, Y3 Q0 |' d+ Y
  287. {
    - o7 g# h. ^( ?

  288. " M  @1 Q' b' n* |4 o3 P
  289.     BH1750_Start();                  //起始信号
    ' t, P+ C% R9 ?0 U$ e- u- t

  290. 1 Y3 G9 S2 K1 M) w% X# q
  291.     BH1750_SendByte(SlaveAddress);   //发送设备地址+写信号( E/ q% w+ f1 B1 B

  292. 5 ~! x- i# a) U, Q' @' _
  293.     BH1750_SendByte(REG_Address);    //内部寄存器地址," G5 o, b: y/ s" b

  294. # ~, ]& a) }3 H* c/ C
  295.     BH1750_Stop();                   //发送停止信号
    7 c: @: g/ L* }) r

  296. , v& |; Y: P$ d; ]
  297. }
    $ F/ ^, V' B9 Q6 x" z
  298. 4 x, J; b% n& M1 }: p: @7 b  C
  299. " t5 U. r) I0 t
  300. 0 ]5 Y; X5 s) Z; Z7 q  p
  301. /***************************************************************7 l- y% ?; d  j
  302. 0 q$ _$ d  S) C' ?
  303. ** 功能:     连续读出BH1750内部数据
    % K0 t1 q% C+ R. e
  304. . G  a6 U( V2 c& y( ^$ t6 V; t: e: n) N
  305. ** 参数:        无参数6 i7 x. K# H5 @8 _) F
  306. ! z& a1 N' i2 T: e  O' K
  307. ** 返回值:   无( |, {) F' S3 L& K
  308. ! D8 L% O  ]- J8 J1 L7 ^
  309. ****************************************************************/
    3 \. t+ J0 Y  Z" S8 r' r
  310. ( P4 z: c- w% K* z3 R5 D" F
  311. void Multiple_Read_BH1750(void)' K; t! H1 |5 p9 Z
  312. / K5 y0 T1 p- a8 R
  313. {   u8 i;
    . a0 i& I$ K2 z/ B

  314. ( W* R- D+ ~0 e+ d/ V
  315.     BH1750_Start();                          //起始信号( c  w! z  L5 o+ G1 [4 Q
  316. % S" ^( T  U8 R% F6 H) _* w% ]
  317.     BH1750_SendByte(SlaveAddress+1);         //发送设备地址+读信号
    0 ?0 g8 R: t. i; y* {. K* f

  318. 0 T- |2 i/ i" E, V3 A
  319.       
    % `4 T' o, y, j9 M6 U- N& ]

  320. " B7 \5 M0 V' v1 s( T$ s0 L& d
  321.        for (i=0; i<3; i++)                      //连续读取2个地址数据,存储中BUF3 }' {8 N- f: v( W; x
  322. . P, m5 a/ C  O1 d" p. E) E
  323.     {" n: k( ]4 n# O0 t# z& K% w' V
  324. & R8 l9 S. K0 A' D" J) u
  325.         BUF[i] = BH1750_RecvByte();          //BUF[0]存储0x32地址中的数据
    $ W7 A" O( s4 I7 S5 {
  326. 5 Y, }8 I: ?! x' Z3 {5 w& S3 I
  327.         if (i == 3)
    * m# Z! Z8 j8 e2 m- H

  328. ! C% E7 {. t8 m
  329.         {" L6 W/ Z* @1 p4 ?

  330. + N/ I6 G) z- z3 M) v: k0 F
  331.            BH1750_SendACK(1);                //最后一个数据需要回NOACK
    % ]/ v0 j: `6 ]: p* B% t: g
  332. & F$ }6 t0 @+ x
  333.         }$ a- j, A8 F2 ?' }% {. C
  334. : ]$ a  A4 C1 ~6 q# L% ^9 J
  335.         else
    * Y5 J2 J8 i. N/ R% U+ j3 d3 j6 O8 `
  336. ; c' y! j6 z* k- ~
  337.         {            . n8 R- N2 q$ f! }" Q+ N  J6 d

  338. ) m' R# d$ D  X7 h7 b" t
  339.           BH1750_SendACK(0);                //回应ACK) P9 R* W+ L* v: [5 F+ q

  340. * j2 Y! B* h( k7 _
  341.        }. v6 n* P2 \" P/ h4 _3 g7 v- C

  342. 3 e0 x5 G9 x1 N( ]" P, a" `
  343.    }5 E" l# g' K( r. c* l. y  `

  344. 0 {& i: h  O6 O: E: h
  345.     BH1750_Stop();                          //停止信号
    . E& B/ d/ X# a( u; E' W  a
  346. : n1 \! ?! x0 g
  347. //   delay_ms(150);
    4 |, s' _% @3 }9 X
  348. ; q. L' E; W8 M$ S
  349. }/ @* O# O6 @8 m  n0 e4 W# r
  350. 6 s  `  e/ c/ N+ t  o, W2 G% C

  351. $ l0 _% J& x8 X, `$ d
  352. 3 b2 I% ~0 c. B& a2 ~2 Z) l$ e
  353. /***************************************************************/ Z' T; o0 t* C& m1 h. q

  354. 7 i5 V: _# r- c( X9 H% ]
  355. ** 功能:     初始化BH1750. p" C* g6 C0 s. `+ \
  356. 6 N# Z5 R& e; z4 @" E" W
  357. ** 参数:        无参数
    & D# g8 ~1 B4 [* B# C# \9 l
  358. 3 M4 d3 Y5 \4 Y& q9 r
  359. ** 返回值:   无, N3 W8 r/ l; g, H$ z. v

  360. & x1 X" o; }8 O- T5 v3 L
  361. ****************************************************************/
    6 ~2 ~  G- m6 O: Q/ m  T3 r

  362. & s3 U* ^, W0 S) [! z( E
  363. void BH1750_Configure(void)2 L% W/ N1 w2 |% I  h; ^

  364. 5 g  y. I3 E' W; p; k
  365. {/ O! ~4 w' e7 j9 N1 n! L

  366. ! g$ K7 M& L' h& A: S8 `* e
  367.    BH1750_PortInit();2 t) d0 l5 b( E! x4 w
  368. 2 u$ u" ^- S0 L/ X5 O
  369.    Single_Write_BH1750(0x01);
    4 p% w  V% O7 _" P) [( ]0 F; H
  370. 3 [, O/ {# ]" }6 I/ r" [# O
  371.    ADDR = 0;                                        //将ADDR位初始化拉低% _4 r9 [7 X, j( y+ V8 f  \
  372. % H0 e9 S! a7 [1 x
  373. }
    0 x! y: A# j* V, H
  374. ( K# H2 E' [4 q& n2 t

  375. 4 V& G, V5 |3 W$ K6 p
  376. % d# L0 F- y" n2 @6 U' |1 C
  377. /***************************************************************2 e7 X( k% U2 A- T. w* V+ [
  378. 4 p8 o# V( u! k  T1 e
  379. ** 功能:     读取光照度
    3 ~$ t$ K" B: V* W

  380. - k4 y! Y6 ]* K6 y- M
  381. ** 参数:        无参数
    : I5 U* X. A2 X2 f* p
  382. ' H$ q2 w5 o; `" @9 c
  383. ** 返回值:   data:返回光照度值* G$ N7 P+ F3 o9 C3 w# T
  384.   z3 ^, [: @8 ~( T3 ~
  385. ****************************************************************/: G, {  b6 @0 k3 l9 T) i6 g- }6 V

  386. - i8 A$ B% X/ V" _# X& U
  387. uint16_t Get_Bh_Value(void)
    4 Z' Z4 h9 B7 L; l
  388. * J5 d- E' Y! {8 d' X
  389. { ' |$ q3 t. r. Y& q5 N; y5 y' j* U
  390. , |2 ?* t; v: v& I/ o
  391.        static float temp;, g2 q7 O8 k7 \1 |: N' Q
  392. + W2 I: y1 k, m2 y/ O2 U" a
  393. //     u16 data;  g+ v; P; k, p! M9 P6 n. `; `
  394. ( @) q9 {4 C1 U3 Z6 r6 l+ q9 Z# \
  395.        int dis_data ;
      C( u( q3 E8 x" n8 @" L/ H0 _
  396. * z3 w3 s; }$ a. Z$ Q4 W
  397.     Single_Write_BH1750(0x01);   // power on
    # ^* _4 V7 X/ H# Y# z  _

  398. 6 |4 b1 o! ]: x/ s
  399.     Single_Write_BH1750(0x10);   // H- resolution mode+ w/ d; [6 o; ~0 Z+ H, _
  400. $ D6 o% J9 c* h/ O6 N
  401. //    delay_ms(200);              //延时200ms
    " J, h6 @$ I% @/ w

  402. ! Y9 u/ i; V4 u. h+ f% U0 S' f
  403.     Multiple_Read_BH1750();       //连续读出数据,存储在BUF中
    # P. d1 ^8 L& }6 z7 e2 ~$ t
  404. - c3 |' w2 r/ D% t# r
  405.     dis_data=BUF[0];" Z- W1 q( Y" |5 g( y  b' f' g! ~

  406. ' n- L4 [9 ~) a* G5 P) P/ y+ d
  407.     dis_data=(dis_data<<8)+BUF[1];//合成数据,即光照数据' F' {; A7 Z- V* U: A

  408. 6 R$ c$ f1 ]4 I& O1 Z' `
  409.     temp=(float)dis_data/1.2;; P5 }# u% h8 L, Q( v7 _& Q
  410. 5 V$ N2 Q2 s  N5 S! d
  411.        Light_Value =(int)temp;9 B" b, V* G9 E6 E

  412. 1 L  |; }" a* y5 F+ ]" `& d
  413.     return Light_Value;      
    5 F+ D1 ]9 d- B2 C: |% X

  414. 0 ^5 E# T8 G8 P) L) Q
  415. }
复制代码

! v  Z1 ]/ b: y; E1 J) J
上面是所有代码,我们只需要在主函数终循环。Get_Bh_Value(void);就行。
6.png
我们这里就是使用的简单模式H-resolution mode,没有用其模式2,模式二可以更改采样时间,从而提高精度。感兴趣可以自己去看下,就是比较靠后的就是模式二的用法。
7.png
当手机手电筒放到其光窗上可以测到最大54612。还没有到65535。
8.jpg
同样使用的是昨天的板子。

; P# u# D1 f  G0 f+ S% |4 o# k3 f
赞 收藏 评论2 发布时间:2021-6-8 20:49

举报

2个回答
STMCU-管管 回答时间:2021-6-9 09:42:48
用的什么STM32的板子可以介绍一下" K5 T4 W) X" B" Y
liuxingkeji 回答时间:2021-6-9 10:57:02
STMCU-管管 发表于 2021-6-9 09:424 x" Q- e; E/ _0 G
用的什么STM32的板子可以介绍一下

, T! `0 ~8 i/ Z5 R' v用的是自制的STM32F103VET6开发板# G0 M; M1 ]5 p+ c

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版